HTML/JS 注入攻击的最简单检查方法是什么?

Eri*_*sen 1 html javascript security xss

我的 Javascript 代码旨在获取一些不受信任的字符串变量并将其呈现在 DOM 中。它将被插入到格式良好的 HTML 中的已知点。当且仅当字符串不可能包含 HTML 元素时,它才会被插入。脚本执行是主要的担忧,但任何类型的可能被利用的注入都值得关注。

如果字符串看起来不安全,我就不能在 DOM 中呈现它。不需要对可能不安全的字符串进行消毒或做任何事情。事实上,我想避免使用库,而更喜欢不需要维护的简单检查。我还看到了向 DOM 添加文本节点的解决方案,但我只想说这对我正在做的事情不起作用。

我认为测试可能像“字符串是否包含 <”一样简单:

function isItSafe(text) { return text.indexOf('<') === -1; }

但也许这太天真了。特别是,当某些漏洞利用依赖于某个浏览器如何响应无效 HTML 时。可以在不使用“<”的情况下创建注入漏洞吗?如果是这样,您认为最低限度的检查需要是什么?

Viv*_*ick 6

简短的回答是:始终对用户的输入使用正则表达式。我不认为没有尖括号就可以进行 XSS 攻击。

可能有一些库使用更复杂的正则表达式,但这里有一个很好的开始:

这将向 String 的原型添加一个方法:

String.prototype.applyXSSprotection = function(){
  return this.replace(/</g, "&lt;").replace(/>/g, "&gt;");
};
Run Code Online (Sandbox Code Playgroud)

无论何时您要将用户的输入集成到 DOM 中,您都应该使用:

/*let's suppose the user input is stored in the variable user_input as a string*/
user_input = user_input.applyXSSprotection();
/*now use it*/
Run Code Online (Sandbox Code Playgroud)