ホームページ >バックエンド開発 >PHPチュートリアル >LIMIT 句で「bindValue」を使用するときに SQL インジェクションを回避するにはどうすればよいですか?

LIMIT 句で「bindValue」を使用するときに SQL インジェクションを回避するにはどうすればよいですか?

Barbara Streisand
Barbara Streisandオリジナル
2024-12-18 22:48:11131ブラウズ

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 に一重引用符が追加されていることが原因である可能性があります。

この動作は、2008 年に報告された PDO の長年のバグに関連していると考えられています。 https://bugs.php.net/bug.php?id=44639

解決策:

応答で提案されているように、渡す前に値を整数にキャストしますこの問題は、

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

$_GET['skip'] を変換することで解決されます。バインド前に (int) を使用して変数を整数に変換すると、PDO が一重引用符を追加するのを防ぎ、SQL クエリが正しく実行されるようにします。

以上がLIMIT 句で「bindValue」を使用するときに SQL インジェクションを回避するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。