java - 如何保护字符串免受 XSS 攻击?

标签 java xss

我基本上对这个问题进行了研究。我找到了这个教程https://www.javacodegeeks.com/2012/07/anti-cross-site-scripting-xss-filter.html这看起来很有用。所以我提取了我需要的重要部分:

public String stripXSS(String value) {
    if (value != null) {
       value = value.replaceAll("", "");
       Pattern scriptPattern = Pattern.compile("<script>(.*?)</script>", Pattern.CASE_INSENSITIVE);
       value = scriptPattern.matcher(value).replaceAll("");
       scriptPattern = Pattern.compile("src[\r\n]*=[\r\n]*\\\'(.*?)\\\'", Pattern.CASE_INSENSITIVE | Pattern.MULTILINE | Pattern.DOTALL);
       value = scriptPattern.matcher(value).replaceAll("");

       scriptPattern = Pattern.compile("src[\r\n]*=[\r\n]*\\\"(.*?)\\\"", Pattern.CASE_INSENSITIVE | Pattern.MULTILINE | Pattern.DOTALL);
       value = scriptPattern.matcher(value).replaceAll("");

       scriptPattern = Pattern.compile("</script>", Pattern.CASE_INSENSITIVE);
       value = scriptPattern.matcher(value).replaceAll("");

       scriptPattern = Pattern.compile("<script(.*?)>", Pattern.CASE_INSENSITIVE | Pattern.MULTILINE | Pattern.DOTALL);
       value = scriptPattern.matcher(value).replaceAll("");
       scriptPattern = Pattern.compile("eval\\((.*?)\\)", Pattern.CASE_INSENSITIVE | Pattern.MULTILINE | Pattern.DOTALL);
       value = scriptPattern.matcher(value).replaceAll("");
       scriptPattern = Pattern.compile("expression\\((.*?)\\)", Pattern.CASE_INSENSITIVE | Pattern.MULTILINE | Pattern.DOTALL);
       value = scriptPattern.matcher(value).replaceAll("");

       scriptPattern = Pattern.compile("javascript:", Pattern.CASE_INSENSITIVE);
       value = scriptPattern.matcher(value).replaceAll("");

       scriptPattern = Pattern.compile("vbscript:", Pattern.CASE_INSENSITIVE);
       value = scriptPattern.matcher(value).replaceAll("");

       scriptPattern = Pattern.compile("onload(.*?)=", Pattern.CASE_INSENSITIVE | Pattern.MULTILINE | Pattern.DOTALL);
       value = scriptPattern.matcher(value).replaceAll("");
  }
return value;
}

那么我这样调用它:

String filthy = "<h1>Need to secure this.</h1>";
String clean = stripXSS(filthy);

不知道我错过了什么,但这没有用。 如果您能引导我走上正确的道路,我将不胜感激。

最佳答案

此函数不会尝试删除标题标签。可能是因为它们不涉及 JavaScript。但它也没有删除涉及 JavaScript 的明显属性,例如“onmouseover”。它还缺少基本的反 XSS 规避技术。所以这个功能无法使用。

更好的资源是:OWASP XSS

这更多地侧重于根据周围的上下文转义输出数据。保护字符串的想法并没有真正起作用,因为不安全的内容取决于它的使用方式。 header 中的换行符需要转义,命令参数中的空格需要转义。它还会损坏有效数据。撇号可以出现在名称中,但在 SQL 查询中是元字符。

关于java - 如何保护字符串免受 XSS 攻击?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43167295/

相关文章:

java - 如何将对象从注册表传输到 Controller 以写入数据库并分配角色?

ruby-on-rails - params.merge 和跨站脚本

jquery - jQuery 的 $ 是否可以免受 XSS 攻击?

java - 如何生成 256 位 AES key

java - 问题在Arraylist中的count字段中并保存它

java - 在构造函数之外的方法中使用构造函数中的变量

html - 使用 BBCode 输入和 HTML 输出避免 XSS

java - 如何检查远程图像是否符合某些规范

javascript - 使用 DOMPurify 清理 HTML 时允许属性的安全含义

JavaScript - window.location - 权限被拒绝 - 跨站点脚本