以前肯定有人问过这个问题,但我找不到。
我想让我的用户在 HTML 表单中输入文本,然后在网页中显示该文本,就像它所写的一样,避免:
- XSS 攻击
- 显示编码的标点符号(例如
%2C
,而不是逗号,+
而不是空格) - 由于使用了 < 或 > 并且浏览器将其视为 HTML 的一部分而导致的意外结果
表格enctype
是默认的application/x-www-form-urlencoded
。我不确定我是否真的需要这个enctype
,但出于各种原因,我现在坚持使用它。
我已经看到我可以通过使用decodeURI
or部分修复 (2) decodeURIComponent
,尽管它不会转换+
回space
.
其余的,是不是还有一个我可以使用的内置功能?我发现的唯一库是用于 .NET 或 Java 的服务器端库,我没有找到任何可以在 Javascript 中在客户端执行它的库,但我发现了很多严厉的警告,如果你推出自己的代码,你可能会犯微妙的错误。
现在我正在使用myDecode
下面的函数,这似乎有效,但我不敢相信这是最好的方法。
function myDecode(string) {
// First convert + to space, since decodeURIComponent may introduce new + characters that were previously encoded
// Then use decodeURIComponent to convert all other punctuation
// Then escape HTML special characters
return htmlEscape( decodeURIComponent( string.replace(/\+/g, " ") ) );
}
function htmlEscape(string) {
return string.replace( /&/g, "&") // remember to do & first, otherwise you'll mess up the subsequent escaping!
.replace( /</g, "<" )
.replace( />/g, ">" )
.replace( /\"/g, """ )
.replace( /\'/g, "'" );
}
我的测试是用户可以输入以下文本并按原样显示,无需任何更改且无需运行脚本:
<script>alert( "Gotcha! + & + " );</script>
但我不知道这是否是一个足够强大的测试。
这只是一个没有敏感数据且用户很少的小型爱好项目,因此不必完全防弹。但如果知道如何以正确的方式做事,那就太好了。