【问题标题】:How to use $_GET securely?如何安全地使用 $_GET?
【发布时间】:2011-08-03 11:21:38
【问题描述】:

我需要使用 get 函数从 url 中检索 $title 变量。

$title=$_GET["title"];

$title 稍后在 MySQL 查询中使用。

问题是如何确保安全? 换句话说,如何中和任何通过 URL 发送的恶意代码。

【问题讨论】:

标签: php mysql security


【解决方案1】:

(对于“安全”的值等于“防止它破坏数据库”):使用任何使用bound parameters 的数据库 API。

绑定的参数倾向于让数据库处理转义(因此使用由数据库作者而不是语言作者编写的转义例程)并使用一种不太容易被遗忘的语法,因为一个重要的转义然后手动转义每个带有(例如)mysql_real_escape_string 的输入数据。

在对不同上下文中的数据执行某些操作之前,您可能需要稍后采取其他步骤(例如,确保插入 HTML 文档的安全性)

【讨论】:

    【解决方案2】:

    您必须使用 mysql_real_escape_string() 来转义所有可能干扰您的数据库的字符。如果你显示这个标题,你还应该使用 htmlentities() 或 striptags()

    【讨论】:

      【解决方案3】:

      从 PHP 5.2 开始,您可以使用 filter_input() 和 filter_input_array() 来清理和验证 $_GET 或 $_POST 数据。

      例如:

      $my_string = filter_input(INPUT_GET, 'my_string', FILTER_SANITIZE_STRING);
      

      阅读本文here了解更多信息。

      对于 SQL 查询,强烈建议您将 PDO 与准备好的语句一起使用,以防止 SQL 注入。您可以在 PHP 手册here 中阅读有关 PDO 的信息。

      【讨论】:

        【解决方案4】:

        您可以使用 mysql_real_escape_string 函数(转义字符串中的特殊字符以用于 SQL 语句)

        Php Manuel

        【讨论】:

          【解决方案5】:

          使用查询参数。从 PHP 连接到 mysql 有多种不同的方式,它们使用参数的方式因框架而异。这是一个使用 PDO 的示例:

          $dbh = new PDO('mysql:dbname=test;host=127.0.0.1', 'username', 'password');
          $sth = $dbh->prepare("select * from table where title = :title")
          $sth->execute(array(':title' => $_GET["title"]));
          $rows = $sth->fetchAll();
          
          var_dump($rows);
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2012-01-07
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-06-29
            相关资源
            最近更新 更多