这是一个曾经被问过的问题,但是我没有找到我想要的信息,或者我只是错过了要点,所以请多多包涵。如果我以错误的方式提出问题,我总是可以调整我的问题。
例如,如果我有一个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对象的所有属性上使用attribute来在属性级别使用此方法吗?可以在类级别使用一个属性来应用此属性,例如,该属性将验证和/或清除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的答案
这可能是我要寻找的最接近的一个。除非我不想对数据进行编码,因为我不想将其存储在数据库中,所以我将看看是否可以弄清楚如何引发错误,但是我不确定条件会是什么。 。也许我应该只寻找 、;之类的字符。等等...,因为在我们的任何字段中都不太可能使用这些。