您是否必须逃避或清理<textarea>
中的输出?
似乎如果我使用htmlentities()
来清理真实的&amp; ...;角色替换出现
答案 0 :(得分:2)
嗯,你必须:
<?php
$content = "</textarea><script>alert('hi!')</script>";
?>
<textarea>
<?php echo $content; ?>
</textarea>
答案 1 :(得分:1)
如果该输出最初由用户或任何不受信任的来源提供(即不直接来自您的代码),则需要对其进行清理以防止XSS攻击。
答案 2 :(得分:1)
您需要考虑用户是否可以编辑输出。如果不是,它是一个可靠的输出(可能来自你写的预定义文本),你显然不会。否则是的。 HTML字符替换是很正常的,但您不必担心,因为当页面被读取并输出到用户浏览器时,所有以前的字符仍将存在。
请注意,>
和<
字符可用于注入其他HTML代码,特别是可以运行Javascript的<script>
标记,如果不是清理的话。
答案 3 :(得分:1)
是的,你需要消毒。请改用htmlspecialchars($str, ENT_QUOTES)
。
答案 4 :(得分:1)
始终在<
的内容中逃避>
和<
(>
和textarea
)的所有出现。否则,可以提供以下内容(示例)来“转义”textarea并注入HTML代码:
</textarea><script src="http://malicious.code.is/us.js"></script>
否则可能导致以下代码:
<textarea id="text"></textarea><script src="http://malicious.code.is/us.js"></script></textarea>
最后的第二个</textarea>
将被忽略,之前的脚本标记将被执行。
答案 5 :(得分:0)
仅使用htmlspecialchars()
是不够的。它仍然容易受到某些多字节字符攻击向量的攻击(即使使用htmlspecialchars($string, ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8')
或许查看像HTMLPurifier这样的库,为您提供更完整的解决方案。
以下是PHP中XSS保护的一个很好的总结。