我在PHP中编写了一个mysql更新查询,以防止sql注入为:
UPDATE table1 status = 1 WHERE id IN ( ? ) and active = ?, array(implode(',' $ids), 1)
其中id字段具有整数数据类型。
我在执行此问题时遇到问题,因为爆破会生成一个逗号分隔的字符串,并且ID未被分配为IN子句,因为它变成了:
array(implode(',' $ids) == array(1,2,3, 1)
前三个是id,数组中的第四个值是活动字段值,但是语句考虑将数组中的前两个值(即1,2)替换为“?” 在查询中
注意:在查询中没有问题,就像在不使用阻止sql注入的情况下进行相同查询一样
UPDATE table1 SET status = 1 WHERE id IN ( 1,2,3 ) and active = 1
工作正常。仅PHP内爆功能存在问题。
当将数组中的所有值都强制转换为int时,可以防止sql注入。这样就很安全了。
$intCastedIds = array_map('intval', $ids);
如果您在$ ids数组中注入了代码,则intval会将所有值都转换为int。因此,在这种情况下是不可能注入的。
因此,而不是:
UPDATE table1 status = 1 WHERE id IN ( ? ) and active = ?, array(implode(',' $ids), 1)
做类似的事情:
'UPDATE table1 status = 1 WHERE id IN (' . implode(',', $intCastedIds) . ') and active = ?', 1)
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句