这段代码如何在SQL注入中容易受到攻击?

时间:2020-06-25 07:30:21

标签: php sql-injection

我正在审核以下代码:

    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注入漏洞代码,但是我很难证明这一点。如何证明该代码容易受到我的主管的攻击?

1 个答案:

答案 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注入漏洞。

相关问题