首頁 >後端開發 >php教程 >在 LIMIT 子句中使用「bindValue」時如何避免 SQL 注入?

在 LIMIT 子句中使用「bindValue」時如何避免 SQL 注入?

Barbara Streisand
Barbara Streisand原創
2024-12-18 22:48:11129瀏覽

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

在LIMIT 子句中使用BindValue 時如何防止SQL 注入

嘗試使用bindValue 方法參數化LIMIT 子句來執行SQL 查詢時,PHP PDO 可能會加入變數值用單引號引起來。此行為可能會導致SQL 語法錯誤,如所提供的程式碼片段中所觀察到的:

$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);

錯誤訊息「您的SQL 語法中有錯誤」可能是由添加到:skip 中的單引號引起的LIMIT 子句中的變數。

據信此行為與 2008 年報告的 PDO 中長期存在的錯誤有關: https://bugs.php.net/bug.php?id=44639

解決方案:

依照回應中的建議,在傳遞先前將值轉換為整數將它們傳遞給bindValue方法解決了這個問題:

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

透過將$_GET['skip']變數轉換為整數在綁定之前使用(int) ,我們可以防止 PDO 新增單引號並確保 SQL 查詢正確執行。

以上是在 LIMIT 子句中使用「bindValue」時如何避免 SQL 注入?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn