haha ja eigenlijk half jaar met twee sites hoor, alleen deze is ovegebleven. Maarjah ik probeer alles (vooral php) in de puntjes uit twe werken.... alleen die verotte XSS varbaarheid van mijn site is erg jammer...quote:Op vrijdag 28 december 2007 16:22 schreef Buschetta het volgende:
[..]
Half jaar ??!? wtf...
In ieder geval succes ermee.
1 |
quote:http://ha.ckers.org/xss
Deze moet je er zowiezo allemaal uitfilteren Verder een paar handige PHP functies die je daarvoor kunt (moet) gebruiken:
htmlentities() http://nl3.php.net/manual/en/function.htmlentities.php
htmlspecialchars() http://nl3.php.net/manual/en/function.htmlspecialchars.php
urlencode() http://nl3.php.net/manual/en/function.urlencode.php
strip_tags() http://nl3.php.net/manual/en/function.strip-tags.php
mysql_real_escape_string() http://nl3.php.net/manual(...)al-escape-string.php
quote:Op zaterdag 29 december 2007 10:37 schreef Tarabass het volgende:
Kan iemand een voorbeeld posten van hoe je veilig data ophaalt uit een mysql-database, en hoe je de formdata er veilig instopt? Dus met alle afhandelingen erbij?
1 2 3 4 5 6 7 8 9 10 11 | // halen $query = 'select veld from tabel'; $result = mysql_query($query); $veld = mysql_result($result,0,'veld'); $veld_safe = htmlspecialchars($veld,ENT_QUOTES); // brengen $query = 'insert into tabel (`veld`) VALUES ("'.mysql_real_escape_string($_POST['value']).'");'; $result = mysql_query($query); ?> |
mysql_real_escape_string is een andere manier voor addslashes.quote:Op zaterdag 29 december 2007 10:58 schreef Tarabass het volgende:
[..]
En addslashes en stripslashes hoef je dan niet te gebruiken?
Die vermijd ik zoveel mogelijk. Levert alleen maar inconsistentie op.quote:Op zaterdag 29 december 2007 10:58 schreef Tarabass het volgende:
[..]
En addslashes en stripslashes hoef je dan niet te gebruiken?
Dit deed ik altijd bij het ophalen:quote:Op zaterdag 29 december 2007 11:01 schreef Slarioux het volgende:
[..]
Die vermijd ik zoveel mogelijk. Levert alleen maar inconsistentie op.
1 2 3 4 5 6 | while($record = mysql_fetch_object($query)) { $naam = htmlspecialchars($record->naam); $naam = addslashes($naam); } } |
Of gebruik PDO met geparameteriseerde query'squote:
1 2 3 | $stm->execute(array('value' => 'foo')); $items = $stm->fetchAll(PDO::FETCH_ASSOC); |
Als je dat doet heb je blijkbaar geen idee waar je mee bezig bentquote:Op zaterdag 29 december 2007 11:18 schreef Tarabass het volgende:
[..]
Dit deed ik altijd bij het ophalen:
[ code verwijderd ]
Bij insert deed ik eigenlijk niets. Iig bedankt voor die uitleg!
Leg het dan even uit? Ik vraag gvd om uitleg toch?quote:Op zaterdag 29 december 2007 12:46 schreef SuperRembo het volgende:
Als je dat doet heb je blijkbaar geen idee waar je mee bezig bent
Het gaat juist om het inserten, of eigenlijk om de query. Je moet afvangen dat je iets doet als:quote:Op zaterdag 29 december 2007 12:55 schreef Tarabass het volgende:
[..]
Leg het dan even uit? Ik vraag gvd om uitleg toch?
1 |
1 2 3 4 5 6 7 8 | my $userinput = $cgi->param('userinput'); my $dbh = DBI->connect; my $sth = $dbh->prepare("select foo from bar where foobar = ?;"); $sth->execute($userinput) or die $sth->errstr; while (my $row = $sth->fetchrow_hashref()) { .... } |
quote:Op zaterdag 29 december 2007 12:55 schreef Tarabass het volgende:
[..]
Leg het dan even uit? Ik vraag gvd om uitleg toch?
1 |
Voor mij gaat dat via mijn SQL klasse, die is ook makkelijk om zelf te maken maar om veiligheidsredenen zal ik nooit code van mijn SQL en Security klassen plaatsen, just to be surequote:Op zaterdag 29 december 2007 13:19 schreef Farenji het volgende:
[..]
Het gaat juist om het inserten, of eigenlijk om de query. Je moet afvangen dat je iets doet als:
[ code verwijderd ]
En dat die $blaat dan uit een invoerveldje komt die zomaar ongecontroleerd in de query geplempt wordt. Wat gebeurt er dan als iemand invult "1 or 1"? Of nog erger: "1; drop table dbtable;" invult in het formulierveld? Juist!
Daar moet je dus filteren!! De data die uit je db komt is wat dat betreft veilig, die voer je niet uit, behalve als je de data weer in nieuwe queries gebruikt. Als je de data alleen gebruikt hoef je alleen te zorgen dat het geen problemen oplevert met speciale html karakters of quotes etc. Wel kan er bijv javascript inzitten en daar moet je dan weer voor uitkijken als je het op een html pagina plempt. Dat is waarschijnlijk ook het probleem van TS, al is dat meestal een minder ernstig probleem dan sql injection (meestal blijft de schade zeer beperkt).
Een fatsoenlijke taal gebruikt voor de beveiliging van sql injection overigens placeholders waardoor het allemaal automatisch gaat. Deze worden automatisch gequote en kunnen dus geen kwaad, wat je ook invult. Bijv in perl:
[ code verwijderd ]
Het vraagteken wordt vervangen met de gequote inhoud van $userinput. Dit is 100% sql injection proof. Misschien heeft php ook wel een plugin voor zoiets maar standaard kan het niet dacht ik.
1 2 3 4 5 6 7 8 9 10 11 12 | $obj_SQL->prepare( 'SELECT * FROM `tbl`.`name` WHERE `id` = [id]' ); $obj_SQL->set( 'id', $obj_Secure->int_check( $_GET[ 'id' ] ) ); $obj_SQL->execute(); if( $obj_SQL->numRows() !== 0 ) { //loopen } ?> |
Forum Opties | |
---|---|
Forumhop: | |
Hop naar: |