代码未通过安全检查,如何使我的参数绑定更好?
Posted
技术标签:
【中文标题】代码未通过安全检查,如何使我的参数绑定更好?【英文标题】:Code isn't passing a security check, how do I make my parameter binding better? 【发布时间】:2019-03-23 08:46:23 【问题描述】:我的代码必须通过安全检查,但它没有通过,因为存在 sql 注入风险。他们要求我使用我认为已经使用过的参数,所以现在我想知道如何使我的代码更好?
$imgId = $_POST["imgId"];
$stmt = $link->prepare("SELECT * FROM my_table WHERE image_id = ?");
$stmt->bind_param("s", $imgId);
$stmt->execute();
$result = $stmt->get_result();
$stmt->close();
这是我的一条sql语句,每一条都是这样的结构。
所以我的问题首先是我的代码容易受到 sql 注入的影响,其次我如何使它更安全?
【问题讨论】:
关于 SQL 注入,您的代码是安全的。不过有几件事。我猜$imgId
是一个整数,所以你应该这样绑定它,将s
更改为i
。然后我会在尝试使用之前检查参数$_POST['imgId']
是否已设置,但这并不是真正的安全问题。谁说上面的不安全?
不幸的是,我不能说是哪家公司,但它是一家大型国际公司,需要这种安全检查,他们说这是一种风险,这就是为什么我在这里发布这个问题,因为我很困惑那个评估。并且图像 id 实际上是一个字符串。谢谢你的回答:)
然后回复他们,说您已经在使用它,并询问您使用它的方式有什么不安全的地方。
您是否提供了评估代码的标准/要求?如果是,你的答案就在那里。如果没有,请寻找其他客户/雇主。
【参考方案1】:
如果你知道预期的输入是什么,也许你应该在你的 IDimg 上尝试正则表达式,并预匹配它
【讨论】:
这只是验证,不会改变任何关于安全性或 SQL 注入的内容。由于 OP 使用的是参数化的预处理语句,如果有人传入无效的 id,将会发生的所有情况都是查询不会返回任何结果。 一个不错的猜测,但在 OP 公开代码评估标准之前只是一个 WAG。以上是关于代码未通过安全检查,如何使我的参数绑定更好?的主要内容,如果未能解决你的问题,请参考以下文章