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 } ?> |
Thx!quote: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.
Als je je code "om veiligheidsredenen" niet durft te tonen dan kan het nooit secure code zijn.quote:Op zaterdag 29 december 2007 13:24 schreef colourAgga het volgende:
[..]
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 sure
[ code verwijderd ]
Je moet weten wat encoding/escaping is en waar het nodig is. En je moet het ook alleen gebruiken waar het nodig is, en niet gewoon maar overal toepassen onder het mom van "ik gebruik alles, dat zit het goede er ook wel tussen".quote:Op zaterdag 29 december 2007 12:55 schreef Tarabass het volgende:
[..]
Leg het dan even uit? Ik vraag gvd om uitleg toch?
mysql_real_escape_string() it isquote:Op zaterdag 29 december 2007 13:37 schreef SuperRembo het volgende:
Als je in een MySQL statement een letterlijke string wil gebruiken, dan staat die tussen twee 'enkele quotes'. Als je in die string een enkele quote wil gebruiken dan moet je er voor zorgen dat die ' niet wordt verward met de ' die het eind van de string aan geeft. Dat doe je door er een backslash voor te zetten, of je laat het php doen met mysql_real_escape_string() (of addslashes() ). mysql_real_escape_string() en addslashes() gebruik je dus alleen als je een string in een mysql string wilt zetten.
htmlentities() it isquote:In html hebben <, > en & een speciale betekenis. Als je een kleiner dan teken < in een html pagina wil laten zien, dan moet je voorkomen dat dat teken wordt gezien alt het begin van een html tag. Je gebruikt daarom >, of je laat het door php doen met htmlentities(). Je gebruikt htmlentities() dus alleen als je tekst in een html pagina wil zetten.
Die PDO gaat mij wat te snel, al ziet het er wel heel bruikbaar uit. Liever zou ik het eerst gecontroleerd willen doen door functies als is_int() etc..quote:Verder moet je natuurlijk alle invoer van de gebruiker controleren (is de userid uit de querystring wel echt een integer?). En dat geldt niet alleen voor gegevens die je naar je database stuurt.
Een handige manier om het gedoe met encoding van strings in sql te voorkomen, is door gebruik te maken van geparameteriseerde query's. Dat kan meel makkelijk met behulp van PDO.
1 2 3 | $getal = (int)$iets; ?> |
Dat had ik gezien ja. Vandaar de vraag of ik dat dus in if-statements moest gebruiken zoals ze dat veel doen in de functies eronder. Maar nu snap ik hoe ik ze moet gebruiken, want op php.net draaien ze imo soms helemaal door (natuurlijk goed maarja) waardoor je al gauw zoiets hebt van "waar hebben ze het over". Dit gaan we even testen en uitproberenquote:Op zaterdag 29 december 2007 15:30 schreef HuHu het volgende:
Als je eens naar php.net gaat, dan wordt je al veel wijzer. Zie bijvoorbeeld deze pagina: http://nl2.php.net/is_int
Links zie je in het menu nog veel meer is_ functies staan.
Ik ga er zelf nooit vanuit dat mijn code 100% zeker is, dat is de redenquote:Op zaterdag 29 december 2007 13:30 schreef Farenji het volgende:
[..]
Als je je code "om veiligheidsredenen" niet durft te tonen dan kan het nooit secure code zijn.
Lijkt me *juist* reden om de code aan anderen te laten zien.quote:Op zaterdag 29 december 2007 20:43 schreef colourAgga het volgende:
[..]
Ik ga er zelf nooit vanuit dat mijn code 100% zeker is, dat is de reden
Je hoeft ook niet de comments te lezen, gewoon de documentatie is al genoeg. Binnen een if moet een boolean staan, de is_ geven een boolean terug: dus ze mogen binnen een if.quote:Op zaterdag 29 december 2007 18:41 schreef Tarabass het volgende:
[..]
Dat had ik gezien ja. Vandaar de vraag of ik dat dus in if-statements moest gebruiken zoals ze dat veel doen in de functies eronder. Maar nu snap ik hoe ik ze moet gebruiken, want op php.net draaien ze imo soms helemaal door (natuurlijk goed maarja) waardoor je al gauw zoiets hebt van "waar hebben ze het over". Dit gaan we even testen en uitproberen
Dat is ook wel weer een puntquote:Op zaterdag 29 december 2007 21:05 schreef Farenji het volgende:
[..]
Lijkt me *juist* reden om de code aan anderen te laten zien.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 | CheckPostData($mysql_tbn); ?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <title>Perfect_Form</title> </head> <body> <div id="container"> <?php $sql_select = "SELECT ip, data, date FROM " . $mysql_tbn . " ORDER BY id DESC LIMIT 0,5"; $result = mysql_query($sql_select); $i = 0; echo "<table>"; while(($row = mysql_fetch_object($result)) !== false) { $ip = $row->ip; $ip = long2ip($ip); $data = $row->data; $data = htmlentities(stripslashes($data)); $date = $row->date; $i++; echo "<tr class=\"d".($i & 1)."\">"; echo "<td width='50%' align='left'>" . $ip . "</td>"; echo "<td align='right'><i>" . $date . "</i></td>"; echo "</tr>"; echo "<tr>"; echo "<td align='left' colspan='2'>" . $data; echo "<hr /></td>"; echo "</tr>"; } echo "</table>"; ?> <table> <form name="form" action="<?php $_SERVER['PHP_SELF'] ?>" method="POST"> <tr> <td> <textarea name="data" onClick="make_blank();">Hier je bericht.....</textarea> </td> </tr> <tr> <td align="right"> <input type="reset" value="Reset" /> <input type="submit" value="Submit" /> </td> </tr> </form> </table> </div> <!-- Close Connection --> <?php mysql_close($con); ?> </body> </html> <!-- Functions --> <?php function CheckPostData($mysql_tbn) { $ip = $_SERVER['REMOTE_ADDR']; $ip = ip2long($ip); $data = mysql_real_escape_string($_POST['data']); $date = date('y-m-j H:i:s'); if($data != "Hier je bericht.....") { if($data != "" && is_string($data)) { InsertQuery($mysql_tbn, $ip, $data, $date); } } } function InsertQuery($table, $ip, $data, $date) { $sql_insert = "INSERT INTO " . $table . " SET "; $sql_insert .= "id = ''"; $sql_insert .= ", ip = '" . $ip . "'"; $sql_insert .= ", data = '" . $data . "'"; $sql_insert .= ", date = '" . $date . "'"; $result = mysql_query($sql_insert); header("Location: " . $_SERVER['PHP_SELF']); //exit; } ?> |
Een vraagje: waar de fuck komt $mysql_tbn vandaan?quote:Op zondag 30 december 2007 16:25 schreef Tarabass het volgende:
Ik heb even wat gebouwd vanmiddag. Hopelijk wil iemand er even naar kijken en tips/commentaar geven. Hopelijk heeft iemand anders er dan ook nog wat aan:
[ code verwijderd ]
Voorbeeld
Boven de functieaanroep van CheckPostData() stonden mijn database-variablen. Die heb ik in verband met veiligheid even weggehaald. $mysql_tbn is dus gevuld met de tabel-naamquote:Op zondag 30 december 2007 17:43 schreef Farenji het volgende:
[..]
Een vraagje: waar de fuck komt $mysql_tbn vandaan?
quote:Op zondag 30 december 2007 19:12 schreef Tarabass het volgende:
Wie heeft "Hier je bericht....." erin gekregen dan?
Leg uit. Want ik vang wel af dat hij er niet in mag komen in principe. Heb zelfs de puntjes zitten tellenquote:
Forum Opties | |
---|---|
Forumhop: | |
Hop naar: |