首页 > 后端开发 > php教程 > 在 LIMIT 子句中使用'bindValue”时如何避免 SQL 注入?

在 LIMIT 子句中使用'bindValue”时如何避免 SQL 注入?

Barbara Streisand
发布: 2024-12-18 22:48:11
原创
127 人浏览过

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中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板