Heim >Backend-Entwicklung >PHP-Tutorial >Wie vermeide ich SQL-Injection bei Verwendung von „bindValue' in einer LIMIT-Klausel?

Wie vermeide ich SQL-Injection bei Verwendung von „bindValue' in einer LIMIT-Klausel?

Barbara Streisand
Barbara StreisandOriginal
2024-12-18 22:48:11131Durchsuche

How to Avoid SQL Injection When Using `bindValue` in a LIMIT Clause?

So verhindern Sie SQL-Injection bei Verwendung von BindValue in der LIMIT-Klausel

Beim Versuch, eine SQL-Abfrage mit der bindValue-Methode auszuführen, um die LIMIT-Klausel zu parametrisieren, kann PHP PDO hinzufügen einfache Anführungszeichen für die Variablenwerte. Dieses Verhalten kann zu SQL-Syntaxfehlern führen, wie im bereitgestellten Code-Snippet beobachtet:

$fetchPictures->prepare("SELECT * 
    FROM pictures 
    WHERE album = :albumId 
    ORDER BY id ASC 
    LIMIT :skip, :max");

$fetchPictures->bindValue(':albumId', $_GET['albumid'], PDO::PARAM_INT);

if(isset($_GET['skip'])) {
    $fetchPictures->bindValue(':skip', trim($_GET['skip']), PDO::PARAM_INT);    
} else {
    $fetchPictures->bindValue(':skip', 0, PDO::PARAM_INT);  
}

$fetchPictures->bindValue(':max', $max, PDO::PARAM_INT);
$fetchPictures->execute() or die(print_r($fetchPictures->errorInfo()));
$pictures = $fetchPictures->fetchAll(PDO::FETCH_ASSOC);

Die Fehlermeldung „Sie haben einen Fehler in Ihrer SQL-Syntax“ wird wahrscheinlich dadurch verursacht, dass einfache Anführungszeichen zum :skip hinzugefügt werden Variable in der LIMIT-Klausel.

Es wird angenommen, dass dieses Verhalten mit einem seit langem bestehenden Fehler in PDO zusammenhängt, der 2008 gemeldet wurde: https://bugs.php.net/bug.php?id=44639

Lösung:

Wie in der Antwort vorgeschlagen, werden die Werte vor der Übergabe in Ganzzahlen umgewandelt Sie an die bindValue-Methode zu übergeben, löst dieses Problem:

$fetchPictures->bindValue(':skip', (int) trim($_GET['skip']), PDO::PARAM_INT);

Durch Konvertieren der Variablen $_GET['skip'] in eine Ganzzahl Durch die Verwendung von (int) vor der Bindung verhindern wir, dass PDO einfache Anführungszeichen hinzufügt, und stellen sicher, dass die SQL-Abfrage korrekt ausgeführt wird.

Das obige ist der detaillierte Inhalt vonWie vermeide ich SQL-Injection bei Verwendung von „bindValue' in einer LIMIT-Klausel?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn