看上去好象通過從輸入中去掉單引號或者通過某些方法避免它們都可以解決這個問題。這是可行的,但是用這種方法做解決方法會存在幾個困難。第一,并不是所有用戶提供的數據都是字符串。如果用戶輸入的是通過用戶id來查詢author,那我們的查詢應該像這樣:
Select id,forename,surname from authors where id=1234
在這種情況下,一個攻擊者可以非常簡單地在數字的結尾添加SQL語句,在其他版本的SQL語言中,使用各種各樣的限定符號;在數據庫管理系統JET引擎中,數據可以被使用'#'限定。第二,避免單引號盡管看上去可以,但是是沒必要的,原因我們稍后再講。
我們更進一步地使用一個簡單的ASP登陸頁面來指出哪些能進入SQLSERVER數據庫并且嘗試鑒別進入一些虛構的應用程序的權限。
這是一個提交表單頁的代碼,讓用戶輸入用戶名和密碼:
<HTML>
<HEAD>
<TITLE>Login Page</TITLE>
</HEAD>
<BODY bgcolor='000000' text='cccccc'>
<FONT Face='tahoma' color='cccccc'>
<CENTER><H1>Login</H1>
<FORM action='process_loginasp' method=post>
<TABLE>
<TR><TD>Username:</TD><TD><INPUT type=text name=username size=100 width=100></TD></TR>
<TR><TD>Password:</TD><TD><INPUT type=password name=password size=100 withd=100></TD></TR>
</TABLE>
<INPUT type=submit value='Submit'><INPUT type=reset value='Reset'>
</FORM>
</Font>
</BODY>
</HTML>
下面是process_login.asp的代碼,它是用來控制登陸的:
<HTML>
<BODY bgcolor='000000' text='ffffff'>
<FONT Face='tahoma' color='ffffff'>
<STYLE>
p { font-size=20pt ! important}
font { font-size=20pt ! important}
h1 { font-size=64pt ! important}
</STYLE>
<%@LANGUAGE = JScript %>
<%
function trace( str ) {
if( Request.form("debug") == "true" )
Response.write( str );
}
function Login( cn ) {
var username;
var password;
文章來源于領測軟件測試網 http://www.kjueaiud.com/