以下是我的代码快照:

$fetchPictures = $PDO->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语法有错误;
检查对应的手册
您的mysql服务器版本
在“15”,15“附近使用的正确语法
第1行
似乎pdo正在sql代码的limit部分向我的变量添加单引号。我查了一下,发现了一个我认为与此相关的错误:
http://bugs.php.net/bug.php?id=44639
这就是我要看的吗?这个漏洞从2008年4月就被打开了!
同时我们该怎么办?
在发送sql语句之前,我需要建立一些分页,并确保数据是干净的、sql注入安全的。

最佳答案

我记得以前有过这个问题。在将值传递给bind函数之前,将其强制转换为整数。我想这解决了问题。

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

09-28 04:20