这是一个以前问过的问题,但我没有找到我想要的信息,或者可能我只是错过了要点,所以请耐心等待。如果我问错了问题,我总是可以调整我的问题。
例如,如果我有一个POST端点,它使用一个具有2个属性的简单DTO对象(即companyRequestDto),并且在其中一个属性中包含一个脚本标记。当我从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 AntiX,但我不知道如何处理它,因为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对象所有字符串属性的attributes来应用它?
我发现了一些有趣的文章,但没有一篇真正回答我的问题,或者我对其中的一些答案有其他问题:
asp.net mvc AntiXs.HtmlEncode和HttpUtility.HtmlEncode之间有什么区别?
使用WebAPI时停止XSS(目前正在研究这个问题,但不知道示例是如何解决问题的,因为无论我是否使用脚本标记,属性总是失败)
如何使用反xss攻击来净化webapi中的输入数据(也在看这个,但在工作中从我的项目中调用
ReadFromStreamAsync
时遇到问题。可能是因为我的web.config中的一些设置,但还没有弄清楚为什么,但它似乎总是返回空字符串)
谢谢。
更新1:
我刚刚完成了使用WebAPI 时停止XSS的答案
这可能是最接近我想要的。除了我不想对数据进行编码,因为我不想将其存储在数据库中,所以我会看看如何抛出错误,但我不确定条件是什么。也许我应该只查找字符,如<,>,因为这些不太可能用于我们的任何领域。
-
在考虑编码时,您需要考虑数据的使用位置,因此只有当数据呈现为HTML时,其中包含的数据才是问题,因此,如果您要在任何地方显示用户提供的数据,可能是在您要显示它的时候,您希望对它进行html编码以供显示(例如,在保存它时,您希望避免重复对同一字符串进行html编码)。
-
同样,这取决于响应将用于什么。。。你可能想在它将要显示的时候对它进行html编码。。。请记住,如果您在响应中对某些内容进行编码,则它可能与数据中的内容不匹配,因此如果调用代码可以执行某些操作,例如调用API来搜索可能会导致问题的同名公司。如果浏览器确实显示了html编码的版本,它可能看起来很难看,但这比用户受到XSS攻击要好。
-
如果你允许大多数字符正常使用,那么很难为标签之类的东西净化文本。如果你可以将允许的字符列入白名单,并且只允许字母数字,这会更容易,但这通常是不可能的。这可以使用DTO对象上的regex验证属性来完成。我认为最好的方法是,如果无法停止某些字符,则对值进行编码以供显示。这真的很难尝试允许所有字符,但避免像人们可以开始使用ascii字符等事情。