我正在创建一个应用程序,用于检索推文中的文本,将其存储在数据库中,然后在浏览器中显示。 问题是我在想如果文本有PHP标签或HTML标签,那可能是安全漏洞。
我查看了strip_tags(),但看到了一些糟糕的评论。我也看到了HTML Purifier的建议,但它是最近几年前更新过的。
所以我的问题是,如果推文文本是&#34; <script> something_bad() </script>
&#34;我怎么能100%安全?它不重要吗?
要说明显而易见的是推文是从用户发送到数据库的,所以我不想在显示之前单独检查所有推文。
答案 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>
告诉浏览器将以下文本解释为可执行代码,这就是您应该将其编码为<script>
的原因。
OWASP XSS Prevention Cheat Sheet显示了如何根据输出上下文正确执行此操作。输出到JavaScript时事情变得复杂(您可能需要以正确的顺序进行十六进制编码和HTML编码),因此始终更容易输出到HTML标记然后使用DOM中的JavaScript读取该标记而不是插入动态脚本中的数据直接。
至少应该编码< &
个字符并在metatag / HTTP头中指定charset以避免使用UTF7 XSS。
答案 3 :(得分:0)
您需要将HTML字符<
,>
(主要)转换为等效的HTML <
,>
。
这会使<
和>
显示在浏览器中,但不会执行 - 即:如果您查看来源,示例可能是<script>alert('xss')</script>
。
在将数据输入数据库之前或输出之前,请使用htmlentities()
.
进一步阅读:https://www.owasp.org/index.php/XSS_%28Cross_Site_Scripting%29_Prevention_Cheat_Sheet