这种PDO查询是否受到SQL注入的保护?

这个问题在这里已经有了答案:

  • 准备好的语句如何防止SQL注入攻击? 9个答案

  • 即使您使用过PDOSQL INjection由于您尚未参数化查询,您的代码仍然容易受到SQL INjection因此必须对查询进行参数化才能清除值。

    $userid = $_GET['id'];
    $query = "SELECT * FROM table WHERE userid=?";
    $db->setAttribute( PDO::ATTR_EMULATE_PREPARES, false );
    $action = $db->prepare($query);
    $action->bindParam(1, $userid);
    $action->execute();
    

    第二种说法是不安全的。

    相反,你应该这样做

    $stmt = $db->prepare('SELECT * FROM table WHERE userid=:id');
    $stmt->bindParam(':id', $userid);
    $stmt->execute();
    

    资源


    它在技术上是安全的,因为用户不会影响$ userid,对吧? 说如果我错了这个。

    你错了。 会话数据不在数据范围内,必须谨慎处理。 这是因为:

  • SessionID和SessionName直接与请求一起提供。 这些值可以很容易地操作,以便将一些不同的数据放入应用程序的内存中。
  • 持久性。 会话数据可以在持久层中进行修改,因此它始终符合输入数据(!)的要求。
  • 你可能期待一个整数值,所以做一个:

    $userid = (int) $_SESSION['data']['id'];
    

    尤其是当你直接将变量替换为你的SQL查询。

    将来不要认为它是安全的。 考虑以安全的方式进行操作,以便即使您错过了其他层的某些内容(如通过会话输入),也不会中断应用程序中的数据流。

    $pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
    
    ...
    
    $userid = (int) $_SESSION['data']['id'];
    
    ...
    
    $query = "SELECT column FROM table WHERE userid = ?";
    
    $stmt = $pdo->prepare($query);
    $stmt->bindParam(1, $userid);
    $stmt->execute();
    
    链接地址: http://www.djcxy.com/p/93733.html

    上一篇: Is this kind of PDO query protected against SQL injection?

    下一篇: Correct way to get allowed arguments from ArgumentParser