【问题标题】:Sanitize contact form without mysql_real_escape_string在没有 mysql_real_escape_string 的情况下清理联系表格
【发布时间】:2011-03-27 03:11:14
【问题描述】:

我通常使用此功能在将表单输入存储到数据库之前对其进行清理:

//Function to sanitize values received from the form. Prevents SQL injection
function clean($str) {
    $str = @trim($str);
    if(get_magic_quotes_gpc()) {
        $str = stripslashes($str);
    }
    return mysql_real_escape_string($str);
}

直到今天我还没有意识到mysql_real_escape_string 需要数据库连接,因为我只在将数据存储到数据库之前清理数据时才使用它。

我尝试在联系表单上使用该功能并收到“无法建立到服务器的链接”错误。我可以连接到数据库,但没有必要,因为我只是想在通过联系表格将数据发送到我的电子邮件之前对其进行清理。

清理未存储在 mysql 数据库中的数据的最佳方法是什么?这些数据是否仍需要清理?

【问题讨论】:

    标签: php security forms sanitize contact-form


    【解决方案1】:

    使用filter_var()

    http://php.net/manual/en/function.filter-var.php

    如果你想清理电子邮件:

    $_POST['email'] =    filter_var($_POST['email'], FILTER_SANITIZE_EMAIL); 
    

    发消息

    $_POST['message'] = filter_var($_POST['message'], FILTER_SANITIZE_STRING);
    

    长了

    【讨论】:

    • 请问您指的是什么特定的过滤器?有很多
    【解决方案2】:

    使用mysql_real_escape_string 清理数据的目的是避免 SQL 注入。如果您不使用 SQL,那么您已经免疫了。

    男性不会患宫颈癌。

    使用适合您需要避免的特殊字符的清理功能。理想情况下,不要剥离不会造成伤害的东西。

    【讨论】:

    • mysql_real_escape_string 没有任何帮助
    【解决方案3】:

    整个概念是错误的。 此功能对电子邮件甚至对数据库都无济于事。

    mysql_real_escape_string 不要“清理”任何东西。它只是转义分隔符,仅此而已。如果您的数据中有分隔符,只是为了防止语法错误:

    SELECT * FROM table WHERE name = 'it's me' # error!
    

    数据转义后,你的数据变成'it\'s me',没有错误。
    因此,此函数仅适用于 SQL 查询和数据,仅用引号括起来

    因此,在没有引号的情况下只做 mysql_real_escape_string 是没有意义的。应该使用mysql_real_escape_string
    a) 单独。修剪或条形斜线之类的东西在这里无关
    b) 就在查询字符串组成之前,而不是其他地方
    c) 仅适用于用引号括起来的数据。
    d) 所有其他数据都需要另一种清理方式

    对于电子邮件,您不需要任何清理,只需将其作为纯文本发送即可。 您必须采取的唯一预防措施是防止邮件注入
    不过也没什么大不了的。只需将用户输入仅放入消息正文中。不进入主题,来自或来自或任何其他标题。仅消息正文。你很安全

    【讨论】:

    • 什么?始终使用卫生设施。永远不要相信用户输入。此类建议假定 a) 无法将不同的标头注入脚本(如果您不清理输入,您怎么确定?)和 b) 所有邮件客户端都会做正确的事情,即使使用文本/纯标题。我严重怀疑这一点。
    • @Cfreak 这里唯一明智的一点是关于一些奇怪的邮件客户端。有一个例子吗?但是你“从不相信用户输入”的盲目祈祷确实很有趣。为什么不在评判别人之前先获得一些经验?
    【解决方案4】:

    (我是 stackoverflow 的新手,所以我会以错误的方式处理这个问题/我的答案样式做得不好,请随时告诉我。)

    如果我错了,请纠正我,因为我现在也在处理同样的问题,但我认为使用 filter_var 接受的答案还不够,因为攻击者可以使用 unicode 绕过这个问题。

    示例:“Bcc:” (添加空格以便stackoverflow正确显示)

    这不会从字符串中删除,稍后将替换为“密件抄送:”。

    这是我的解决方案,但可能有更好的方法。如果有人知道我很想听听。

        $string = str_replace("&", "(and)", $string);
        $string = str_replace("#", "(num)", $string);
        $string = str_replace(";", "(semi-colon)", $string);
        $string = str_replace(":", "(colon)", $string);
        $string = str_replace("@", "(at)", $string);
        $string = str_replace("\\", "(backslash)", $string);
        $string = filter_var($string, FILTER_SANITIZE_STRING);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-10-08
      • 2022-01-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多