摘要:論述了面向Internet開放的信息系統(tǒng)由于用戶群復(fù)雜而存在較大的安全問題,同時(shí)論述了我院教學(xué)管理信息平臺的安全機(jī)制。針對基于ASP.NET和SQL Server 2005構(gòu)建的信息系統(tǒng),通過基于角色的窗體安全認(rèn)證機(jī)制確保程序訪問安全、防止SQL注入攻擊確保數(shù)據(jù)庫的安全、通過存儲過程操作數(shù)據(jù)庫加強(qiáng)數(shù)據(jù)庫的安全,這些技術(shù)的應(yīng)用大大加強(qiáng)了系統(tǒng)的安全性,具有很強(qiáng)的推廣價(jià)值。
關(guān)鍵詞:管理信息系統(tǒng);安全;ASP.NET
中圖分類號:TP311文獻(xiàn)標(biāo)識碼:A 文章編號:1009-3044(2010)05-1114-04
The Research and Practice for Management Information System Security Based on ASP.NET
WANG Rong-ze
(Guangxi Agricultural Vocation-Technical College,Nanning 53007,China)
Abstract: Discusses the open information system for Internet user base due to the complex and there is a big security problems, and discusses the teaching management information platform security mechanisms. For Information Systems based on ASP.NET and SQL Server 2005, through role-based security authentication mechanism to ensure that the form access security procedures to prevent SQL injection attacks to ensure the security of the database, through the operation of the database stored procedure to enhance the security of the database, The application of these technologies greatly enhance the system's security, has a strong promotion of the value.
Key words: management information systems; security; ASP.NET
ASP.NET和SQL Server 2005結(jié)合是開發(fā)Web模式管理信息系統(tǒng)的主要技術(shù)路線,我院的教學(xué)管理信息平臺等信息系統(tǒng)都基于這技術(shù)路線開發(fā)。由于用戶群較復(fù)雜,有本校教師、學(xué)生和社會人士等,系統(tǒng)許多功能必須面對Internet開放,安全性受到極大威脅。因此,研究基于.NET平臺的信息安全技術(shù)和方案具有很強(qiáng)的現(xiàn)實(shí)意義和推廣價(jià)值。
1 系統(tǒng)的安全機(jī)制分析
我院的教學(xué)管理信息平臺基于Internet開放,其系統(tǒng)安全機(jī)制如圖1所示。信息系統(tǒng)的程序位于防火墻的DMZ區(qū),處于網(wǎng)絡(luò)隔離區(qū)和屏蔽子網(wǎng)之間,防火墻將它與 Internet 和單位內(nèi)部網(wǎng)絡(luò)(以及 SQL Server 數(shù)據(jù)庫)隔離開。保護(hù)系統(tǒng)的安全主要就是保護(hù)SQL Server 數(shù)據(jù)庫的安全。實(shí)施系統(tǒng)的安全方案時(shí),充分利用SQL Server 2005的安全機(jī)制、ASP.NET訪問數(shù)據(jù)庫的安全機(jī)制、編寫程序時(shí)的防SQL注入攻擊、Web服務(wù)器的安全加固等。
2 基于角色的窗體安全認(rèn)證機(jī)制實(shí)現(xiàn)程序的訪問安全
在系統(tǒng)實(shí)現(xiàn)過程中,充分利用ASP.NET 提供的基于角色(即 Roles)的認(rèn)證機(jī)制實(shí)現(xiàn)系統(tǒng)的安全。
2.1 數(shù)據(jù)庫及表的準(zhǔn)備
1)教學(xué)管理信息平臺數(shù)據(jù)庫:gxnzyinfo。2)涉及到的主要數(shù)據(jù)庫表和字段:用戶信息表UserInfo(如表1所示),3個(gè)主要字段,用戶名,密碼,用戶角色;角色信息表UserRoles(如表2所示),兩個(gè)主要字段,角色名稱,角色所管理的目標(biāo)目錄。
2.2 編寫系統(tǒng)登錄程序Login.aspx
Login.aspx 添加兩個(gè)TextBox控件,取名 UserNameTextBox, PasswordTextBox,再添加一個(gè)Button,取名 LoginButton,點(diǎn)擊它進(jìn)入后臺代碼。在 LoginButton_Click 方法中添加需要的代碼:
private void LoginButton_Click(object sender, System.EventArgs e)
{ FormsAuthentication.Initialize ();
//連接并從表UserInfo 讀取數(shù)據(jù)
if (reader.Read())
{
FormsAuthenticationTicket ticket = new FormsAuthenticationTicket(
1, // 票據(jù)版本號
UserNameTextBox.Text, // 票據(jù)持有者
DateTime.Now, //分配票據(jù)的時(shí)間
DateTime.Now.AddMinutes(30), true,
// 需要用戶的 cookie
reader.GetString(0), // 用戶數(shù)據(jù),這里其實(shí)就是用戶的角色
FormsAuthentication.FormsCookiePath);//cookie有效路徑
string hash = FormsAuthentication.Encrypt(ticket);
HttpCookie cookie = new HttpCookie(
FormsAuthentication.FormsCookieName, // 認(rèn)證cookie的名稱
hash); //加密之后的cookie
if (ticket.IsPersistent) cookie.Expires = ticket.Expiration;
Response.Cookies.Add(cookie);
string returnUrl = Request.QueryString[\"ReturnUrl\"];
if (returnUrl == 1) returnUrl = \"./\";
Response.Redirect(returnUrl);
}
2.3 創(chuàng)建(或修改) Global.asax 文件
在Global.asax 文件中找到(或新建)Application_AuthenticationRequest 方法(函數(shù))。文件中要確認(rèn)已經(jīng)包含或者使用了 System.Security.Principal 以及 System.Web.Security 命名空間,然后修改它,修改后的代碼如下:
protected void Application_AuthenticateRequest(Object sender, EventArgs e)
{
if (HttpContext.Current.User != 1)
{
if (HttpContext.Current.User.Identity.IsAuthenticated)
{
if (HttpContext.Current.User.Identity is FormsIdentity)
{
FormsIdentity id =
(FormsIdentity)HttpContext.Current.User.Identity;
FormsAuthenticationTicket ticket = id.Ticket;
// 取存儲在票據(jù)中的用戶數(shù)據(jù),在這里其實(shí)就是用戶的角色
string userData = ticket.UserData;
string[] roles = userData.Split(',');
HttpContext.Current.User = new GenericPrincipal(id, roles);
……
認(rèn)證票據(jù)(用戶名和密碼)沒有(也不應(yīng)該)作為cookie的一部分來存儲的,因?yàn)橛脩艨梢孕薷乃麄兊腸ookie。本質(zhì)上,F(xiàn)ormsAuthentication是用機(jī)器碼 machine key(在 machine.config 中)來加密票據(jù)FormsAuthenticationTicket的。我們使用 UserData 存儲用戶角色,并且生成一個(gè)新的憑證。一旦憑證已經(jīng)創(chuàng)建,它會被添加到當(dāng)前上下文中(即 HttpContext),用它來取回用戶角色。
2.4 設(shè)置web.config文件,限制對特定目錄的訪問
要實(shí)現(xiàn)安全認(rèn)證,在 Web應(yīng)用程序根目錄下的 Web.config 文件中找到
上面的 name=\"AMUHOUSE.ASPXAUTH\" 中,AMUHOUSE.ASPXAUTH 這個(gè)名稱是任意的。要控制用戶或者用戶組的權(quán)限,Web.config應(yīng)該添加有下面的內(nèi)容(或者類似的內(nèi)容):
至此,已經(jīng)為系統(tǒng)配置了基于角色的安全認(rèn)證機(jī)制了。我們可以先編譯程序,然后嘗試訪問一個(gè)機(jī)密目錄,例如 http://localhost/Admin/default.aspx ,這時(shí)候系統(tǒng)就會被轉(zhuǎn)向到用戶登錄頁面。如果登錄成功,并且你的角色對這個(gè)目錄有訪問權(quán)限(如:使用zxm用戶),就可重新回到這個(gè)目錄下。如果有用戶(或入侵者)企圖進(jìn)入機(jī)密目錄,可以使用一個(gè) Session 來存儲用戶登錄的次數(shù),超過一定次數(shù)就禁止登錄,并且顯示\"系統(tǒng)拒絕了你的登錄請求!\"。通過ASP.NET基于角色的窗體安全認(rèn)證機(jī)制,按以上方法就可實(shí)現(xiàn)不同角色用戶訪問不同目錄下的程序,大大加強(qiáng)了系統(tǒng)的安全性。
3 防止SQL注入攻擊確保數(shù)據(jù)庫的安全
SQL注入攻擊是威脅Web系統(tǒng)安全常見問題之一,我院的教學(xué)管理信息平臺自運(yùn)行以來就受到過數(shù)次SQL注入攻擊,嚴(yán)重威脅SQL Server數(shù)據(jù)庫的安全。經(jīng)過不斷的調(diào)整和改進(jìn),取得較好效果,總體方案如下:
3.1 在系統(tǒng)中嚴(yán)格區(qū)分不同帳戶的權(quán)限
1)嚴(yán)格劃分出教學(xué)管理信息平臺中使用數(shù)據(jù)庫的權(quán)限。第一類:對數(shù)據(jù)庫表僅具有SELECT權(quán)限,權(quán)限最低,如教學(xué)資源信息的查詢功能程序;第二類:只對某個(gè)數(shù)據(jù)庫表的部分字段有UPDATE權(quán)限,沒有INSERT和DELETE權(quán)限, 如學(xué)生自己修改學(xué)生基本信息的部分內(nèi)容;第三類:只具有對某幾個(gè)數(shù)據(jù)庫表的INSERT和UPDATE權(quán)限,沒有DELETE權(quán)限,如學(xué)生評教信息錄入;第四類:對表具有所有操作權(quán)限,如系統(tǒng)管理員。
2)創(chuàng)建相對應(yīng)的數(shù)據(jù)庫用戶。根據(jù)以上分析,給系統(tǒng)的數(shù)據(jù)庫建立與程序功能相對應(yīng)的多個(gè)數(shù)據(jù)庫用戶,并且設(shè)置好每個(gè)用戶所操作的數(shù)據(jù)庫對象。
3)在web.config文件中創(chuàng)建數(shù)據(jù)庫連接串。在Web.config文件中建立數(shù)據(jù)庫連接串,不同的功能使用不同的數(shù)據(jù)庫連接串,連接串與數(shù)據(jù)庫用戶一一對應(yīng),如圖2所示。
通過權(quán)限細(xì)致的劃分,并且禁止sa用戶的使用,系統(tǒng)的安全性大大提高,實(shí)踐證明,經(jīng)過這種方法處理,原來受到攻擊的地方也已得以安全保護(hù)。
3.2 采用專門程序嚴(yán)格驗(yàn)證和過濾用戶輸入的信息
進(jìn)行SQL注入攻擊者往往利用系統(tǒng)與用戶交互的過程中,可以在表單輸入信息,也可以在URL處輸入信息的機(jī)會進(jìn)行SQL語句注入攻擊,因此,我們只要嚴(yán)格過濾用戶在表單或URL處輸入的信息,這樣可大大降低SQL注入的風(fēng)險(xiǎn),詳細(xì)方法如下:
1)創(chuàng)建(或修改)Global.asax文件。Global.asax文件(也稱作ASP.NET應(yīng)用程序文件)是可選文件,包含用于響應(yīng)ASP.NET或HttpModule引發(fā)的應(yīng)用程序級別事件的代碼。Global.asax文件駐留在基于ASP.NET的應(yīng)用程序的根目錄中。在運(yùn)行時(shí),分析Global.asax文件并將其編譯到一個(gè)動態(tài)生成的.NET Framework類,該類是從HttpApplication基類派生的。Global.asax文件本身被配置為自動拒絕對它的任何直接URL請求;外部用戶無法下載或查看在該文件中編寫的代碼。正是利用Global.asax文件的這個(gè)特點(diǎn),我們在它下面加上以下代碼:
private void StartProcessRequest() //在void Application_BeginReques中運(yùn)行
if (System.Web.HttpContext.Current.Request.QueryString != 1)
{
for (int i = 0; i < System.Web.HttpContext.Current.Request.QueryString.Count; i++)
{
getkeys = System.Web.HttpContext.Current.Request.QueryString.Keys[i];
if (!ProcessSqlStr(System.Web.HttpContext.Current.Request.QueryString[getkeys]))
{
System.Web.HttpContext.Current.Response.Redirect(sqlErrorPage);
System.Web.HttpContext.Current.Response.End();
}
}
}
if (System.Web.HttpContext.Current.Request.Form != 1)
{
for (int i = 0; i < System.Web.HttpContext.Current.Request.Form.Count; i++)
{
getkeys = System.Web.HttpContext.Current.Request.Form.Keys[i];
if (getkeys == \"__VIEWSTATE\") continue;
if (!ProcessSqlStr(System.Web.HttpContext.Current.Request.Form[getkeys]))
{
System.Web.HttpContext.Current.Response.Redirect(sqlErrorPage);
System.Web.HttpContext.Current.Response.End();
……
private bool ProcessSqlStr(string Str)
{
bool ReturnValue = true;
try
{
if (Str.Trim() != \"\")
{
string SqlStr = \"and|exec|insert|select|delete|update|count|*|chr|mid|master|truncate|char|declare\";//這些關(guān)鍵詞還可根據(jù)實(shí)地情況繼續(xù)添加
string[] anySqlStr = SqlStr.Split('|');//聲明“|”為分隔的字符
foreach (string ss in anySqlStr)
{
if (Str.ToLower().IndexOf(ss) >= 0)
{
ReturnValue = 1;
break;
……只要把包含以上程序的Global.asax文件放在站點(diǎn)根目錄下,站點(diǎn)內(nèi)的所有程序文件在運(yùn)行后,無論是在表單內(nèi)還是在URL處輸入類似delete的關(guān)鍵字都會出現(xiàn)文件error.aspx定義的警告提示,從而防止SQL注入攻擊。
3.3 所有對SQL SERVER數(shù)據(jù)庫操作的程序都基于存儲過程運(yùn)行
把SQL語句直接套在ASP.NET程序代碼中實(shí)現(xiàn)對數(shù)據(jù)庫的操作,就必須給數(shù)據(jù)庫連接用戶賦予SELECT、UPDATE、INSERT或DELETE等權(quán)限,這樣很容易受到SQL注入攻擊。如果改為基于存儲過程操作數(shù)據(jù)庫,連接數(shù)據(jù)庫的用戶只要對存儲過程有執(zhí)行權(quán)限就可,不需要具備直接操作數(shù)據(jù)庫表的權(quán)限,同時(shí),輸入?yún)?shù)經(jīng)過存儲過程的過濾,這樣大大增強(qiáng)了系統(tǒng)的安全性。
4 結(jié)束語
基于角色的窗體安全認(rèn)證機(jī)制實(shí)現(xiàn)程序的訪問安全、防止SQL注入攻擊實(shí)現(xiàn)數(shù)據(jù)的安全、通過存儲過程操作數(shù)據(jù)庫加強(qiáng)數(shù)據(jù)庫的安全,這些都是針對ASP.NET和SQL Server 2005構(gòu)建的信息系統(tǒng)有效的技術(shù)方案,在我院的教學(xué)管理信息平臺中推廣應(yīng)用后,系統(tǒng)安全性大大加強(qiáng),這些技術(shù)方案具有較強(qiáng)的實(shí)用推廣價(jià)值。
參考文獻(xiàn):
[1] Microsoft Corporation.Web安全威脅與對策[EB/OL].http://msdn.microsoft.com/zh-cn/library/aa302418.aspx.
[2] Microsoft Corporation.Web安全解決方案一覽[EB/OL].http://msdn.microsoft.com/zh-cn/library/ms994913.aspx.
[3] Microsoft Corporation. Web應(yīng)用程序威脅建模一覽[EB/OL].http://msdn.microsoft.com/zh-cn/library/ms978523.aspx.