echo "<form method=\"post\" action=\"admin.php\"><table width=50% align=center cellspacing=0 cellpadding=2><TR height=26 bgcolor=#E6E6E6><TD colspan=3 align=center><B>Please Login</B></TD></TR><TR height=26 bgcolor=#F6F6F6><TD width=15% align=center rowspan=\"2\" style=\"BORDER-LEFT:#E6E6E6 1px solid;\"><img src=\"images/admin_info.png\"></TD><TD width=20%>Admin ID</td><td width=65% style=\"BORDER-RIGHT:#E6E6E6 1px solid;\"><input type=text name=admin_id></td></tr><TR height=26 bgcolor=#F6F6F6><TD width=20%>Password</td><td style=\"BORDER-RIGHT:#E6E6E6 1px solid;\"><input type=password name=admin_pass></td></tr><TR height=26 bgcolor=#F6F6F6><TD width=\"35%\" colspan=\"2\" style=\"BORDER-LEFT:#E6E6E6 1px solid;BORDER-BOTTOM:#E6e6e6 1px solid;\"><BR><BR><BR></td><td style=\"BORDER-RIGHT:#E6E6E6 1px solid;BORDER-BOTTOM:#E6E6E6 1px solid;\"><input type=submit value=\"Login\"></td></tr></table></form>";
if($admin_id!="" && $admin_pass!=""){ $search=mysql_query("SELECT * FROM smp_ad WHERE admin_id='$admin_id' AND admin_pass='$admin_pass'"); if(mysql_num_rows($search)==1){ $_SESSION['ein']=base64_encode($admin_id); header("location: admin.php?action=dologin"); } }这段代码首先判断用户输入的用户名和密码是否为空。如果不为空,则进行SQL语句查询,利用函数mysql_num_rows()返回结果集中的行数目。如果返回结果为1,用户的身份存在于数据库中,即用户存在,随后将用户指引到下一个页面admin.php?action=dologin
SELECT * FROM smp_ad WHERE admin_id='admin' or '1'='1' AND admin_pass='[ANYTHING]'这句话的内容等同于SELECT * FROM smp_ad WHERE admin_id='admin',即攻击者只要输入一个合法的用户名,不需要密码,即可通过认证。
加固的方法为,使用PHP中的addslashes函数,
$search=mysql_query("SELECT * FROM smp_ad WHERE admin_id='".addslashes($admin_id)."' AND admin_pass='".addslashes($admin_pass)."'");此函数会将用户的输入中存在的单引号,双引号反斜线以及NULL字符进行转义。即如果用户试图用同样的方法绕过登录时,SQL语句会是如下样子:
SELECT * FROM smp_ad WHERE admin_id='admin\' or \'1\'=\'1' AND admin_pass='[ANYTHING]'用户无法通过可控的输入来闭合单引号以达到单引号平衡,因此无法绕过认证,最终起到加固的目的。