Php 此使用内爆的SQL查询易受注入攻击吗?
我必须基于数组中的数据运行查询。在本地,我用名字进行了测试Php 此使用内爆的SQL查询易受注入攻击吗?,php,sql,Php,Sql,我必须基于数组中的数据运行查询。在本地,我用名字进行了测试 $names = ['my name', 'another name']; if (!$conn) { die("Connection failed: " . mysqli_connect_error()); } $sql = "SELECT * FROM `clients` WHERE `name` IN ('".implode("','",$names)."') ORDER BY id DESC"; $result =
$names = ['my name', 'another name'];
if (!$conn) {
die("Connection failed: " . mysqli_connect_error());
}
$sql = "SELECT * FROM `clients` WHERE `name` IN ('".implode("','",$names)."') ORDER BY id DESC";
$result = $conn->query($sql);
while($row = $result->fetch_assoc()) {
print_r($row);
}
$conn->close();
这将根据$names数组中的名称返回正确的行,但是有些人说在查询中使用内爆函数是危险的。我不知道该怎么做。是的,它很脆弱,因为引号没有转义。考虑这个输入:
$names = ['my name', 'another name', '\') or true;--'];
问题不在于内爆,而在于它与否。问题是,您正在使用字符串连接而不是和构建查询。是的,它很容易受到攻击,因为引号不会转义。考虑这个输入:
$names = ['my name', 'another name', '\') or true;--'];
问题不在于内爆,而在于它与否。问题是,您正在使用字符串连接而不是and来构建查询,这与在语句之前连接列表没有什么不同,即$daNames=introde$names;然后,$sql=从客户机中选择*,其中,$daNames ORDER BY id DESC中的名称;我相信有人会告诉你它很脆弱,但这不是因为内爆。更主要的原因是,如果有人可以伪造进入的值,他们可能会重写查询的其余部分。预处理语句是一种流行的缓解方法,但是如果您设置为使用设置,您可以删除字符串中的特殊字符。这种特定的迭代不是,因为您已经用安全的值对可能的值进行了硬编码-它们不包含像'这样的字符。也就是说,假设您将来不会使用硬编码的值,那么如果它们是固定值,那么您可以完全跳过数据库,这就是您遇到问题的地方。你的问题有点像是用空枪指着我的头扣动扳机很危险虽然从技术上讲它可能是安全的,但这不是一个好习惯。谢谢大家。我现在明白了。这与在语句之前连接列表没有什么不同,即$daNames=introde$names;然后,$sql=从客户机中选择*,其中,$daNames ORDER BY id DESC中的名称;我相信有人会告诉你它很脆弱,但这不是因为内爆。更主要的原因是,如果有人可以伪造进入的值,他们可能会重写查询的其余部分。预处理语句是一种流行的缓解方法,但是如果您设置为使用设置,您可以删除字符串中的特殊字符。这种特定的迭代不是,因为您已经用安全的值对可能的值进行了硬编码-它们不包含像'这样的字符。也就是说,假设您将来不会使用硬编码的值,那么如果它们是固定值,那么您可以完全跳过数据库,这就是您遇到问题的地方。你的问题有点像是用空枪指着我的头扣动扳机很危险虽然从技术上讲它可能是安全的,但这不是一个好习惯。谢谢大家。我现在明白了。啊,我明白了。非常感谢。我将查找准备好的语句和绑定参数。用mysqliAh,我明白了。非常感谢。我将查找准备好的语句和绑定参数。使用mysqli