摘 要: 目前網(wǎng)絡(luò)安全問題已是大家普遍關(guān)注的問題,,網(wǎng)絡(luò)黑客攻擊給很多單位造成巨大的損失。如何減少網(wǎng)絡(luò)攻擊已是很多相關(guān)研究人員重點研究方向,。系統(tǒng)登錄窗口是絕大多數(shù)用戶使用系統(tǒng)的首要入口,,也是黑客攻擊的主要目標(biāo)。所以如何設(shè)計好登錄窗口,,對一個系統(tǒng)的安全來說至關(guān)重要,。本文從10個方面考慮如何設(shè)計登錄界面。
關(guān)鍵詞: 網(wǎng)絡(luò)安全,;登錄窗口;Web攻擊,;黑客攻擊,;程序設(shè)計
目前網(wǎng)絡(luò)攻擊現(xiàn)象十分嚴(yán)重,給很多企業(yè)和單位造成很大程度的破壞,。網(wǎng)絡(luò)安全問題一直是很多單位重視的問題,。目前所有交互性系統(tǒng)或用戶查詢系統(tǒng)類,都需要涉及到登錄窗口,。網(wǎng)絡(luò)攻擊者也主要是攻破登錄窗口這個界面,,才能進(jìn)入應(yīng)用系統(tǒng),進(jìn)行操作相關(guān)的數(shù)據(jù)或應(yīng)用程序,??梢姷卿洿翱趯ο到y(tǒng)的作用是至關(guān)重要的。現(xiàn)在Web系統(tǒng)直接部署在網(wǎng)絡(luò)上,,任何人都可以訪問到,,安全問題是很多系統(tǒng)擔(dān)心的問題。
本文的防Web攻擊登錄窗口設(shè)計主要從程序設(shè)計角度來講,針對一般的Web系統(tǒng),,例如論壇,、留言等用戶能自己登錄后發(fā)布信息的窗口。對于銀行等安全性要求極高的系統(tǒng)來說,,除了本身的Web設(shè)計外,,還必須借助其他如U盾等外界硬件設(shè)備來保證其足夠安全性。
1 關(guān)于提高Web安全性的相關(guān)研究
1.1 借用外界硬件設(shè)備來提高安全性
?。?)基于可信平臺模塊(TPM)的用戶登錄可信認(rèn)證,。該認(rèn)證方式是利用PC機(jī)USB接口外接TPM,將用戶的身份信息,、相關(guān)的密鑰信息等存儲在TPM中,,并利用USBKEY技術(shù)、動態(tài)的口令技術(shù)來確保用戶身份的真實可信[1],;(2)用戶登錄端程序嵌入到還原程序當(dāng)中通信代理服務(wù),,用戶端和服務(wù)器端分開響應(yīng)[2]。
以上的研究主要從硬件來考慮,,對于一般的論壇類系統(tǒng)不可能讓每個用戶發(fā)篇帖子還要單獨配置相關(guān)的硬件,。
1.2 主要用軟件設(shè)計來提高安全性
(1)以著名的RSA算法和DES算法為基礎(chǔ),,提出一種互補(bǔ)性的混合數(shù)據(jù)加密方案及其實現(xiàn)過程[3],;(2)安全減少用戶登錄次數(shù),在分布式環(huán)境中基于Web服務(wù)的用戶單點登錄機(jī)制,,使得用戶只需登錄一次即可完成復(fù)雜業(yè)務(wù)[4],。
1.3 程序配合數(shù)據(jù)庫設(shè)置
過濾特殊字符,分配數(shù)據(jù)庫賬戶權(quán)限,,正確使用存儲過程,,確保輸入的合法性,對敏感數(shù)據(jù)加密存儲,,嚴(yán)格進(jìn)行錯誤處理[5],。此研究主要從軟件設(shè)計上考慮,用戶可以借鑒,,設(shè)計考慮的并不全面,,對于不同的攻擊不一定能很好地預(yù)防。關(guān)于數(shù)據(jù)庫設(shè)置,,對于網(wǎng)絡(luò)管理員來說,,可以借鑒。
本文主要從軟件設(shè)計方面來考慮不同用戶不同需要及各種有關(guān)預(yù)防策略,。
2 程序設(shè)計
登錄窗口要設(shè)計好,,首先考慮的方面要全,,攻擊者不可能用所有的方法去試探,但僅用其中的部分要素就可以,。本文將列出一部分常見的實用的攻擊及預(yù)防的策略,。
(1)防SQL注入漏洞攻擊
目前很多登錄程序在設(shè)計上存在一個很大的隱患就是直接寫SQL語句進(jìn)行驗證登錄,,即黑客輸入任意的用戶名,、密碼后,只要在后面輸入“′1′or′1′=′1′”成為選擇語句,,驗證就會輕松通過,,進(jìn)入后臺,訪問數(shù)據(jù)庫,。換一種方法去驗證用戶名和密碼,,就可以有效地預(yù)防這類現(xiàn)象。
代碼例如:
conn.Open(),;//打開數(shù)據(jù)庫
SqlCommand cmd=conn.CreateCommand(),;
cmd.CommandText="select*from用戶表where用戶名=@UserName and密碼=@pwd";
cmd.Parameters.Add(new SqlParameter("UserName",,txtUserName.Text)),;
cmd.Parameters.Add(new SqlParameter("pwd",txtpwd.Text)),;
?。?)加入輸入密碼次數(shù)
目前電腦配置也越來越高,很多相關(guān)黑客破解密碼的軟件,,黑客會用一個配置較好的主機(jī)去破解用戶名的密碼,,直到破解為止,計算機(jī)的運(yùn)行速度特別快,,一般數(shù)字密碼很快就會破解,。因此在登錄窗口要設(shè)置用戶登錄輸入密碼的次數(shù),如輸入密碼次數(shù)不超過3次,,這樣才能大大減少被破解的機(jī)會,。如果用戶登錄成功,,錯誤次數(shù)會自動清零,。以免影響正常用戶的正常登錄。
核心代碼例如:
DataTable dt=SqlHelp.ExecuteDataTable("select* from用戶表where用戶名=@UserName and密碼=@pwd",,
new SqlParameter("UserName",,uid.Text));new SqlParameter("pwd",,pwd.Text)),;
if(dt.Rows.Count<=0){MessageBox.Show("用戶名不存在,!");return,;}
else
{
DataRow row=dt.Rows[0],;
int errorTimes=Convert.ToInt32(row["ErrorTimes"]);
if(errorTimes>=3)
{MessageBox.Show("登錄錯誤次數(shù)過多,!"),;return;}
string dbpassword=Convert.ToString(row["Password"]),;
if(dbpassword==pwd.Text)
{MessageBox.Show("登錄成功,!");
SqlHelp.ExecuteNonQuery("Update用戶表Set ErrorTimes=0 where用戶名=@UserName",,}
else{SqlHelp.ExecuteNonQuery("Update用戶表Set ErrorTime=ErrorTimes+1 where UserName=@UserName",,new SqlParameter("UserName",pwd.Text)),;
MessageBox.Show("密碼錯誤,!");}
}
?。?)限制同一IP多次申請注冊
如果用戶一直注冊,,當(dāng)作攻擊的一種類型,當(dāng)申請次數(shù)達(dá)到一定數(shù)據(jù),,該用戶不能再申請,。主要由瀏覽器緩存暫時存下用戶的相關(guān)信息如IP等,用于記錄用戶申請帳戶次數(shù),。
核心代碼:
Form frmRequestAnAccount=CacheManager.Instance.GetForm(assemblyName,,IP);//獲取IP申請用戶名次數(shù)
If(frmRequestAnAccount.ShowDialog()==DialogResult.OK)
//次數(shù)達(dá)到某一限制,,彈出對話框
{this.btnRequestAnAccount.Enabled=false,;}
//禁止該用戶再申請帳戶
(4)判斷當(dāng)前用戶是否在線,,為false方可注冊
BaseSystemInfo.CheckOnLine=false,;//當(dāng)前用戶若不在線
BaseSystemInfo.AllorNullPassword=true;//可以注冊
?。?)核實是否記錄日志
BaseSystemInfo.RecordLog=true,;//確定記錄
(6)重要的應(yīng)用登錄后寫入注冊表
輸入正確用戶名和密碼后,,寫入注冊表,,即使該用戶暫時沒權(quán)限,發(fā)生異常,,則寫入XML,。
核心代碼如下:
If(this.chkRememberPassword.Checked)
{registryKey.SetValue(BaseConfiguration.CURRENT_USERNAME,,SecretUtil.Encrypt(userInfo.Username));
registryKey.SetValue(BaseConfiguration.CURRENT_PASSWORD,,SecretUtil.Encrypt(this.txtPassword.Text)),;}
Else
{registryKey.SetValue(BaseConfiguration.CURRENT_USERNAME,string.Empty),;
registryKey.SetValue(BaseConfiguration.CURRENT_PASSWORD,,string.Empty);}
(7)對鍵盤上的回車進(jìn)行處理
相關(guān)代碼(用戶按鍵盤Enter也可以登錄):
if(e.KeyChar==13)
{If(this.CheckInput())//檢查輸入的有效性
{This.Login(),;//用戶登錄}
}
(8)多語言加載,,如果有外籍人員
ResourceManagerWrapper.Instance.LoadResources(Application.StartupPath+@”\語言包路徑\”);
//從當(dāng)前指定的語言包讀取信息
(9)添加驗證碼
目前網(wǎng)絡(luò)上有多種驗證碼,,稍加修改,,明白其中的成圖原理,都可以改成自己常用的開發(fā)語言進(jìn)行使用,。
例如下面生成驗證碼相關(guān)核心代碼:
int fSize=FontSize,;
int fWidth=fSize+Padding;
int imageWidth=(int)(code.Length*fWidth)+4+Padding*2,;
int imageHeight=fSize*2+Padding,;
System.Drawing.Bitmap image=new System.Drawing.Bitmap(imageWidth,imageHeight),;
Graphics g=Graphics.FromImage(image),;
g.Clear(BackgroundColor);
Random rand=new Random(),;
if(this.Chaos)//給背景添加隨機(jī)生成的燥點
{Pen pen=new Pen(ChaosColor,,0);
int c=Length*10,;
for(int i=0,;i<c;i++)
{int x=rand.Next(image.Width),;
int y=rand.Next(image.Height),;
g.DrawRectangle(pen,x,,y,,1,1),;}
}
int left=0,,top=0,,top1=1,,top2=1,;
int n1=(imageHeight-FontSize-Padding*2);
int n2=n1/4,;top1=n2,;top2=n2*2;Font f,;Brush b,;
int cindex,findex,;
for(int i=0,;i<code.Length;i++)
//隨機(jī)字體和顏色的驗證碼字符
{cindex=rand.Next(Colors.Length-1),;
findex=rand.Next(Fonts.Length-1),;
f=newSystem.Drawing.Font(Fonts[findex],
fSize,,System.Drawing.FontStyle.Bold),;
b=new System.Drawing.SolidBrush(Colors[cindex]);
if(i%2==1){top=top2,;}
else{top=top1,;}left=i*fWidth;
g.DrawString(code.Substring(i,,1),,f,b,,left,,top);}
//畫一個邊框 邊框顏色為Color.Gainsboro
g.DrawRectangle(new Pen(Color.Gainsboro,,0),,0,0,,image.Width-1,,image.Height-1);
g.Dispose(),;
//產(chǎn)生波形
image=TwistImage(image,,true,8,,4),;
return image;
(10)客戶端和服務(wù)器端都驗證,,防止黑客禁掉客戶端程序
登錄是用戶進(jìn)入系統(tǒng)的首要窗口,,攻破登錄,對非法用戶操作數(shù)據(jù)就很容易了,,開發(fā)Web程序時應(yīng)當(dāng)重視登錄窗口的設(shè)計,,做好程序代碼的安全性檢查,設(shè)置好服務(wù)器和數(shù)據(jù)庫的安全,,雖然沒有絕對的安全,,但各種方面小心防范,就可以從很大程度上保證Web服務(wù)器的安全,。
本文從以上10個方面考慮防Web攻擊登錄窗口設(shè)計,,設(shè)計的登錄窗口系統(tǒng)已在實際系統(tǒng)中使用一年半時間,目前發(fā)現(xiàn)攻擊的次數(shù)越來越少,。隨著網(wǎng)絡(luò)的發(fā)展,,可能有更多的情況需要考慮,本文將不斷優(yōu)化改進(jìn),。
參考文獻(xiàn)
[1] 譚良,,周明天.一種新的用戶登錄可信認(rèn)證方案的設(shè)計與實現(xiàn)[J].計算機(jī)應(yīng)用,2007,,27(5):1070-1072.
[2] 王書海,,劉明生,肖眾.機(jī)房管理系統(tǒng)用戶登錄認(rèn)證方案設(shè)計[J].實驗室研究與探索,,2008,,24(2):37-38.
[3] 伍華健.公開密鑰密碼體系在網(wǎng)絡(luò)安全中的應(yīng)用研究[J].微計算機(jī)信息,2006,,22(43):14-17.
[4] 胡毅時,,懷進(jìn)鵬.基于Web服務(wù)的單點登錄系統(tǒng)的研究與實現(xiàn)[J].北京航空航天大學(xué)學(xué)報,2004,,30(3):236-239.
[5] 郜激揚(yáng).基于Web服務(wù)的數(shù)據(jù)庫注入攻擊與防范[J].華北水利水電學(xué)院學(xué)報,,2008,29(1):89-91.