Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/302.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在属性(如src)中防止XSS攻击?_C#_Security_Xss_Html Agility Pack - Fatal编程技术网

C# 如何在属性(如src)中防止XSS攻击?

C# 如何在属性(如src)中防止XSS攻击?,c#,security,xss,html-agility-pack,C#,Security,Xss,Html Agility Pack,因此,我一直在使用带有白名单的html敏捷性构建一个C#html消毒剂。它工作正常,除了以下情况: <img src="javascript:alert('BadStuff');" /> <img src="jav&#x09;ascript:alert('BadStuff');"> 我确实希望允许src属性,只是不允许其中包含恶意内容。我查到的所有东西都只是为标签及其属性推荐了一个白名单。你会怎么处理这样的事情呢?我知道这在任何较新的浏览器中都不起作用,但

因此,我一直在使用带有白名单的html敏捷性构建一个C#html消毒剂。它工作正常,除了以下情况:

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


我确实希望允许src属性,只是不允许其中包含恶意内容。我查到的所有东西都只是为标签及其属性推荐了一个白名单。你会怎么处理这样的事情呢?我知道这在任何较新的浏览器中都不起作用,但我对安全性不是很熟悉,而且我确信攻击者还可以做一些其他聪明的事情。

类似于“必须是有效的Uri,无论是相对的还是绝对的,使用http/https方案”的内容是一个很好的起点

只要正确地清理和处理输入,就可以安全地允许src属性。为此,您应该首先通过有效URL字符的白名单对其进行清理,然后验证它是否指向有效的图像

你提到的白名单是第一步(也是重要的一步)。要实现白名单,只需去掉对URL无效的每个字符。还要验证URL的格式是否正确,这意味着它指向用户应该能够访问的有效资源。例如,用户不应该通过传入
file://sensitive.txt
什么的。如果http或https是唯一应该使用的协议,请检查URL是否以这些协议开头。如果你特别偏执,你可能会完全拒绝这个请求,因为很明显它被篡改了。白名单很重要,但仅白名单将无法确保功能的安全

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

若要验证您指向的是有效的图像,请打开文件并读取前几个字节。不要简单地信任文件扩展名,但在打开文件之前请先检查它(为了性能和安全)。每种图像格式都有一个特定的字节模式,您可以对其进行检查。这是一个很好的模式。恶意用户仍有可能将外壳代码或其他攻击代码放入
包含正确的标题,但要做到这一点要困难得多。这将是一个性能瓶颈,因此如果您实现了这一点,请进行适当的规划。

您可以解析每个输入,或者对url进行url编码。但我不确定这是否会阻止XSS。@user1652427不确定“从XXXX开始”是什么意思?
Uri.Scheme
Uri.TryCreate
是我会使用的。我强烈怀疑你说的是使用
string.StartsWith
而不是背诵和学习。