[ASP.net] Web.config可以把appSettings、connectionStrings區段裡的資訊外移到網站下載不到的地方,來避免重要資訊的洩漏

[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/>");
        }
        
    
    }

執行結果:

image

※以上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檔來維護