我正在使用php + PDO + mysql给SELECT
用户,要完成我的页面我必须摆脱1个安全问题。在服务器端的每个查询中,我有“SELECT id,first_name,last_name FROM users WHERE $conditions
”,其余的是来自客户端$_POST["conditions"]
(过滤器)现在如何确保它们不会注入另一个UPDATE / DELETE / INSERT /选择......最后???
或者如果你认为我只是做错了,请告诉我,提前谢谢
答案 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!";
永远不要相信用户输入。