[ASP.net] Web.config可以把appSettings、connectionStrings區段裡的資訊外移到網站下載不到的地方,來避免重要資訊的洩漏
先看一般Web.config中大概會有怎樣的訊息
<?xml version="1.0"?>
<!--
如需如何設定 ASP.NET 應用程式的詳細資訊,請造訪
http://go.microsoft.com/fwlink/?LinkId=169433
-->
<configuration>
<appSettings>
<!--寄信功能會用到的smtp相關設定-->
<add key="smtp_server" value="msa.hinet.net"/>
<add key="smtp_server_UserName" value="shadow"/>
<add key="smtp_server_UserPWD" value="P@ssw0rd"/>
</appSettings>
<connectionStrings>
<add name="NorthwindConnectionString" connectionString="Data Source=.\sqlexpress;Initial Catalog=Northwind;Integrated Security=True"
providerName="System.Data.SqlClient"/>
</connectionStrings>
<system.web>
<httpRuntime maxRequestLength="102400" />
<compilation debug="false" targetFramework="4.0">
<assemblies>
<add assembly="WindowsBase, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
</assemblies>
</compilation>
</system.web>
</configuration>
雖說ASP.net網站預設是無法下載Web.config檔,但事情總是會有難免的
以上面Web.config裡的資訊來說,它透漏了此網站寄信時是使用哪個SMTP_Server、資料庫連線字串等等的敏感訊息
萬一此檔案被駭客下載,通常就大事不妙
所以是有這樣的技巧
把敏感資訊整理成一個Config.xml檔
<?xml version="1.0" encoding="utf-8" ?>
<Config>
<mail smtp_server="msa.hinet.net" UserName="Shadow" UserPWD="P@ssw0rd" />
<DBconnectionStrings>
<connString name="NorthwindConnectionString"
connectionString="Data Source=.\sqlexpress;Initial Catalog=Northwind;Integrated Security=True"
providerName="System.Data.SqlClient" />
</DBconnectionStrings>
</Config>
然後再把此檔案移至網站資料夾外面,例如C:\Config.xml
重點是不要讓網站有機會可以下載到此xml檔
接著回過頭修改Web.config
<?xml version="1.0"?>
<configuration>
<!--只紀錄該xml檔的路徑-->
<appSettings>
<add key="ConfigPath" value="C:\Config.xml"/>
</appSettings>
<system.web>
<compilation debug="false" targetFramework="4.0">
<assemblies>
<add assembly="WindowsBase, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
</assemblies>
</compilation>
</system.web>
</configuration>
接著看程式如何利用Linq to XML叫用C:\Config.xml的資訊
//取得Config.xml檔的檔案總管路徑
string ConfigPath = WebConfigurationManager.AppSettings["ConfigPath"];
protected void Page_Load(object sender, EventArgs e)
{
FileStream fs = new FileStream(ConfigPath, FileMode.Open, FileAccess.ReadWrite, FileShare.ReadWrite);
XDocument doc = XDocument.Load(fs);
fs.Close();
var attrs = from attr in doc.Element("Config").Element("mail").Attributes()
select attr;
//走訪smtp_server訊息
foreach (var item in attrs)
{
Response.Write(item.Name+":"+item.Value+"<hr/>");
}
//可能有很多個連線字串
var elements = from s in doc.Element("Config").Element("DBconnectionStrings").Elements("connString")
select s;
//走訪各連線字串的Attribute
attrs = from a in elements.Attributes()
select a;
foreach (var item in attrs)
{
Response.Write(item.Name + ":" + item.Value + "<hr/>");
}
}
執行結果:
※以上Linq to XML可以再封裝成一個物件專門獲取Config.xml資料
如此一來即使駭客取得Web.config檔,但重要資訊卻在服務器上的其他地方,至少多了一層保護
衍伸閱讀文章:
Linq to XML操作的相關討論:如何殺掉xml中最後一筆資料?
基本查詢 (LINQ to XML) MSDN
善用App_Data的隱身特性 by 黑暗執行緒
[ASP.NET]利用configSource將web.config的connectionStrings移到另一個config檔來維護