如何使用具有Web API的AntiX



这是一个以前问过的问题,但我没有找到我想要的信息,或者可能我只是错过了要点,所以请耐心等待。如果我问错了问题,我总是可以调整我的问题。

例如,如果我有一个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&lt;script&gt;alert(1)&lt;/script&gt;"

那么浏览器(或任何应用程序)应该显示如下吗?:

"My Company&lt;script&gt;alert(1)&lt;/script&gt;"

3)代码:假设有一种方法可以清除或抛出错误,我应该在属性级别使用各种DTO对象的所有属性上的attribute来使用它吗?或者有没有一种方法在类级别使用验证和/或清除DTO对象所有字符串属性的attributes来应用它?

我发现了一些有趣的文章,但没有一篇真正回答我的问题,或者我对其中的一些答案有其他问题:

  • asp.net mvc AntiXs.HtmlEncode和HttpUtility.HtmlEncode之间有什么区别?

  • 使用WebAPI时停止XSS(目前正在研究这个问题,但不知道示例是如何解决问题的,因为无论我是否使用脚本标记,属性总是失败)

  • 如何使用反xss攻击来净化webapi中的输入数据(也在看这个,但在工作中从我的项目中调用ReadFromStreamAsync时遇到问题。可能是因为我的web.config中的一些设置,但还没有弄清楚为什么,但它似乎总是返回空字符串)

谢谢。

更新1:

我刚刚完成了使用WebAPI 时停止XSS的答案

这可能是最接近我想要的。除了我不想对数据进行编码,因为我不想将其存储在数据库中,所以我会看看如何抛出错误,但我不确定条件是什么。也许我应该只查找字符,如<,>,因为这些不太可能用于我们的任何领域。

  1. 在考虑编码时,您需要考虑数据的使用位置,因此只有当数据呈现为HTML时,其中包含的数据才是问题,因此,如果您要在任何地方显示用户提供的数据,可能是在您要显示它的时候,您希望对它进行html编码以供显示(例如,在保存它时,您希望避免重复对同一字符串进行html编码)。

  2. 同样,这取决于响应将用于什么。。。你可能想在它将要显示的时候对它进行html编码。。。请记住,如果您在响应中对某些内容进行编码,则它可能与数据中的内容不匹配,因此如果调用代码可以执行某些操作,例如调用API来搜索可能会导致问题的同名公司。如果浏览器确实显示了html编码的版本,它可能看起来很难看,但这比用户受到XSS攻击要好。

  3. 如果你允许大多数字符正常使用,那么很难为标签之类的东西净化文本。如果你可以将允许的字符列入白名单,并且只允许字母数字,这会更容易,但这通常是不可能的。这可以使用DTO对象上的regex验证属性来完成。我认为最好的方法是,如果无法停止某些字符,则对值进行编码以供显示。这真的很难尝试允许所有字符,但避免像人们可以开始使用ascii字符等事情。

相关内容

  • 没有找到相关文章

最新更新