【问题标题】:filtering form inputs过滤表单输入
【发布时间】:2011-04-17 04:56:19
【问题描述】:

我有一个简单的联系表格,其中包含姓名、电子邮件、选择列表和文本区域。在我的邮件 php 脚本中,我试图添加一个简单的过滤器来防止 SQL 注入或其他形式的黑客攻击。

例如,我正在使用

$name = filter_input(INPUT_POST, 'name', FILTER_SANITIZE_SPECIAL_CHARS);

这样好吗?

【问题讨论】:

    标签: php sql forms input filter


    【解决方案1】:

    要测试有效性,请尝试使用 SQL 注入攻击来攻击您自己的网站。基本上,尝试传递' || 1=1 之类的字符串,看看是否有错误。如果您收到错误或收到意外结果,则您的网站很容易受到攻击。否则,它可能正在工作;但可以肯定的是,请确保进行大量测试。

    【讨论】:

    • 感谢您的建议,我在电子邮件中尝试了'get '。所以我想它是有效的:)
    • 那是正确的。您应该尝试的字符是 `'"&=?
    • 它们都被过滤了 :) FILTER_SANITIZE_SPECIAL_CHARS 似乎不错 :)
    【解决方案2】:

    更好的选择是使用 mysqli 扩展和预处理语句。但是,确实存在 mysql_real_escape_string() 函数,它专门“转义字符串中的特殊字符以在 SQL 语句中使用”。

    【讨论】:

    • 我看到了,但我没有将数据发送到数据库,而是发送电子邮件
    【解决方案3】:

    首先让我告诉你,大约 85% 的保护方法是通过 2 个功能完成的。

    首先,如果有人向您的网站发送了一些数据,例如 $_POST['name'],并且您希望在 html 端使用此值,例如 <p>The following string: {$_POST['name']} is invalid</p>,那么您应该始终确保该值已通过 htmlspecialchars,这将保护大多数的 XSS 尝试

    接下来是注入,如果 $_POST['name'] 的值要进入您的数据库,请确保您对该值使用 mysql_real_escape_string

    这将为您提供 100% 的 sql 注入保护,但这意味着您的数据库无法运行来自用户的命令,这并不意味着文本应该是这样的。

    在将数据插入数据库之前您应该始终使用的函数是

    这称为 Validation,仅用于确保用户提交的数据是您想要的,例如 filter_var 将用于验证他们输入的电子邮件是电子邮件,而不仅仅是一些 blah blah

    我通常做的是运行一个干净的函数来确保所有估算的数据都是干净的 htmlspecialchars

    示例:

    function clean($array)
    {
        foreach($array as $key => $val)
        {
            if(is_array($val))
            {
                $array[$key] = clean($val); //Recursive 
            }else
            {
                $array[$key] = htmlspecialchars($val, ENT_QUOTES);
            }
        }
        return $array;
    }
    

    然后执行以下操作以确保您免受 XSS 攻击:

    $_GET = clean($_GET);
    $_POST = clean($_POST);
    

    因此,如果有人尝试提交<a href='test'>Test</a>,则该值将转换为<a href='test'>Test</a&gt

    【讨论】:

    • 很好的解释!也感谢您提供该功能 :) 您认为 FILTER_SANITIZE_SPECIAL_CHARS 是该功能的更好替代品还是会产生相同的结果?
    • 不,虽然 FSSC 非常好,但我可以保证其他两个函数是 PHP 中最有效的。
    【解决方案4】:

    FILTER_SANITIZE_SPECIAL_CHARS 执行 HTML 转义 '"& 和 ASCII 值小于 32 的字符。要获得 htmlspecialchars() 的完全等效项,请使用 FILTER_SANITIZE_FULL_SPECIAL_CHARS,这相当于调用 htmlspecialchars() 并设置了 ENT_QUOTES。使用此函数应该使 mysql_real_escape_string() 的使用过时,但安全第一:)

    另请参阅:http://php.net/manual/en/filter.filters.sanitize.php 了解更多信息。

    【讨论】:

      猜你喜欢
      • 2011-05-18
      • 1970-01-01
      • 2021-07-03
      • 1970-01-01
      • 2019-04-22
      • 2015-03-18
      • 1970-01-01
      • 2023-03-31
      相关资源
      最近更新 更多