| sa 一定要有强固的密码,尤其是 SQL Server 7.0 以前的版本,在装机时预设 sa 没有密码,而一般管理者装完后也忘了或怕麻烦而不更改密码。
利用 ADO 的 Command 对象或 ADO.NET 的 SqlCommand class 来透过参数执行 SQL 语法,直接以 ADODB 的 Connection 对象执行预存程序的写法一样糟糕。范例如下:
Exec spXXX 参数,…
因为骇客所加入的 SQL 语法一样可以执行:
Exec spXXX 参数,…;SHUTDOWN
我们可以建立一个预存程序程序代码列表 5:
ECREATE PROC spUserAccount @UserName NVarchar(50),@Password NVarchar(50) AS SELECT UserName,Password FROM tblUser WHERE UserName=@UserName AND Password=@Password
程序代码列表 5:用来找寻符合的使用者帐号密码的预存程序。
同时将整个 ASP 的查询换成如程序代码列表 6 的写法:
<% If Request("UserName")<>"" And Request("Pass")<>"" Then Dim cnn,rec,strSQL,cmd Set cnn=Server.CreateObject("ADODB.Connection") With cnn .ConnectionString=Application("Conn") .Open End With ''''透过 ADODB.Command 对象来搭配预存程序,骇客就无法 ''''利用组合 SQL 字符串的方式来侵入系统 Set cmd=Server.CreateObject("ADODB.Command") With cmd .ActiveConnection = cnn .CommandText = "spUserAccount" .CommandType = 4 ''''adCmdStoredProc .Parameters.Append .CreateParameter("UserName", 202, 1, 50, Request("UserName")) ''''202 代表 adVarWChar,1 代表 adParamInput .Parameters.Append .CreateParameter("Password", 202, 1, 50, Request("Pass")) Set rec = .Execute() End With If NOT rec.EOF Then Session("UserName")=Request("UserName") Response.Write " << 上一页 [11] [12] [13] [14] [15] [16] [17] 下一页 |