如何在一次阻止多个查询

时间:2013-12-07 20:13:51

标签: php mysql pdo sql-injection

我正在使用php + PDO + mysql给SELECT用户,要完成我的页面我必须摆脱1个安全问题。在服务器端的每个查询中,我有“SELECT id,first_name,last_name FROM users WHERE $conditions”,其余的是来自客户端$_POST["conditions"](过滤器​​)现在如何确保它们不会注入另一个UPDATE / DELETE / INSERT /选择......最后???

或者如果你认为我只是做错了,请告诉我,提前谢谢

2 个答案:

答案 0 :(得分:0)

最好和最安全的方法是避免构建从客户端发布的查询注入子句。

你应该在$ _POST [“condition”]和$ conditions之间添加一个分离/抽象的“层”。

让客户询问必须使用您将决定的约定来获取哪些数据。

例如,对于“所有用户”,$ _POST [“conditions”]可能为空。如果$ _POST [“conditions”]包含一个数字,那么就会获取具有匹配ID的用户......当然,这只是提供这个想法的基本示例。

然后你解析$ _POST [“conditions”]并相应地建立$条件。

当您的服务器端代码构建$条件时,您可以安全地将其注入查询中。

如果你必须取一些值(上面的例子中的ID)并插入查询,请使用预备语句来执行此操作。

请注意,您可能会发现使用更多POST变量而不是单个变量来定义必须提取的用户。

答案 1 :(得分:0)

您应该确切地知道允许哪种陈述并采取相应行动。例如,假设您希望能够根据用户输入执行3个不同的查询:

'id LIKE %param%'
'first_name LIKE %param%'
'last_name LIKE %param%'

您不想直接插入这些内容。而是,您创建2个不同的POST变量: $_POST['field']会选择字段,$_POST['param']将成为您的搜索参数。

一个非常基本的例子:

//you can just store all these in array if there are many
//we don't use POST directly, we set a variable depending on it's value
$field="";
if ($_POST['field']=="id") $field="id";
elseif ($_POST['field']=="first_name") $field="first_name";
elseif ($_POST['field']=="last_name") $field="last_name";

if ($field!="") {
    $sql = $dbh->prepare("SELECT `id`, `first_name`, `last_name` FROM `users` WHERE ".$field." LIKE :param");
    $sql->bindParam("param", "%".$_POST['param']."%");
    $sql->execute();  
}
else echo "Error!";

永远不要相信用户输入。