security - 防止 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:如果我正在对响应进行编码,那么当我收到请求时我也必须放置一个解码器?
解决方案
不管你打算如何呈现或使用响应,这些攻击对攻击者来说都是可能的,例如向受害者用户发送链接,在浏览器中显示你的 api 响应。
但是,在最近的浏览器中并且在某些情况下,这可能无法利用。最重要的是,如果您的响应的内容类型是 html(例如。),则相当新的浏览器只会将响应呈现为 html(并运行脚本text/html
)。json 响应应该将其内容类型设置为application/json
,在这种情况下,javascript 将不会运行,并且不会受到 xss 的攻击。(嗯,除了非常旧的浏览器,但没有人应该再使用这些了,过去 10 年的浏览器应该没问题。)
json 响应中的编码值通常是错误的。原因是后端没有责任弄清楚如何在前端使用该值,以及为此需要什么编码。前端可能希望在 html 或 html 属性中呈现它,或创建 xml 或 csv,所有这些都需要可能不同类型的编码......因此,应该在客户端上执行适当的上下文感知编码(大多数现代客户端框架主要解决这个问题,但不是全部)。
您确实需要注意对 json 本身的响应中的值进行编码(例如处理引号,因此响应不会由于值中的引号而损坏)。但这与 xss 无关,并且可能已经由您用来生成 json 响应的框架管理。
推荐阅读
- vbscript - 对于每个带有模式的循环问题
- r - 使用 R 过滤条件内的条件
- ios - 在 SwiftUI 中,是否可以仅对某个 os 目标使用修饰符?
- linux - 让我们加密证书 365 天
- python - tesserocr 能否给出空间特征(文本位置、边界框等)?
- html - 删除 SUBDOMAIN url 中的 .html 文件扩展名
- angular - 如果用户以角度关闭浏览器,如何触发
- python - 如何处理 pandas 中相辅相成的重复数据?
- scrapy - 如何在 Scrapy Splash 中加载本地 HTML 文件?
- ionic4 - 离子 4/5 中的离子选择选项?