我正在审核以下代码:
originalObj = {"name":"John","age":30,"state":"CA","country":"USA"};
objCodes = {"name":101,"age":102,"state":103,"country":104};
// newObj = {101:"John", 102:30,103:"CA",104:"USA"};
newObj = {};
for (var i in originalObj) {
if (objCodes.hasOwnProperty(i)) {
// console.log(i, originalObj[i]);
console.log(objCodes[i],originalObj[i])
newObj.objCodes[i] = originalObj[i] // fails here
}
}
console.log(newObj);
如您所见,这是一段显而易见的SQL注入漏洞代码,但是我很难证明这一点。如何证明该代码容易受到我的主管的攻击?
答案 0 :(得分:0)
老实说,这段代码很可能是安全的。
我没有考虑太多,只是想想哪些边缘情况可能会使它不安全。就像您使用旧版本的PHP,其中preg_replace()
无法理解unicode序列之类的东西一样。这可以允许某人绕过正则表达式过滤器,以Unicode编码引号字符。我不知道。
不值得费劲思考的原因是,还有另一种解决方案甚至更易于编码,并且肯定是安全的:
$sql= "INSERT INTO paths VALUES (?)";
$pdo = new PDO();
$stmt = $pdo->prepare($sql);
$stmt->execute( [ $_GET['path'] ] );
通过使用类似这样的查询参数,$path
的值将与查询分开,直到准备好为止。因此,该值无法引入错误的引号字符或其他可能影响SQL语句语法的内容。
因此,您根本不需要处理功能。*您可以消除一些代码,这总是使项目易于维护。
您甚至不必问这个问题,就可以寻求专家的帮助来确定消毒是否完全安全。
*至少不是为了防止SQL注入。出于应用程序功能的考虑,可能需要更改该值,但是无论对该值进行什么更改,如果使用查询参数,您都不必担心SQL注入漏洞。