【问题标题】:Dynamic Query and Security options动态查询和安全选项
【发布时间】:2011-10-22 13:49:03
【问题描述】:

我已经制作了简单而精简的数据库层来帮助我正常操作。现在它正在运行,我决定从安全角度对其进行审查。第一个碰撞 (with help of Mordred) 是我的动态查询。通过针对固定的正则表达式验证表变量,可以轻松解决表的第一个问题变量:

$regex = '/^[a-zA-Z0-9_$]+$/';

现在,要清理/验证的下一个变量是列名,而 AFAICS 是我有两个选择。首先是检索该表中的所有列并建立白名单或再次使用正则表达式来验证列变量。我的问题是,以上哪一项是可行的?对表名使用正则表达式验证是否很好?下面是我正在谈论的示例 SQL 字符串

$stmt= $this->conn->prepare("SELECT * FROM $table WHERE $id_col[0]=:id");            
$stmt->execute(array(":id"=>$id_val[0]));
$this->resultset = $stmt->fetch(PDO::FETCH_ASSOC);  

希望收到朋友们的来信(如果问题在某处得到解答,我很抱歉。我找不到此类信息!)

【问题讨论】:

    标签: php mysql pdo sql-injection security


    【解决方案1】:

    我所做的是创建一个脚本来扫描所有表并为表名和列创建白名单,然后我使用它来验证任何应该是表/列名的用户输入,因为它们不进入参数查询。其他任何东西都通过 PDO Bind 参数化!

    【讨论】:

      【解决方案2】:
      function escapeIdent($str) {
        return "`".str_replace("`","``",$str)."`";
      }
      

      但是,我建议不要从另一个答案中转义和这样的批量白名单。

      白名单不应该是站点范围的,而是特定于它所使用的语句。

      虽然用户提供的字段名称可能不包含注入代码,但它仍然存在一定的危险。

      比如说,如果攻击者设法将一些无害的字段名称(例如 surname)替换为更重要的字段名称(例如 access level),他就可以获得该站点的管理员权限。

      【讨论】:

        猜你喜欢
        • 2012-10-14
        • 1970-01-01
        • 2010-09-21
        • 1970-01-01
        • 1970-01-01
        • 2015-02-24
        • 1970-01-01
        • 1970-01-01
        • 2023-03-28
        相关资源
        最近更新 更多