针对XSS的安全数据库条目

时间:2015-03-18 13:58:03

标签: javascript php html mysql xss

我正在创建一个应用程序,用于检索推文中的文本,将其存储在数据库中,然后在浏览器中显示。 问题是我在想如果文本有PHP标签或HTML标签,那可能是安全漏洞。

我查看了strip_tags(),但看到了一些糟糕的评论。我也看到了HTML Purifier的建议,但它是最近几年前更新过的。

所以我的问题是,如果推文文本是&#34; <script> something_bad() </script>&#34;我怎么能100%安全?它不重要吗?

要说明显而易见的是推文是从用户发送到数据库的,所以我不想在显示之前单独检查所有推文。

4 个答案:

答案 0 :(得分:1)

您永远不会100%安全,但是您应该看看this。如果您也使用ENT_QUOTES参数,那么如果您使用的是有效的字符集(并且您的用户不使用过时的浏览器),目前无法在您的网站上注入 ANY XSS。但是,如果您希望允许人们仅将某些html标签发布到他们的“推文”中(例如<b>用于粗体文字),则需要深入了解每个白名单标签。

答案 1 :(得分:1)

您已经通过了第一个阶段,即认识到存在潜在问题并且直接尝试寻找解决方案,而不必停下来思考您希望如何处理内容的情景。这是解决问题的关键前提。

一般规则是验证输入和转义输出

验证输入 - 决定是完全接受还是拒绝它

if (htmlentities($input) != $input) {
    die "yuck! that tastes bad";
}

转义输出 - 根据其去向适当地转换数据。

如果你只是......

print "<script> something_bad() </script>";

那会很糟糕,但是......

print JSONencode(htmlentities("<script> something_bad() </script>"));

...然后你会在前端做一些非常奇怪的事情,使客户端对存储的XSS攻击敏感。

答案 2 :(得分:1)

如果您要输出HTML(我建议您一直这样做),只需输出到页面的HTML编码

由于客户端脚本代码仅在浏览器解释时是危险的,因此只需在输出中进行编码。毕竟,数据库<script>只是文本。浏览器<script>告诉浏览器将以下文本解释为可执行代码,这就是您应该将其编码为&lt;script&gt;的原因。

OWASP XSS Prevention Cheat Sheet显示了如何根据输出上下文正确执行此操作。输出到JavaScript时事情变得复杂(您可能需要以正确的顺序进行十六进制编码和HTML编码),因此始终更容易输出到HTML标记然后使用DOM中的JavaScript读取该标记而不是插入动态脚本中的数据直接。

至少应该编码< &个字符并在metatag / HTTP头中指定charset以避免使用UTF7 XSS。

答案 3 :(得分:0)

您需要将HTML字符<>(主要)转换为等效的HTML &lt;&gt;

这会使<>显示在浏览器中,但不会执行 - 即:如果您查看来源,示例可能是&lt;script&gt;alert('xss')&lt;/script&gt;

在将数据输入数据库之前或输出之前,请使用htmlentities().

进一步阅读:https://www.owasp.org/index.php/XSS_%28Cross_Site_Scripting%29_Prevention_Cheat_Sheet