0

以前肯定有人问过这个问题,但我找不到。

我想让我的用户在 HTML 表单中输入文本,然后在网页中显示该文本,就像它所写的一样,避免:

  1. XSS 攻击
  2. 显示编码的标点符号(例如%2C,而不是逗号,+而不是空格)
  3. 由于使用了 < 或 > 并且浏览器将其视为 HTML 的一部分而导致的意外结果

表格enctype是默认的application/x-www-form-urlencoded。我不确定我是否真的需要这个enctype,但出于各种原因,我现在坚持使用它。

我已经看到我可以通过使用decodeURIor部分修复 (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, "&amp;")  // remember to do & first, otherwise you'll mess up the subsequent escaping!
                 .replace( /</g, "&lt;" )
                 .replace( />/g, "&gt;" )
                 .replace( /\"/g, "&quot;" )
                 .replace( /\'/g, "&#39" );
}

我的测试是用户可以输入以下文本并按原样显示,无需任何更改且无需运行脚本:

<script>alert( "Gotcha! + & + " );</script>

但我不知道这是否是一个足够强大的测试。

这只是一个没有敏感数据且用户很少的小型爱好项目,因此不必完全防弹。但如果知道如何以正确的方式做事,那就太好了。

4

0 回答 0