如何阻止人们在Spring MVC中进行XSS操作?

Dou*_*oug 53 xss spring jsp spring-mvc html-escape-characters

我应该怎么做才能阻止Spring MVC中的XSS?现在我只是把我输出用户文本的所有地方放到JSTL <c:out>标签或fn:escapeXml()函数中,但这似乎容易出错,因为我可能会错过一个地方.

是否有一种简单的系统方法来防止这种情况?也许像过滤器或什么?我通过@RequestParam在控制器方法上指定参数来收集输入.

Ten*_*she 54

在Spring中,您可以从<form>标记生成的JSP页面中转义html .这为XSS攻击带来了很多途径,可以通过三种方式自动完成:

对于web.xml文件中的整个应用程序:

<context-param>
    <param-name>defaultHtmlEscape</param-name>
    <param-value>true</param-value>
</context-param>
Run Code Online (Sandbox Code Playgroud)

对于文件本身中给定页面上的所有表单:

<spring:htmlEscape defaultHtmlEscape="true" /> 
Run Code Online (Sandbox Code Playgroud)

对于每种形式:

<form:input path="someFormField" htmlEscape="true" /> 
Run Code Online (Sandbox Code Playgroud)

  • 我将context-param添加到我的web.xml但它不起作用. (4认同)
  • 我将<spring:htmlEscape defaultHtmlEscape ="true"/>放在我包含在所有页面中的包含文件中,但它似乎没有什么区别.该标记会导致$ {param.q}被转义吗? (3认同)
  • 如果你在HTML属性或Javascript中使用结果字符串,'defaultHTMLEscape`是不够的,那么使用`<c:out />`-tag.似乎defaultHtmlEscape不会转义所有html字符.它逃脱了例如'''''或'&',但双引号```没有为我转义.如果结果字符串被用在例如html属性或javascript中,这可能会导致问题. Erlend回答) (3认同)
  • 是用于输入编码还是输出转义? (2认同)

GKi*_*lin 7

@Valid对所有输入对象使用Hibernate Validator via (binding和@RequestBodyjson,请参阅https://dzone.com/articles/spring-31-valid-requestbody).@org.hibernate.validator.constraints.SafeHtml对我来说这是一个很好的解决方案.

Hibernate SafeHtmlValidator依赖于org.jsoup,因此需要再添加一个项目依赖项:

<dependency>
    <groupId>org.jsoup</groupId>
    <artifactId>jsoup</artifactId>
    <version>1.10.1</version>
</dependency>
Run Code Online (Sandbox Code Playgroud)

对于豆User

@NotEmpty
@SafeHtml
protected String name;
Run Code Online (Sandbox Code Playgroud)

用于<script>alert(123)</script>在控制器中使用值的更新尝试

@PutMapping(value = "/{id}", consumes = MediaType.APPLICATION_JSON_VALUE)
public void update(@Valid @RequestBody User user, @PathVariable("id") int id) 
Run Code Online (Sandbox Code Playgroud)

要么

@PostMapping
public void createOrUpdate(@Valid User user) {
Run Code Online (Sandbox Code Playgroud)

是抛出BindException了约束力,MethodArgumentNotValidException@RequestBody与缺省的消息:

name may have unsafe html content
Run Code Online (Sandbox Code Playgroud)

Validator也适用于绑定,就像之前的持久化一样.可以在http://topjava.herokuapp.com/上测试应用

  • 请注意,由于安全问题,现在已弃用 /sf/ask/4123939991/ (2认同)

Erl*_*end 6

当您尝试阻止XSS时,重要的是要考虑上下文.例如,如果您在javascript片段中输出变量内的数据而不是在HTML标记或HTML属性中输出数据,那么如何以及要逃避的内容就会大不相同.

我在这里有一个例子:http://erlend.oftedal.no/blog/?blogid = 91

请查看 OWASP XSS预防备忘单:http://www.owasp.org/index.php/XSS_%28Cross_Site_Scripting%29_Prevention_Cheat_Sheet

所以简短的回答是,确保你像Tendayi Mawushe建议的那样逃避输出,但在输出HTML属性或javascript中的数据时要特别小心.

  • 嗯,这不仅仅是使用 &lt;c:out /&gt;。Javascript 具有除 HTML 之外的其他控制字符,并且可以通过不同方式进行攻击,因此需要使用其他类型的转义来处理。一个简单的例子:var a = '&lt;c:out ... /&gt;'; var b = '&lt;c:out ... /&gt;'; 如果 a 中的输入是单个反斜杠,则 b 中的脚本将运行。逃逸取决于上下文。 (2认同)