java - 用于防止 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("<");
}
解决方案
一般来说,输入验证不足以抵御 XSS。这个问题缺乏足够的细节来判断它在这种特定情况下是否可以利用,但无论哪种方式,仅依赖输入验证都不是一个好主意。
如果您计划将此作为针对跨应用程序的多个视图的 XSS 的通用措施来实现,它几乎肯定会失败。
考虑像" onclick="alert(1)" x="
, 或javascript:alert(1)
href 等输入。我们甚至还没有提到具有<script> var myvar = {{variable}}; </script>
和类似的视图模板的最终情况。这是无穷无尽的蠕虫罐头。
真正防止 XSS 的唯一方法是根据上下文输出写入(html、属性、javascript 等)实现正确的输出编码。即使那样,您仍然必须小心javascript:
直接写入 Javascript 上下文的内容。
推荐阅读
- r - 在使用插入符号训练多个模型时使用相同的 trainControl 对象进行交叉验证是否可以进行准确的模型比较?
- c - Strcat 追加整个结构而不是一个元素
- wordpress - 如何确保仅售出 woocommerce 中任何产品的一个实例?
- hibernate - Spring Data 无法使用 *ScoreHibernateType 持久化 OptaPlanner 的 Score 对象
- jquery - 减少一个 jquery 函数以显示隐藏 div
- amazon-web-services - 弹性搜索查询中多列的通配符
- amazon-web-services - 启用代理协议的 AWS ELB TCP http 到 https 重定向
- python - 使用相同的对象创建新模型 odoo 11
- mongodb - AWS DMS - 将阵列从 MongoDB 迁移到 DynamoDB
- c# - 如果任何列具有空值,则按日期和小时获取所有记录组