C# 如何确保用户提供的url不是本地路径?
我正在编写一个web应用程序(ASP.Net MVC,C#),它要求用户提供指向RSS或Atom提要的URL,然后我使用以下代码阅读这些URL:C# 如何确保用户提供的url不是本地路径?,c#,asp.net,.net,security,C#,Asp.net,.net,Security,我正在编写一个web应用程序(ASP.Net MVC,C#),它要求用户提供指向RSS或Atom提要的URL,然后我使用以下代码阅读这些URL: var xmlRdr = XmlReader.Create(urlProvidedByUserAsString); var syndicFeed = SyndicationFeed.Load(xmlRdr); 在调试我的应用程序时,我意外地将/something/like/this作为url传递,我得到一个异常,告诉我C:\something\lik
var xmlRdr = XmlReader.Create(urlProvidedByUserAsString);
var syndicFeed = SyndicationFeed.Load(xmlRdr);
在调试我的应用程序时,我意外地将/something/like/this
作为url传递,我得到一个异常,告诉我C:\something\like\this
无法打开
看起来用户可以提供本地路径,而我的应用程序会尝试读取它
如何使此代码安全?在url开头检查https://
或http://
可能是不够的,因为用户仍然可以输入类似http://localhost/blah
。有没有其他方法,可能是通过uri类来检查url是否指向web
编辑:我想我还需要防止用户输入指向我网络上其他机器的地址,例如:http://192.168.0.6/
或http://AnotherMachineName/
试试:
new Uri(@"http://stackoverflow.com").IsLoopback
new Uri(@"http://localhost/").IsLoopback
new Uri(@"c:\windows\").IsLoopback
太好了,这似乎可以。然而,我只是想到另一个情况,这可能无法处理。如果用户输入
http://anotherMachineNameOrIpOnMyNetwork/
?默认情况下,我们公司通常被阻止从DMZ访问LAN和其他DMZ服务器(在DMZ网络内),只允许访问特定服务和internet。此外,您还可以解析指定URL的IP,并检查它们的本地网络区域。当然,所有内容都应该进行防火墙保护,但我仍然希望确保我不会让任何门打开。