【问题标题】:How to use AntiXss with a Web API如何通过 Web API 使用 AntiXss
【发布时间】: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&lt;script&gt;alert(1)&lt;/script&gt;"

浏览器(或任何应用程序)是否应该显示如下?:

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

3) 代码: 假设有一种清理或抛出错误的方法,我应该在属性级别使用我的各种 DTO 对象的所有属性的属性,还是有办法例如,使用将验证和/或清理 DTO 对象的所有字符串属性的属性在类级别应用此功能?

我找到了有趣的文章,但没有一个真正回答我的问题,或者我对某些答案有其他问题:

谢谢。

更新 1:

我刚刚看完了Stopping XSS when using WebAPI的答案

这可能是最接近我正在寻找的东西。除了我不想对数据进行编码,因为我不想将它存储在我的数据库中,所以我会看看我是否能弄清楚如何抛出错误,但我不确定条件会是什么.也许我应该只寻找诸如 、; 之类的字符。等...因为这些不太可能在我们的任何领域中使用。

【问题讨论】:

标签: c# json asp.net-web-api asp.net-web-api2 antixsslibrary


【解决方案1】:
  1. 在考虑编码时,您需要考虑数据将在哪里使用,因此只有在呈现为 HTML 时才会出现问题任何地方的用户,很可能在您要显示它的时候,您希望对其进行 html 编码以进行显示(例如,您希望避免在保存相同的字符串时重复 html 编码)。

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

  3. 如果您允许大多数字符正常使用,则很难为诸如标签之类的内容清理文本。如果您可以将允许的字符列入白名单并且只允许使用字母数字等字符会更容易,但这通常是不可能的。这可以使用 DTO 对象上的正则表达式验证属性来完成。如果您无法停止某些字符,我认为最好的方法是对显示值进行编码。尝试允许所有字符确实很难,但要避免人们可以开始使用 ascii 字符等。

【讨论】:

  • 关于 1,AntiXss 用于客户端(ASP.NET MVC Web 应用程序),但 PEN 测试仅应用于 API,他们将此报告为问题。我认为这将由客户来相应地处理,但它已向我们推荐,我认为这是公平的,我们也应该在 API 级别防止此类攻击,以确保数据至少不会保存到我们的数据库包含。我将在几秒钟内根据我正在查看的 SA 问题的内容更新我的答案。
  • 有趣...您可以将您可以允许用于您的字段的字符列入白名单吗?如果你只是不允许东西进入你的数据库,那么解决问题会容易得多
  • @Thierry,看看 Sahin Dohan 在这篇文章中的回答,看起来 Sahin 发现 htmlsanitizer 更好...stackoverflow.com/questions/12618432/…
  • 我已经向他发送了一个问题,因为我对他的回答有疑问。我会再看一遍,但我的问题是我不是在处理 html 而是在处理 json,所以我不确定如何使用 htmlsanitizer 以确保对提供的 json 进行清理或抛出错误.我越来越倾向于在我的 modelState 验证属性中包含基本验证,我将拒绝诸如 、/>、(、)、; 等字符。如果检测到。可能是非常基本的,我会在明天与业务部门核实,因为这可能就足够了。
  • 关于您的第 2 点),这就是为什么我认为如果检测到任何这些无效字符,我宁愿抛出错误,因为我不希望将编码数据存储在我们的数据库中。只是没有意义。
猜你喜欢
  • 2011-10-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-25
  • 2022-01-23
相关资源
最近更新 更多