2011-01-16 15 views
0

Hey alle, habe ich eine Textbox, die Sachen Eingabeautocompletes aus einer Datenbank, indem sie und es funktioniert nun wie folgt aus:Wie schützt man diesen Code vor SQL-Injektion?

<script type="text/javascript"> 
$().ready(function() { 
    $("#food").autocomplete("get_course_list.php", { 
     width: 260, 
     cacheLength: 10, 
     matchContains: false, 

     //mustMatch: true, 
     //minChars: 0, 
     //multiple: true, 
     //highlight: false, 
     //multipleSeparator: ",", 
     selectFirst: true 

    }); 
}); 
</script> 

und dies in der Php-Datei:

<?php 
require_once "config2.php"; 
$q = strtolower($_GET["q"]); 
if (!$q) return; 

$sql = "select DISTINCT voedsel as voed from voedingswaarden where voedsel LIKE '%$q%'"; 
$rsd = mysql_query($sql); 
while($rs = mysql_fetch_array($rsd)) { 
    $cname = $rs['voed']; 
    echo "$cname\n"; 
} 
?> 

Aber ich jetzt lese über sql injections etc, also wollte ich mein PHP-Skript davor mit mysql_real_escape_string() schützen; aber ich kann es nicht zur Arbeit bringen. Irgendwelche Ideen, wie man das in meiner .php Datei implementiert und ob das genug Schutz ist?

+0

'aber ich kann nicht scheinen es zu arbeiten.' - wie hast du es versucht? –

+0

Ich habe versucht, etwas wie $ q = strtolower ($ _ GET ["q"]); und dann $ q2 = mysql_real_escape_string ('$ q') und dann $ q2 im Rest des Codes verwenden. Aber dann würde die Autocomplete-Funktion nicht mehr funktionieren. – Javaaaa

+0

Ich glaube, Sie haben gerade vergessen, den Variablennamen von $ q zu $ ​​q2 zu ändern. Es war zwar unnötig, eine andere Variable zu erfinden. Eins reicht. Jedenfalls ist es nur ein Mangel an Aufmerksamkeit, kein Wissen. –

Antwort

1
$q = strtolower($_GET["q"]); 

wird

$q = mysql_real_escape_string(strtolower($_GET["q"])); 

Ihre Verbindung zum db hergestellt werden muss, und es muss nur eine Verbindung sein, aber das ist der Fall, sonst wird Ihr mysql_query würde nicht richtig funktionieren.

der Code ist nicht sehr elegant, aber es wird funktionieren.

Sie können das ändern wollen:

if (!$q) return; 

zu

if (strlen($q) == 0) return; 
+0

danke, das funktioniert wie ein Charme! über den letzten Teil, ist das: zuerst überprüft es, ob es überhaupt eine Zeichenfolge gibt, und die zweite Überprüfung von dort ist eine Zeichenfolge mit der Länge 0? Warum genau ist der letzte besser? (Ich versuche zu lernen :)) und b.t.w ist das genug Schutz gegen SQL-Injektionen gerade jetzt? – Javaaaa

+0

@Javaaaa es ist genug für diesen Code, aber es wird woanders fehlschlagen. –

+0

was meinst du mit woanders genau? – Javaaaa

0

Ich habe das vorhin gesagt, aber ich denke mysql_real_escape_string() depecrated werden sollte und Sie sollten PDO stattdessen verwenden.

„PDO - PHP Data Objects - ist eine Datenbank-Zugriffsschicht eine einheitliche Methode des Zugriff auf mehr Datenbanken bieten.“

PDO die neue, verbesserte Art und Weise ist zu Ihrer Datenbank zu sprechen. PDO hat vorbereitete Anweisungen, die schneller Ihre Website machen/sicherer, weil:

Eine vorbereitete Anweisung eine vorkompilierte SQL-Anweisung ist, die mehrere Male durch das Senden nur die Daten an den Server ausgeführt werden kann. Er hat den zusätzlichen Vorteil , dass die in den Platzhaltern verwendeten Daten automatisch von SQL Injection-Angriffen auf abgesichert werden.

+0

es kann nicht Ihre Website schneller obwohl –

+0

Ich bin (fast) sicher, es macht Ihre Website schneller, weil die Abfragen vorkompiliert sind! – Alfred

Verwandte Themen