Rumah >pembangunan bahagian belakang >tutorial php >Bagaimana untuk Mengelakkan Suntikan SQL Apabila Menggunakan `bindValue` dalam Klausa LIMIT?

Bagaimana untuk Mengelakkan Suntikan SQL Apabila Menggunakan `bindValue` dalam Klausa LIMIT?

Barbara Streisand
Barbara Streisandasal
2024-12-18 22:48:11131semak imbas

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

Cara Mencegah Suntikan SQL Apabila Menggunakan BindValue dalam Klausa LIMIT

Apabila cuba melaksanakan pertanyaan SQL menggunakan kaedah bindValue untuk parametrize klausa LIMIT, PHP PDO boleh menambah petikan tunggal kepada nilai pembolehubah. Tingkah laku ini boleh membawa kepada ralat sintaks SQL seperti yang diperhatikan dalam coretan kod yang disediakan:

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

Mesej ralat "Anda mempunyai ralat dalam sintaks SQL anda" mungkin disebabkan oleh petikan tunggal yang ditambahkan pada :skip pembolehubah dalam klausa LIMIT.

Adalah dipercayai bahawa tingkah laku ini berkaitan dengan pepijat yang telah lama wujud dalam PDO yang dilaporkan pada tahun 2008: https://bugs.php.net/bug.php?id=44639

Penyelesaian:

Seperti yang dicadangkan dalam respons, menghantar nilai kepada integer sebelum lulus mereka kepada kaedah bindValue menyelesaikan isu ini:

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

Dengan menukar Pembolehubah $_GET['skip'] kepada integer menggunakan (int) sebelum mengikat, kami menghalang PDO daripada menambah petikan tunggal dan memastikan pertanyaan SQL dilaksanakan dengan betul.

Atas ialah kandungan terperinci Bagaimana untuk Mengelakkan Suntikan SQL Apabila Menggunakan `bindValue` dalam Klausa LIMIT?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn