首页 > 解决方案 > 防止 webapi 上的 XSS

问题描述

我有一个接受 json 并返回记录的 webapi post 方法。

public ProductResponse Post(ProductRequest reqObj){
    //search the record
    //var responseObject = //search in db using ProductRequest.Name
    return responseObject;
}

public class ProductRequest{
    public string Name {get;set;}
}

因此,如果请求进来就像{"Name": "iPhone"}它查找并返回响应一样{"Name": "iPhone", "price": "25.00", "Description":"lorem ipsum"},如果产品不存在则它返回{"Name": "iPhone", "error": "product doesn't exists"}

我被告知该 api 容易受到 XSS 攻击,因为当用户发送{"Name": "iPhone<script>alert(1);</script>"}然后他得到的响应是{"Name": "iPhone<script>alert(1);</script>", "error": "product doesn't exists"}. 期望标签应该已经被编码。

问题 1:当我不直接将内容渲染到浏览器时,它是否容易受到 XSS 的攻击?

问题2:如果我正在对响应进行编码,那么当我收到请求时我也必须放置一个解码器?

标签: securityasp.net-web-apixss

解决方案


不管你打算如何呈现或使用响应,这些攻击对攻击者来说都是可能的,例如向受害者用户发送链接,在浏览器中显示你的 api 响应。

但是,在最近的浏览器中并且在某些情况下,这可能无法利用。最重要的是,如果您的响应的内容类型是 html(例如。),则相当新的浏览器只会将响应呈现为 html(并运行脚本text/html)。json 响应应该将其内容类型设置为application/json,在这种情况下,javascript 将不会运行,并且不会受到 xss 的攻击。(嗯,除了非常旧的浏览器,但没有人应该再使用这些了,过去 10 年的浏览器应该没问题。)

json 响应中的编码值通常是错误的。原因是后端没有责任弄清楚如何在前端使用该值,以及为此需要什么编码。前端可能希望在 html 或 html 属性中呈现它,或创建 xml 或 csv,所有这些都需要可能不同类型的编码......因此,应该在客户端上执行适当的上下文感知编码(大多数现代客户端框架主要解决这个问题,但不是全部)。

您确实需要注意对 json 本身的响应中的值进行编码(例如处理引号,因此响应不会由于值中的引号而损坏)。但这与 xss 无关,并且可能已经由您用来生成 json 响应的框架管理。


推荐阅读