Php MYSQL不安全,但为什么

Php MYSQL不安全,但为什么,php,mysql,mysqli,pdo,sql-injection,Php,Mysql,Mysqli,Pdo,Sql Injection,我有一个用MYSQL和PHP创建的应用程序,据说MYSQL需要SQL注入(我尊重这一点),但为什么呢?我有在这种情况下可以正常工作的代码,或者有人能证明我错了吗 有一个表单有两个字段,用户名和密码,我把它发布在一个页面上。这是我的密码: $user = stripslashes($user); $pwd = trim($pwd); $pwd = stripslashes($pwd); $user = mysql_real_escape_string($user); $pwd = mysql_re

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

有一个表单有两个字段,用户名和密码,我把它发布在一个页面上。这是我的密码:

$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是未来的人来说:)

多谢各位

$user = stripslashes($user);
只要先使用
addslashes
,就可以了

$pwd = trim($pwd);
我不喜欢这样,因为您正在默默地从我选择的密码中删除字符。如果我的密码是:
“liIo1sor&DINg”
,该怎么办

mysql_real_escape_string(x)
问题是,您拒绝了一个替代方案,该方案基本上可以确保您容易受到SQLi vs转义的攻击,这可能会导致一些随机攻击出现并破坏您的站点

发件人:

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

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

因此,让我们假设
mysql\u real\u escape\u string()
是完美的,并且会普遍阻止注入。您仍然存在这样的问题:如果您按照本文中的方式构建所有SQL查询,那么您(或其他开发人员)可能会加入一个参数,忘记转义它。这不是一个安全的起点,而且会鼓励有风险的发展

md5($pwd);
正如其他人所说,md5不应用于散列密码。如果可以,您可能应该使用bcrypt、scrypt或pbkdf2。您还忽略了每个用户唯一的随机salt。如果您设置为不使用准备好的语句,这一点尤其重要,因为您的数据库将不可避免地被盗(只是开玩笑:P)。有关在此处存储密码的详细信息:


这是一种安全的方法,登录时请注意,您必须使用
mysql\u real\u escape\u string
,并再次对字符串执行
mysql\u query
,然后对这两个函数的输出运行
password\u verify()
。此外,您还可以使用
trim
,但也必须在登录时使用。这可能会缩短用户的密码,使他们更容易暴力,所以我不建议这样做

是时候跨入21世纪了。MD5也经历了更好的日子。mysql\u real\u escape\u string有很多方法。不过,它们通常包含奇怪的unicode字符
md5
是不安全的,制作它的人肯定说过。你真的不应该使用md5密码哈希,你真的应该使用PHP来处理密码安全。如果你使用的PHP版本低于5.5,你可以使用
密码\u hash()
。你可能仍然可以使用
mysql\u
函数,但是MD5最终会咬你,比垃圾场的狗更难。为什么?
mysql\u
API存在巨大的安全漏洞,一些函数,如
mysql\u real\u escape\u string()
很容易被击败。一旦失败,你可能会被介绍给。此外,MD5的黑客攻击被广泛宣传,使得散列非常容易被破解。我想我知道你在回答中提到的任何东西,因为我在大学里也学过,但正如我所说的,示例值上千个逻辑,即使我的代码是mysql,它也不易被攻击:)如果你不需要建议,为什么要问问题?这个漏洞是当你在维护一个参数时忘记逃逸的。恕我直言,这些建议是由一些逻辑和理由支持的。我不确定我是否理解你的评论,但似乎回答这个问题的唯一方法是说“你完全正确”或针对功能演示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'");