2008-08-05 14 views
18

Wenn Sie eine SQL-Abfrage ausführen, müssen Sie Ihre Zeichenfolgen bereinigen oder Benutzer können böswilliges SQL auf Ihrer Website ausführen.Was muss ich beim Senden einer Abfrage umgehen?

Ich habe in der Regel nur eine Funktion escape_string (bla), die:

  • Ersetzt entkommt (\) mit Doppel entkommt (\\).
  • Ersetzt einfache Anführungszeichen (') durch ein gestrichenes einfaches Anführungszeichen (\').

Ist das ausreichend? Gibt es ein Loch in meinem Code? Gibt es eine Bibliothek, die das für mich schnell und zuverlässig macht?

Ich würde gerne anmutig Lösungen in Perl, Java und PHP sehen.

+0

etwas muss in der Anzeige der Schrägstriche schief gelaufen, in der Zeile 'Ersetzt entkommt() mit Doppel entkommt (\).' – bart

Antwort

0

Welche Sprache verwenden? Es scheint so, als ob alle von ihnen eingebaute SQL-Escape-Funktionen hätten, die besser zu verwenden wären.

Zum Beispiel hat PHP mysql_real_escape_string und addslashes.

2

Ich würde auch entkommen Kommentare (Doppelstrich)

-- 
0

Du bist besser dran vorbereitete Anweisungen mit Platzhalter verwenden. Verwenden Sie PHP, .NET ... so oder so, vorbereitete Anweisungen bieten mehr Sicherheit, aber ich könnte ein Beispiel liefern.

-1

Ich bin nicht sicher, ob MySql parametrisierte Abfragen unterstützt, wenn ja, sollten Sie sich bemühen, diese Route zu gehen. Dies stellt sicher, dass die Benutzereingaben nichts böswilliges tun können.

Sonst wären einige "schlechte" Zeichen zusätzlich zu dem, was Sie erwähnten, Semikolon (;) und Kommentare (- und/* * /).

0

In PHP, ich verwende diesen und ich werde jeden Kommentar über es zu schätzen wissen:

function quote_smart($valeur) 
{ 
    if (get_magic_quotes_gpc()) 
     $valeur = stripslashes($valeur); 

    if (!is_numeric($valeur)) 
     $valeur = mysql_real_escape_string($valeur); 

    return $valeur; 
} 


$IdS = quote_smart($_POST['theID']); 
$sql = " 
SELECT * FROM Students 
WHERE IdStudent={$IdS}; 
"; 

braucht eine weitere Überprüfung, ob ein Feld NULL sein kann:

$picture = NULL; 
$theidyouwant = 7; 
$Name = 'WOOD'; 


if(is_null($picture)) 
    $p = 'NULL'; 
else 
    $p = "'".quote_smart($picture)."'"; 

$IdS = quote_smart($theidyouwant); 

$requete = "SELECT * FROM Students 
    WHERE IdStudent={$IdS} AND 
    PictureStudent={$p} AND 
    NameStudent='{$Name}'; 
    "; 

Das ist es genießen ! (hoffe, der Beitrag wird korrekt Unterstriche und nicht senden & # 95;)

1

Eine großartige Sache in PHP zu verwenden ist die PDO. Es erfordert viel Rätselraten, sich mit der Sicherung Ihres SQL (und all Ihrer SQL-Sachen im Allgemeinen) zu beschäftigen. Es unterstützt vorbereitete Anweisungen, die SQL Injection Attacks weitestgehend vereiteln.

Ein guter Primer für PDO ist in dem Buch The PHP Anthology 101 Essential Tips, Tricks & Hacks by Davey Shafik etc. 2nd Ed enthalten. Macht das Lernen zu einem Kinderspiel und eignet sich hervorragend als Referenz. Ich muss nicht einmal an etwas anderes als die eigentliche SQL-Abfrage denken.

0

Verwendung zubereitet/parametrisierte Abfragen!

0

die MySQL-C-API hat es mysql_escape_string() eigene ist. Es zu verwenden oder es ist das Äquivalent wäre am besten.

0

Vorbereitete Anweisungen verwenden.

0

In MySQL-Abfrage, wenn LIKE verwenden, auch sicherstellen, dass die „_“ Zeichen zu entkommen, da sie nicht durch mysql_real_escape_string entgangen ist.

Als Referenz überprüfen here

Verwandte Themen