MYSQL不安全,但为什么呢

时间:2015-09-11 16:53:37

标签: php mysql mysqli pdo sql-injection

我有一个我在MYSQL和PHP中创建的应用程序,据说MYSQL受SQL注入 - (我尊重),但为什么呢?我的代码在这种情况下工作正常,或者有人可以证明我错了吗?

有一个包含2个字段的表单,用户名和密码,我将其发布在页面上。这是我的代码:

$user = stripslashes($user);
$pwd = trim($pwd);
$pwd = stripslashes($pwd);
$user = mysql_real_escape_string($user);
$pwd = mysql_real_escape_string($pwd);
$pwd = md5($pwd);

$rs = mysql_query("select * from `login` where upper(USER_ID) = upper('$user') AND PASS = '$pwd'");

我的用户名是管理员。

那么,这是我的代码,我正在逃避,它怎么能受到SQL注入?对于那些说PDO是未来的人来说,这是一个开放的挑战:)。

谢谢。

2 个答案:

答案 0 :(得分:0)

entropy

只要您首先使用?entropy,就可以了。

$user = stripslashes($user);

我不喜欢这样,因为你正默默地从我选择的密码中删除字符。如果我的密码是:addslashes怎么办?

$pwd = trim($pwd);

问题在于你正在拒绝一种替代方案,这种替代方案基本上可以确保你容易受到SQLi的攻击和逃避攻击,这有可能导致某些随机攻击并破坏你的网站。

来自:http://php.net/manual/en/pdo.prepared-statements.php

  

如果应用程序专门使用预准备语句,开发人员可以确保不会发生SQL注入(但是,如果使用非转义输入构建查询的其他部分,仍然可以进行SQL注入)。

这是来自官方的PHP文档。你的方法可能是安全的,但是你有一个非常完美的方法......所以为什么选择安全呢?

因此,让我们假设" liIo1sor&DINg "是完美的,并且会普遍阻止注射。你还有一个问题,如果你按照你在这篇文章中的方式构建所有的SQL查询,那么你(或其他开发人员)可能会出现并添加一个参数并且忘记逃避它。它不是一个安全的起点,并鼓励风险的发展。

mysql_real_escape_string(x)

正如其他人所说,md5不应该用于散列密码。如果可以,您应该使用bcrypt,scrypt或pbkdf2。您还省略了每用户唯一且随机的盐。如果您设置为不使用预准备语句,这一点尤为重要,因为您的数据库将不可避免地被盗(只是开玩笑:P)。有关在此处存储密码的更多信息:https://security.stackexchange.com/questions/211/how-to-securely-hash-passwords

答案 1 :(得分:0)

$user = stripslashes($user);
$pwd = stripslashes($pwd);
$user = mysql_real_escape_string($user);
$pwd = mysql_real_escape_string($pwd);
$password = password_hash($password, PASSWORD_BCRYPT);c
$rs = mysql_query("select * from `login` where upper(USER_ID) = upper('$user') AND PASS = '$pwd'");

是否有安全的方法,快速记录登录,您必须再次对字符串使用mysql_real_escape_stringmysql_query,然后在输出上运行password_verify()这两个功能。此外,您可以使用trim,但是您也必须在登录时执行此操作。这可能会缩短用户密码并使其更容易暴力破解,所以我不推荐它。