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: |