ホームページ >バックエンド開発 >PHPチュートリアル >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 サイトの他の関連記事を参照してください。