Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/security/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
防止跨站点脚本编写的Java最佳实践_Java_Security_Xss - Fatal编程技术网

防止跨站点脚本编写的Java最佳实践

防止跨站点脚本编写的Java最佳实践,java,security,xss,Java,Security,Xss,我浏览了OWASP十大漏洞,发现我们必须注意跨站点脚本。几乎没有办法推荐解决方案。有人指出,不要使用“黑名单”验证来检测输入中的XS或对输出进行编码。仅搜索和替换几个字符(以及其他类似的字符或短语,如脚本)很弱,已被成功攻击。即使是未经检查的“标记在某些上下文中也是不安全的。XSS有数量惊人的变体,可以轻松绕过黑名单验证。另一种解决方案是使用强输出编码。在呈现之前,确保所有用户提供的数据都经过适当的实体编码(HTML或XML,具体取决于输出机制)。那么,防止跨站点脚本验证和替换输入或编码输出的最

我浏览了OWASP十大漏洞,发现我们必须注意跨站点脚本。几乎没有办法推荐解决方案。有人指出,不要使用“黑名单”验证来检测输入中的XS或对输出进行编码。仅搜索和替换几个字符(
以及其他类似的字符或短语,如
脚本
)很弱,已被成功攻击。即使是未经检查的
标记在某些上下文中也是不安全的。XSS有数量惊人的变体,可以轻松绕过黑名单验证。另一种解决方案是使用强输出编码。在呈现之前,确保所有用户提供的数据都经过适当的实体编码(HTML或XML,具体取决于输出机制)。那么,防止跨站点脚本验证和替换输入或编码输出的最佳方法是什么?

我的首选方法是将所有非字母数字字符编码为HTML数字字符实体。因为几乎,如果不是所有攻击都需要非alphaneric字符(如的话),那么请同时使用这两种字符。事实上,请参考类似的指南,了解输出编码和输入验证的可能使用情况

当您在某些情况下无法依赖输出编码时,输入验证会有所帮助。例如,您最好验证URL中出现的输入,而不是对URL本身进行编码(Apache不会提供URL编码的URL)。或者,验证JavaScript表达式中出现的输入

最终,一个简单的拇指规则会有所帮助——如果您不充分信任用户输入,或者如果您怀疑某些源可能导致XSS攻击,尽管输出编码,请根据白名单进行验证


请务必查看源代码,了解如何在安全库中编写输出编码器和输入验证器。

正常做法是在JSP中重新显示期间,而不是在servlet中处理提交的数据期间或在DB中存储期间,HTML转义任何用户控制的数据(要安装它,只需插入
/WEB-INF/lib
)标记或函数即可

<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
...
<p>Welcome <c:out value="${user.name}" /></p>

...
欢迎光临


...
就这样。不需要黑名单。请注意,用户控制的数据涵盖了HTTP请求中的所有内容:请求参数、正文和标题(!!)

如果您在处理提交的数据和/或存储在数据库中的过程中进行HTML转义,那么这些转义都会散布在业务代码和/或数据库中。这只是维护问题,如果您在不同的位置进行转义,您将面临双重转义或更多转义的风险(例如,
&
将变成
&;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp

另见:

可能的重复:重复:空格不是字母数字,对吗?正确。空格不是字母数字,并且,考虑到这种非常严格的算法,它将编码为 ;。这似乎从来没有必要,但请考虑一种情况,如果输出是从follo构造的,则只处理单引号和双引号的已知危险字符wing JSP snippet:如果用户提交一个值,比如x onfocus=alert(1)s/他就能够执行XSS.P.s.有没有办法格式化注释?我正在尝试打印,但不能…+1!如果我们能够以某种方式将EL表达式配置为默认的html转义,那么我们就不需要到处都有大量的c:out:-)啊,你已经在这里回答了这个问题:@Albert:如果我没弄错的话,你已经在使用JSF/Facelets了,对吗?所有XSS转义都已经为你完成了,是的。哇,你还记得吗!是的,我曾经使用Facelets,但现在正在一个使用SpringMVC的项目中,并且使用JSP作为视图。所以我现在的结论是,当显示使用时,c:outr输入,EL表示休息。如果输出值中有类似的内容,它将按原样显示而不生效。
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
...
<p>Welcome <c:out value="${user.name}" /></p>
<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
...
<input name="username" value="${fn:escapeXml(param.username)}">