【发布时间】:2019-11-10 21:15:41
【问题描述】:
这是一个以前被问过的问题,但我没有找到我正在寻找的信息,或者我只是错过了重点,所以请多多包涵。如果我问错了问题,我总是可以调整我的问题。
例如,如果我有一个 POST 端点,它使用具有 2 个属性(即 companyRequestDto)的简单 DTO 对象,并在其属性之一中包含一个脚本标记。当我从Postman 调用我的端点时,我使用以下内容:
{
"company": "My Company<script>alert(1);</script>",
"description": "This is a description"
}
当我的端点中的操作收到它时,
public void Post(CompanyRequestDto companyRequestDto)
我的 DTO 对象将自动设置,其属性将设置为:
companyDto.Company = "My Brand<script>alert(1);</script>";
companyDto.Description = "This is a description";
我显然不希望这些信息按原样存储在我们的数据库中,也不希望它存储为如上所示的转义字符串。
1) 请求:所以我的第一个问题是,如果发布的 DTO 包含一些无效内容,例如标签,我该如何抛出错误?
我查看了 Microsoft AntiXss,但我不明白如何处理这个问题,因为 DTO 对象的属性中提供的数据不是 html 字符串,而只是一个字符串,所以我在这里缺少什么'不明白这如何帮助清理或验证传递的数据。
当我打电话时
var test = AntiXss.AntiXssEncoder.HtmlEncode(companyRequestDto.Company, true);
它返回一个编码字符串,然后呢??
有没有办法删除不允许使用的关键字或只是简单地抛出一个错误?
2) 响应: 假设 1) 没有实现或无法正常工作,并且最终存储在我们的数据库中,我想将编码数据作为 json 字符串返回,所以改为返回:
"My company"
我想回来吗:
"My Company<script>alert(1)</script>"
浏览器(或任何应用程序)是否应该显示如下?:
"My Company<script>alert(1)</script>"
3) 代码: 假设有一种清理或抛出错误的方法,我应该在属性级别使用我的各种 DTO 对象的所有属性的属性,还是有办法例如,使用将验证和/或清理 DTO 对象的所有字符串属性的属性在类级别应用此功能?
我找到了有趣的文章,但没有一个真正回答我的问题,或者我对某些答案有其他问题:
asp.net mvc What is the difference between AntiXss.HtmlEncode and HttpUtility.HtmlEncode?
Stopping XSS when using WebAPI(目前正在研究这个,但看不到示例如何解决问题,因为无论我是否使用脚本标签,属性总是失败)
how to sanitize input data in web api using anti xss attack(也在看这个,但在我的工作项目中调用
ReadFromStreamAsync时遇到问题。可能与我的 web.config 中的一些设置有关,但还没有弄清楚原因它似乎总是返回一个空字符串)
谢谢。
更新 1:
我刚刚看完了Stopping XSS when using WebAPI的答案
这可能是最接近我正在寻找的东西。除了我不想对数据进行编码,因为我不想将它存储在我的数据库中,所以我会看看我是否能弄清楚如何抛出错误,但我不确定条件会是什么.也许我应该只寻找诸如 、; 之类的字符。等...因为这些不太可能在我们的任何领域中使用。
【问题讨论】:
标签: c# json asp.net-web-api asp.net-web-api2 antixsslibrary