background image

'' 或者 1=1 #

这个执行语句现在是这个样子:

elect Username, Password FROM Users Where Username = '' or 1=1 #' and Password

= '';

散列符号(#)告诉MySQL的它之后一切,都会被忽略。 所以实际上只是执行的SQL到这

一点。 1永远等于1 ,所以SQL将从数据库返回所有的用户名和密码。 在大多数用户登录数
据库的首个户名和密码组合都是管理员用户, 他干脆输入了几个符号作为管理员已登录你
的网站, 果他们其实都知道的用户名和密码,他们会有同样的权力如。

一个小创意,上述情况可以进一步发挥,让用户建立自己的登录帐号, 阅读信用卡号

码,甚至删除数据库。

所幸的是,这种情况还是很容易避免。 通过检查要进入数据库的数据,并删除或取消

它们, 我们可以防止任何人在这个数据库上执行他们自己的SQL语句。 函数的方法如下:

function make_safe($variable) {

$variable = addslashes(trim($variable));

return $variable;

}

现在,修改了我们的执行语句。用_POST取代上面的执行变量, 我们现在把所有的用户

数据通过make_safe函数,在以下代码:

$username = make_safe($_POST['username']);

$password = make_safe($_POST['password']);

$check = mysql_query(“Select Username, Password, UserLevel FROM Users Where

Username

= ’”.$username.“‘ and Password = ’”.$password.“‘”);

现在,如果一个用户输入恶意的上述数据,查询看上去像下面这样,是完全无害。 以

下查询将选择从数据库中的用户都和“\' or 1=1 #”相等的。

Select Username, Password, UserLevel FROM Users Where Username