我是否从mysql注入安全?

这个问题在这里已经有了答案:

  • 我如何防止PHP中的SQL注入? 28个答案

  • 我认为你混淆了两个安全问题:SQL注入和跨站点脚本(XSS)。

    如果在发送到SQL数据库的SQL查询中使用不正确的清理过的用户输入,则网站容易受到SQL注入攻击。 例如,该代码引入了SQL注入漏洞:

    mysql_query("INSERT INTO postmessages (postmessage) VALUES ('" . $_POST['postmessage'] . "')");
    

    这个问题很容易通过使用像mysql_real_escape_string这样的函数转义用户输入来解决:

    mysql_query("INSERT INTO postmessages (postmessage) VALUES ('" . mysql_real_escape_string($_POST['postmessage']) . "')");
    

    这就是你需要做的一切,但棘手的部分是记住为SQL语句中使用的每一个用户输入做这件事。

    当发送给客户端的HTML中使用用户输入时,网站易受跨站脚本攻击。 例如,该代码引入了XSS漏洞:

    echo "<div class='postmessage'>" . $_POST['postmessage'] . "</div>";
    

    用类似htmlspecialchars的函数转义用户输入来修复XSS漏洞:

    echo "<div class='postmessage'>" . htmlspecialchars($_POST['postmessage']) . "</div>";
    

    再次,这很容易做到,但很容易被遗忘。

    通常,放置在数据库中的用户输入将在未来修改时保存。 也就是说,只使用了mysql_real_escape_string 。 但是,您可以转义用户输入以防止XSS,然后转义XSS安全字符串以防止SQL注入:

    mysql_query("INSERT INTO postmessages (postmessage) VALUES ('" . mysql_real_escape_string(htmlspecialchars($_POST['postmessage'])) . "')");
    

    好处是您不需要记住在将它们写入HTML之前使用htmlspecialchars从数据库中转义值。 缺点是某些值可能需要通过不同的函数进行转义。 例如,用户名可能会被htmlspecialchars转义,但“postmessage”可能允许BBcode,Markdown或HTML的子集。 如果您避免了所有输入以防止XSS,那么您需要使用例如htmlspecialchars_decode从数据库中取消值。

    一个问题是,逃避转义字符串并不总是返回原始字符串( unescape(escape($orig))不一定与$orig相同)。 即使使用htmlspecialcharshtmlspecialchars_decode ,使用不同的引用样式也会导致此问题。 另一个例子是,如果使用strip_tags ,那么信息被不可挽回地移除; 你将无法撤消strip_tags 。 因此,许多开发人员选择仅使用mysql_real_escape_string将值保存到数据库和htmlspecialchars (或其他)中,以便从数据库准备字符串以用于HTML。


    mysql_real_escape_string()是你需要的唯一方法。
    在数据库中插入数据之前,您不应该执行htmlentities()urlencode() 。 这些方法通常是在您提供给用户的视图呈现过程中的代码。

    避免SQL注入的更好方法是使用预准备语句


    资源:

  • php.net - 使用PDO编写语句
  • 在同一主题上:

  • PHP:mysql_real_escape_string是否足以清理用户输入?

  • 是的,但有一个不使用mysql_real_escape_string()的原因。 首先,打字很痛苦。 其次,你必须记住每次使用它。 第三,它使你的代码变得丑陋。 第四,你必须记得引用你的字符串。 第五,以这种方式在数据库中插入斑点更加困难。

    学习PDO将使您的生活长远发展。 学习比简单地使用mysql_real_escape_string()更加困难,但长期的好处胜过学习曲线的不便。

    链接地址: http://www.djcxy.com/p/16733.html

    上一篇: Am I safe from a mysql injection?

    下一篇: how to insert into mysql using Prepared Statement with php