代码未通过安全检查,如何使我的参数绑定更好?

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。

以上是关于代码未通过安全检查,如何使我的参数绑定更好?的主要内容,如果未能解决你的问题,请参考以下文章

如何安全地删除未保存的托管对象?

如何使我的数据库连接安全?

使用实时数据库 Firebase 时如何使我的数据库安全?

如何安全地赋予我的功能而不使我的主要形式卡住

如何使我的 ArrayList 线程安全? Java中解决问题的另一种方法?

我应该始终使我的 java 代码线程安全,还是出于性能原因仅在需要时才这样做?