我偶然发现了这个问题:
你们知道htmlspecialchars函数是否也从用户输入中逃脱了javaScript?
谢谢
答案 0 :(得分:4)
嗯,回答你的问题,这取决于。如果你在做:
<p><?php echo htmlspecialchars($userInput); ?></p>
然后他们将无法将脚本注入您的应用程序。
<强>无论其强>:
如果你想这样做:
<script>
var foo = '<?php echo htmlspecialchars($userInput); ?>';
</script>
您不安全。请参阅OWASP's XSS Cheat Sheet上的规则#3。
为了保护它,您需要使用JS感知转义函数。如果你只需要一个字符串文字,你可以对它进行json编码,但是我会使用ESAPI来处理PHP。
答案 1 :(得分:2)
根据manual,以下字符被替换:
- 未设置
'&'
(&符号)变为'&'
'"'
时,'"'
(双引号)变为ENT_NOQUOTES
。"'"
(单引号)仅在'''
设置时变为ENT_QUOTES
。'<'
(小于)变为'<'
- '
>'
(大于)变为'>'
因此会修改<script>
标记,但内部的Javascript可能会也可能不会被修改,具体取决于它包含的字符。
答案 2 :(得分:2)
PHP manual确切地告诉您该功能改变了哪些字符。
它不关心你给它的字符串是否包含HTML或JS或其他东西。它只是在你给它的任何字符串上进行翻译。
由于HTML和JS使用不同的转义字符,因此它可以使任意数据在HTML中“安全”使用,其中包括使某些JS可以安全地用于HTML。
e.g。
$js = "if (foo && bar) { return false; }"
echo "<button onclick='" . htmlspecialchars($js) . "'>click</button>"
将输出:
<button onclick='if (foo && bar) { return false; }'>click</button>
因此,防止HTML中&
的特殊含义破坏了脚本。
但是,在JavaScript中使用它不会使字符串安全,因为它不会触及\
等具有特殊含义的字符。
答案 3 :(得分:0)
确实如此。 <script>
已更改为<script>