【问题标题】:What is the proper format to setup and run a safe mysql query?设置和运行安全 mysql 查询的正确格式是什么?
【发布时间】:2014-06-23 20:49:19
【问题描述】:

我最近阅读了很多关于如何做到这一点的不同想法。我正在运行 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'] . ".";

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

【问题讨论】:

  • 你永远不会最终理解正确的安全编码
  • 您可以使用命名参数。除此之外还不错
  • FIEO 怎么样?如果示例更复杂,例如变量是字符串或 html,该怎么办?

标签: php mysql security pdo


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    作为参数传递给准备好的语句的变量将被底层驱动程序自动转义,这有助于防止 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 ");
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-12-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多