设置和运行安全的mysql查询的正确格式是什么?

时间:2014-05-07 03:36:37

标签: php mysql security pdo

我最近在如何做到这一点上阅读了很多不同的想法。我正在运行php 5.5和mysql 5.6,我正在使用PDO编写的语句。

PDO应该事先不要求卫生,所以为什么我会看到这么多对filter_input和filter_var的引用?

FIEO与PDO有关吗?下面是查询和回显的简单示例。我最终应该如何以不同方式进行设置?

$name = "John";
$query = $db->prepare("SELECT `name` FROM `users` WHERE `name`=?");
$query->bindValue(1, $name);

try{
    $query->execute();
    $row = $query->fetch();
} catch(PDOException $e){
    die($e->getMessage());
}

echo "Name is " . $row['name'] . ".";

我期待最终理解正确的安全编码。

2 个答案:

答案 0 :(得分:0)

filter_var不是只是用于清理输入;还有一些验证过滤器可用于类型检查(http://www.php.net/manual/en/filter.filters.validate.php)和处理指令(http://www.php.net/manual/en/filter.filters.flags.php)。

在切线上注意:

还有使用存储数据的整个概念;仅仅因为您可能或多或少地对SQL注入安全意味着您的数据可以安全地消费。您仍然必须确保您的数据不包含恶意内容(例如,检查在接受用户的HTML内容时呈现为可执行JavaScript的编码文本)。

如果您想在上面提到的示例中看到一些需要注意的事项示例,我发现HtmlSanitizer库的测试套件非常有趣:https://github.com/mganss/HtmlSanitizer/blob/master/HtmlSanitizer.Tests/Tests.cs

答案 1 :(得分:-1)

作为参数传递给预准备语句的变量将自动由底层驱动程序转义,这有助于防止SQL注入。

尽管Prepared Statements有助于防范SQL注入,但是通过不恰当地使用Prepared Statements可能会导致SQL注入攻击

  String strUserName = //retrieved from webpage via text field 
  $query = $db->prepare("SELECT `name` FROM `users` WHERE `name`=strUserName ");