首页 > 解决方案 > 用于防止 XSS 攻击的纯文本字段验证

问题描述

我们的应用程序中有一些纯文本字段,我们试图保护它们免受 XSS 攻击。例如,用户对帖子发表评论的评论字段是普通字段。用户不应该有改变格式的能力,但他们应该能够用纯文本写任何东西,包括不同的语言,特殊字符,如@、&、'、*等。我们也可以不允许“< "和">"。

因此,考虑到这一点,如果我在服务器端(Java)检查输入字符串并在用户使用“>”或“<”时验证失败就足够了吗?这会暴露任何安全问题或限制吗?

public boolean isValid(String value) {
  if (value == null) {
    return true;
  }
  // Setting an arbitrary large number (should be enough for any article/text)
  if (value.length() > 50000) {
    return false;
  }

  return !value.contains(">") && !value.contains("<");
}

标签: javasecurityxss

解决方案


一般来说,输入验证不足以抵御 XSS。这个问题缺乏足够的细节来判断它在这种特定情况下是否可以利用,但无论哪种方式,仅依赖输入验证都不是一个好主意。

如果您计划将此作为针对跨应用程序的多个视图的 XSS 的通用措施来实现,它几乎肯定会失败。

考虑像" onclick="alert(1)" x=", 或javascript:alert(1)href 等输入。我们甚至还没有提到具有<script> var myvar = {{variable}}; </script>和类似的视图模板的最终情况。这是无穷无尽的蠕虫罐头。

真正防止 XSS 的唯一方法是根据上下文输出写入(html、属性、javascript 等)实现正确的输出编码。即使那样,您仍然必须小心javascript:直接写入 Javascript 上下文的内容。


推荐阅读