我如何防止src等属性中的XSS攻击?

时间:2013-03-07 20:54:35

标签: c# security xss html-agility-pack

所以我一直在使用带有白名单的html敏捷性构建一个C#html清理程序。它的工作正常,除了像这样的情况:

<img src="javascript:alert('BadStuff');" />
<img src="jav&#x09;ascript:alert('BadStuff');"> 

我想要允许src属性,显然不是恶意内容。我查找过的所有内容都推荐了一个标签及其属性的白名单。你会怎么处理这样的事情呢?我知道这不适用于任何新的浏览器,但我对安全性不是很熟悉,而且我确信攻击者可以做一些其他聪明的事情。

3 个答案:

答案 0 :(得分:5)

跨站点脚本(XSS)攻击通过注入客户端脚本代码来利用网页验证中的漏洞。使Web应用程序容易受到跨站点脚本攻击的常见漏洞包括无法正确验证输入,无法编码输出以及信任从共享数据库检索的数据。要保护您的应用程序免受跨站点脚本攻击,请假设所有输入都是恶意的。约束并验证所有输入。对可能包含HTML字符的所有输出进行编码。这包括从文件和数据库中读取的数据。

当攻击者编写脚本以检索提供对受信任站点的访问权限的身份验证cookie,然后将cookie发布到攻击者已知的Web地址时,会发生跨站点脚本攻击的最严重示例之一。这使攻击者能够欺骗合法用户的身份并获取对网站的非法访问权。

使您的Web应用程序容易受到跨站点脚本攻击的常见漏洞包括:

  • 未能约束和验证输入。
  • 无法对输出进行编码。
  • 信任从共享数据库中检索的数据。

准则

防止跨站点脚本攻击的两个最重要的对策是:

  • 限制输入。
  • 编码输出。

步骤摘要

要阻止跨站点脚本,请执行以下步骤:

步骤1。检查是否已启用ASP.NET请求验证。

第2步。查看生成HTML输出的ASP.NET代码。

第3步。确定HTML输出是否包含输入参数。

第4步。查看具有潜在危险的HTML标记和属性。

第5步。评估对策。

有关详细信息,请参阅第二个参考。

参考文献:

<强> Cross-site scripting explained: How to prevent XSS attacks

<强> How To: Prevent Cross-Site Scripting in ASP.NET

答案 1 :(得分:0)

像“必须是有效的Uri无论是相对还是绝对的http / https方案”都是一个很好的起点。

答案 2 :(得分:0)

如果您正确清理并处理输入,则可以安全地允许src属性。为此,您应首先通过有效网址字符canonicalize it的白名单对其进行清理,然后验证它是否指向有效图片。

您提到的白名单是第一步(也是重要的一步)。要实现白名单,只需删除对URL无效的每个字符。还要验证URL是否正确形成,这意味着它指向用户应该能够访问的有效资源。例如,用户不应通过传入file://sensitive.txt或其他内容来访问服务器上的本地文件。如果http或https是唯一应该使用的协议,请检查URL是否以这些协议开头。如果你是特别偏执,你可以完全拒绝这个请求,因为很明显它已被篡改。白名单非常重要,但单独使用白名单 可以保证该功能的安全。

规范化很重要,因为许多攻击依赖于提交最终将您带到某个位置的URL,但可能会滥用计算机天生的缺乏推理来获取它不应该的东西。这也有助于消除可能提高性能的相同资源的重复路径(或者至少允许您通过不重新检查自上次检查以来未更改的已知文件来提高性能。请注意这一点,因为可以欺骗上次修改日期,以便攻击者可以在您已经“检查并信任”它之后交换恶意文件。

要验证您是否指向有效图像,请打开该文件并读入前几个字节。 只是信任文件扩展名,但在打开文件之前先检查它(为了性能和安全性)。每种图像格式都有一定的字节模式,您可以检查。 look at first is JPEG的好词。恶意用户可能仍然可能将shellcode或其他攻击代码放入图像文件中 包含正确的标题,但要做得更困难。这将是一个性能瓶颈,因此如果您实现这一点,请做好相应的计划。