Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/15.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# 与Windows文件路径中的特殊字符相关的安全漏洞_C#_Windows_Special Characters_Filenames - Fatal编程技术网

C# 与Windows文件路径中的特殊字符相关的安全漏洞

C# 与Windows文件路径中的特殊字符相关的安全漏洞,c#,windows,special-characters,filenames,C#,Windows,Special Characters,Filenames,我可能在我的Windows应用程序中发现了一个安全漏洞。它从用户处接收字符串并应用以下逻辑: string fileName = userInput + ".notSecret"; return new FileStream(fileName, FileMode.Open, FileAccess.Read); 用户是否可以通过提前终止文件名来输入允许其输入新文件扩展名的任何字符 例如: “机密\u文件。机密\0” 您指出的情况很可能不是安全缺陷。首先,.NET字符串不是空截断的,可能包含空字符

我可能在我的Windows应用程序中发现了一个安全漏洞。它从用户处接收字符串并应用以下逻辑:

string fileName = userInput + ".notSecret";
return new FileStream(fileName, FileMode.Open, FileAccess.Read);
用户是否可以通过提前终止文件名来输入允许其输入新文件扩展名的任何字符

例如:

“机密\u文件。机密\0”


您指出的情况很可能不是安全缺陷。首先,.NET字符串不是空截断的,可能包含空字符。此外,如果您尝试在
StreamWriter
构造函数中创建一个包含控制字符的文件,包括
\0
,您会发现它引发异常:

未处理的异常:System.ArgumentException:路径中的非法字符。
在System.IO.Path.CheckInvalidPathChars处(字符串路径,布尔值checkAdditional)
在System.IO.Path.GetFileName(字符串路径)处
位于System.IO.StreamWriter.CreateFile(字符串路径、布尔追加、布尔检查主机)
位于System.IO.StreamWriter..ctor(字符串路径、布尔追加、编码编码、Int32 bufferSize、布尔校验主机)
在System.IO.StreamWriter..ctor处(字符串路径)
请注意,如果.NET IO framework支持备用数据流,则会存在安全漏洞;用户可以写入“
userInput.secret:.notSecret
”,强制写入“userInput.secret”的备用数据流。由于System.IO类不支持备用数据流,因此会抛出
NotSupportedException
,并且不会写入恶意文件

在使用文件扩展名作为安全控制时,存在潜在的文件系统影响。例如,如果用户将扩展名为
.notSecret
的文件映射为扩展名为
.secret
的文件,则向一个文件写入也会向另一个文件写入(因为在硬链接中,一个文件可以有多个扩展名不同的路径)


假设
userInput
是用户提供的原始代码,则该代码无法清理用户输入。当处理来自不可信源的输入时,代码应假定为。如果用户的输入预期为某个值(例如,没有特殊字符),则处理输入的代码应确保其匹配,如果不匹配,则对其进行清理(或引发异常)。只允许已知为好的输入比只允许已知为坏的输入安全得多。

在您提出此问题后的50分钟内,您可以在代码中设置断点,点击F5并亲自尝试。我只是说。@Tim-我试了大约20个不同的特殊字符,包括这一个,并在谷歌上广泛搜索。说到安全性,我宁愿安全也不后悔,所以我问了这个问题,以防我错过了一个可能的漏洞。谢谢你的输入。我一定会消毒的。