beveiligd of onnodige tijdverspilling?

Status
Niet open voor verdere reacties.

gebruiker78

Gebruiker
Lid geworden
29 jun 2010
Berichten
428
Hallo,
ik heb dit stukje code om te checken of iemand wel is ingelogd en met welke browser en al die dingen zodat het heel lastig is als hacker dat te faken:
PHP:
if(isset($_SESSION['sid'])&&isset($_SESSION['id'])&&isset($_SESSION['browser'])&&isset($_SESSION['coding'])&&isset($_SESSION['encoding'])&&isset($_SESSION['language'])&&isset($_SESSION['sp'])&&$_SESSION['browser']== $_SERVER['HTTP_USER_AGENT']&&$_SESSION['coding']== $_SERVER['HTTP_ACCEPT']&&$_SESSION['encoding']== $_SERVER['HTTP_ACCEPT_ENCODING']&&$_SESSION['language']== $_SERVER['HTTP_ACCEPT_LANGUAGE']&&$_SESSION['sp']==sha1(md5(($_SERVER['REMOTE_ADDR'])))&&$id=$_SESSION['id']){
include("../security/dbconnect.php");
$scc = mysql_query("SELECT id FROM usersonline WHERE id='".mysql_real_escape_string( $id )."' and browser='".mysql_real_escape_string( $_SERVER['HTTP_USER_AGENT'] )."' and coding='".mysql_real_escape_string( $_SERVER['HTTP_ACCEPT'] )."' and encoding='".mysql_real_escape_string( $_SERVER['HTTP_ACCEPT_ENCODING'] )."' and langauge='".mysql_real_escape_string( $_SERVER['HTTP_ACCEPT_LANGUAGE'] )."' and sp='".mysql_real_escape_string( sha1(md5(($_SERVER['REMOTE_ADDR']))) )."'");
$scccount = mysql_num_rows($scc);
if($scccount==1){
$querychange = mysql_query("
UPDATE usersonline
SET online='" . mysql_real_escape_string( date("y/m/d : H:i:s", time())  ) . "'
WHERE id='".mysql_real_escape_string($id)."'
LIMIT 1
");

maar om dit op elke pagina te doen is dat misschien tijdverspilling? of denken jullie dat dit best wel een handige beveiliging is?

eigenlijk wou ik eerst steeds de sessions met elkaar vergelijken maar ik wou ook nog een optie op mijn site dat je kan zien of iemand online is. dus ik dacht waarom check je dan ook niet gelijk of de gebruiker wel echt is.

dus wat denken jullie?
 
mysql_real_escape_string($id) gebruik je twee maal het is een zwaardere functie dus je vangt het best op een een variable en gebruikt die var nadien weer.
 
Bekijk onderstaande code en merk op dat hieronder veel gebeurt nu als je het zelfde doet heb je maar één session variable voor alle info van je vissitor dus alle kennis zit in je object dan kan je elke voorwaarde in je object stoppen en vraag je
isvissitor() en je weet wat je moet weten zonder meer kennis nodig te hebben.
PHP:
 <?php
 /**
 * @author Lieven Roegiers
 * @copyright 2010 
 * @CMS autosite
 * opensource http://code.google.com/p/autosite/
 */

function setsessionvisitor($visitor){
	$_SESSION['visitor']=serialize($visitor);
}
function getsessionvisitor(){
	return(isset($_SESSION['visitor']))?unserialize($_SESSION['visitor']):null;
}
class Visitor {
    private $brower;
	private $remoteip;
	private $enabled;
	private $isheajack;
	function Visitor(){
		session_start();
	}
	//<<<<<<<<<<<<<<<<<<<<<<<FUNCTIONS>>>>>>>>>>>>>>>>>>>>>>>>>
	private function isRemoteip(){
		if($this->remoteip === $_SERVER['REMOTE_ADDR']){
			return true;
		}else{
			@session_unset();
			return false;
		}
	}
	//<<<<<<<<<<<<<<<<<<<<<<<Setters>>>>>>>>>>>>>>>>>>>>>>>>>

	private function setRemoteip(){
		$this->remoteip = $_SERVER['REMOTE_ADDR'];
	}
    public function setBrowser($browername){
		$this->brower= $browername;
	}
    public function setLanguage($langname){
		$this->lang= $langname;
	}

	private function __toprintsession(){
		print_r($_SESSION);
	}
	//<<<<<<<<<<<<<<<<<<<<<<<Getters>>>>>>>>>>>>>>>>>>>>>>>>>
    public function getBrowser(){
		return $this->brower;
	}
    public function getLanguage(){
		return $this->lang;
	}    
}
?>
 
hallo bedankt voor je script (mag ik het uiteindelijk voor mijn site gebruiken?)
maar ik gebruik zelf weinig public/private functions enzo en daarom snap ik een beetje weinig van je script.
waar kan ik uiteindelijk al die gegevens krijgen echo (wat moet ik echo'en?)
 
Kan op zich geen kwaad waarschijnlijk om dat allemaal te controleren, maar of het nodig is, is een tweede...

Als je het teveel vindt om overal in te tikken moet je het in een aparte include zetten, dan hoef je het ook maar 1x aan te passen als je het ergens veranderd.
 
Ik kijk eerst nog wel wat die andere zegt, het probleem is niet om het over tetypen ik kopieer het wel in een include maar meer de zorg of dit onnodig laadtijd van de site is
 
Tenzij je een miljoen bezoekers per dag hebt merk je hier echt niks van. Laadtijd van de site mag je je zorgen om gaan maken als ie zichtbaar trager wordt. Webservers hebben veel meer rekenkracht dan jij denkt als je bang bent dat een paar if-jes merkbaar gaan zijn.
 
Oke,

niet al te nodig maar het uiteindelijke doel is wel miljoen gebruikers wat zou dan handig zijn?
 
De code is GNU dus zoeken op internet commercieel gebruikt worden maar niet met winstoogmerk op het script self daarom ook de copyright het blijf ten allen tijde mijn eigendom(louter ter bescherming van eigen code)

verder kan je de aanroep stel user er zo uitzien

PHP:
$user= new User($username,$userpath,$kkey);//off
$user->setUser($username,$userpath,$kkey);

if($user->login($pass,$resline[2],$resline[3])){//login ok
      $user->getinfo();//kan als die bestaat
}
jij zal dan ongeveer zoiets doen
PHP:
$visitor= new Visitor();
$visitor->set...

maar deze vergelijkin kan er inzitten en kan je dan bijgevolg op elke plaats op je site gaan oproepen en je hoeft ze maar op een plaats aan te passen
Merk je programmeersnelheid op en de server hoeft hierdoor minder vergelijking te doen en is ook sneller

zie die vergelijking
PHP:
if(isset($_SESSION['sid'])&&
isset($_SESSION['id'])&&
isset($_SESSION['browser'])&&
isset($_SESSION['coding'])&&
isset($_SESSION['encoding'])&&
isset($_SESSION['language'])&&
isset($_SESSION['sp'])&&
$_SESSION['browser']== $_SERVER['HTTP_USER_AGENT']&&
$_SESSION['coding']== $_SERVER['HTTP_ACCEPT']&&
$_SESSION['encoding']== $_SERVER['HTTP_ACCEPT_ENCODING']&&
$_SESSION['language']== $_SERVER['HTTP_ACCEPT_LANGUAGE']&&
$_SESSION['sp']==sha1(md5(($_SERVER['REMOTE_ADDR'])))&&
$id=$_SESSION['id']){
word dat bvb
PHP:
if($visitor->iscanview()){

}
Stel dat je enkel een constuctor hebt met bepaalde data kan je geen object maken zonder die data dus moet je niet kijken of deze isset want die is er gewoon
bijgevolg moet je wel kijken of de sessionvariable visitor er is
 
@davidb52; dingen zoals http_accept* en remote_addr kunnen verschillen per request, niet bepaald om je sessie hierop te locken dus.

Je code zal wat korter en overzichtelijker kunnen.

Wanneer je het veilig wil hebben en je begint met een nieuw project, probeer dit dan niet met de verouderde mysql_* functies te doen.
 
niet al te nodig maar het uiteindelijke doel is wel miljoen gebruikers wat zou dan handig zijn?

Goed leren programmeren lijkt me een begin, als je dit soort dingen uitgelegd moet krijgen ga je nog een hele lang weg te gaan hebben voor je iets kunt maken dat een miljoen gebruikers support.
 
@davidb52; dingen zoals http_accept* en remote_addr kunnen verschillen per request, niet bepaald om je sessie hierop te locken dus.

Je code zal wat korter en overzichtelijker kunnen.

Wanneer je het veilig wil hebben en je begint met een nieuw project, probeer dit dan niet met de verouderde mysql_* functies te doen.

Kunt u u verklaring onderleggen met een concreet voorbeeld en waar zit de onveiligheid dan. dit is een voorbeeld van hoe beveiligen http://gathering.tweakers.net/forum/list_messages/741013
 
Laatst bewerkt:
Kunt u u verklaring onderleggen met een concreet voorbeeld en waar zit de onveiligheid dan. dit is een voorbeeld van hoe beveiligen http://gathering.tweakers.net/forum/list_messages/741013
Ik ga niet zo'n post lezen, is uit 2003 en zie al paar keer de term md5 voorbij komen.

Persoonlijk vind ik deze tips meer geschikt. (al zijn ze zeer basic)


Mijn voorkeur richting pdo ligt hem o.a. in de portability en het feit dat het oo is.
Met prepared queries zijn de query en de waarden mooi gescheiden, maakt het wat overzichtelijker (maakt al die extra escape code overbodig)
En je hebt geen kans dat je per ongeluk een waarde vergeet te escapen of juist dubbel escaped.

PDO is ook veiliger dan bijv. mysql omdat met mysql de kans bestaat dat de php charset anders is dan die van mysql. Dit zorgt ervoor dat niet alle benodigde characters escaped zullen worden met de mysql_* escape functies.
De mysqli escape functies zijn echt charset aware (je moet de $link meegeven).
En met echte prepared queries hoef je niks te escapen omdat de DB het apart binnenkrijgt.
Door dit laatste is PDO ook sneller bij het herhalen van meerdere dezelfde queries (met andere waarden).
 
Hallo,
ik heb dit stukje code om te checken of iemand wel is ingelogd en met welke browser en al die dingen zodat het heel lastig is als hacker dat te faken

Dit is altijd te 'faken' er zijn genoeg plug-ins/programma's waar je dit mee kunt omleiden.

Grtz,
~Jeroen
 
Status
Niet open voor verdere reacties.

Nieuwste berichten

Terug
Bovenaan Onderaan