我正在运行基于Java Spring MVC的Web应用程序。它也基于Hybris平台。
现在,已经实现了身份验证和授权方面的基本功能。这意味着我们有会话过滤器,工作用户系统等
但是,我们目前没有针对诸如XSS和其他可能的攻击等内容的安全措施。 XSS可能是最大的担忧,因为它是最常见的攻击方式。
现在,我想知道......采取哪些步骤是明智的? 我看了一下,我看到像XSS-Filter这样的东西存在。 实现这样做非常简单,只需复制一下源代码并将其添加为tomcats web.xml。
但是我想知道这样过滤器的安全性是否令人满意?
还有更臃肿的解决方案,例如我可以使用spring-security。 然而,阅读文档,我觉得这是非常臃肿,其中很大一部分实现了已经实现的(例如,两个A')。我觉得将它配置为我需要它完成的工作量需要花费很多工作。 我错了吗?
和
您如何建议处理安全问题,例如XSS?您是否使用了某种适合您需求的预定义框架,或者您的安全性"手工制作"通过遵循cheat sheet?
之类的内容答案 0 :(得分:6)
设置Anti-XSS标头(提示:使用Spring Security或自己制作Interceptor)
Content-Security-Policy: default-src 'self' --only allow content from your own site
X-XSS-Protection: 1; mode=block --prevent some reflective attacks in some browsers
X-Content-Type-Options: nosniff --can't trick browser into detecting and running js in other content types
防止恶意入站HTML / JS / CSS
在所有用户提供的字符串字段上使用Hibernate Validator(您不需要使用Hibernate ORM来使用它)和@SafeHtml
注释。
您可以在一个Interceptor中验证所有请求标头,post params和查询参数,以进行简单的XSS验证。
在输出中撤消所有用户提供的数据
使用OWASP的Java Encoder Project <e:forHtml value="${attr}" />
来转义输出或JSTL的<c:out value="${attr}"/>
和web.xml
集
<context-param>
<param-name>defaultHtmlEscape</param-name>
<param-value>true</param-value>
</context-param>
如果转义HTML节点文本,它们同样安全,但OWASP对于HTML属性或<script>
转义更安全。
如果要编辑的文件太多,请考虑http://pukkaone.github.io/2011/01/03/jsp-cross-site-scripting-elresolver.html
使用JavaScript无法读取会话Cookie。在web.xml
:
<session-config>
<cookie-config>
<!-- browser will disallow JavaScript access to session cookie -->
<http-only>true</http-only>
</cookie-config>
<tracking-mode>COOKIE</tracking-mode>
</session-config>
如果您要托管用户上传的文件,则需要使用其他域(不是子域)进行下载链接,这样恶意内容就无法破坏您的会话cookie(是的,即使它是httpOnly也会发生这种情况)
答案 1 :(得分:0)
我想添加这个答案,因为我认为这是一个简单而重要的注意事项:
在我的情况下,我意识到我不需要为用户输入允许任何类型的关键特殊字符。我分析了这种情况并意识到这没有任何意义,并且我的任何网页都没有必要这样做。
因此,我不需要在大约60k的现有代码行上实现适当的样式化XSS安全代码,而是可以简单地安装一个过滤器来清除所有特殊字符,我不想允许这样做。
你可以看到这在用户友好性方面有点关键,但它应该没问题。
所以:如果你意识到你不需要允许任何特殊字符,那么在一个可能的上下文(例如JS,HTML,属性......)中它们将是至关重要的,那么你可以安全地考虑到你处于和我相同的情况,很多工作。
如果您从头开始工作,显然实施Neil提到的步骤仍然是正确的方式。 如果人们在编写所有JS和JSP之前已经知道了这些步骤,他们肯定会实现它们,可能需要它们或者不需要它们。
答案 2 :(得分:0)
这是我在项目中完成的与hybrys安全相关的事情的列表:
下面的链接中充满了资源以及有关Hybris安全性的详细信息。
我们经常需要从xml导入数据。
所有Sax解析器应使用以下功能:
它允许
所有输入必须使用OWASP lib json-sanitizer进行验证。参见https://www.owasp.org/index.php/OWASP_JSON_Sanitizer
示例:
String wellFormedJson = JsonSanitizer.sanitize(jsonData);
try
{
return new ObjectMapper().readValue(wellFormedJson, JsonNode.class).toString();
}
catch (final IOException ex)
{
LOG.error("Incorrect json data : " + wellFormedJson, ex);
}
来自应用程序外部的字符串不得直接记录,以防止日志注入。
控制箱
在Web上下文中,所有控制器都必须扩展BaseController。此类包含logParam方法,该方法应用于记录未知内容。
此方法使用YSanitizer.sanitize(input)
。
public class YSanitizer
{
public static String sanitize(final String input) {
String output = StringUtils.defaultString(input).trim();
output = output.replaceAll("(\\r\\n|\\r|\\n)+", " ");
output = StringEscapeUtils.escapeHtml(output);
return output;
}
}
其他情况
只需致电StringEscapeUtils.escapeJava(valToLog)
。
由于可以检查堆,因此不应将敏感数据存储在String
对象中。
独立字符串是不可变的,可以在堆中保留一段时间。
为防止此问题,所有敏感字符串必须存储在char[]
中。
(不需要该值时)应尽快用“ 0”填充此数组。
并不是说这种方法不是100%安全的,但是减少了在堆中查找密码的时间窗口。
确保de.hybris.platform.servicelayer.web.XSSFilter
在传入请求的过滤器列表中