【问题标题】:Does sanitizing input data prevent sql injection? [duplicate]清理输入数据是否可以防止 sql 注入? [复制]
【发布时间】:2018-07-23 09:28:55
【问题描述】:

嗯,表名和列名不能用 PDO 中的参数代替。 作为要求,这里不能提及static column name。所以,我使用santize。是否足以防止像bind param方法这样的sql注入。什么是最好的方法?

$id = filter_var($_POST['id'], FILTER_SANITIZE_STRING);
$text = filter_var($_POST['text'], FILTER_SANITIZE_STRING);
$column_name = filter_var($_POST['column_name'], FILTER_SANITIZE_STRING);
$result = $con->query("UPDATE menu SET $column_name='$text' WHERE mid=$id") OR die($con->error);  

【问题讨论】:

标签: php pdo sanitization bindparam


【解决方案1】:

您可以清理 语法 的值,但不能清理 含义 的值。根据其定义,SQL 注入意味着您使查询执行与预期不同的操作。在这里,您将查询完全开放,任何人都可以替换列名,这对查询结构至关重要。通过允许用户更改列,您无法控制查询中可能更改哪些列,根据定义,这就是 SQL 注入的一种形式。

您需要一个允许用户更改列名的白名单。如果允许用户更改任何列(甚至是主要的id...!?),并且您不想将列名列表保存在数组中,那么您可以查询您的数据库中获取目标表中列的名称并将其用作白名单。

【讨论】:

    猜你喜欢
    • 2013-02-25
    • 1970-01-01
    • 1970-01-01
    • 2021-10-06
    • 1970-01-01
    • 2013-02-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多