php - 此代码是可转义的还是易受 SQL 注入(inject)攻击

标签 php mysql sql-injection

我正在为这个我和 friend 一起写的登录系统运行一些测试,我们已经用转义而不是准备编写了代码。我们确保它不受任何作为 post_user 和 post_pass 变量的影响。 你能检查一下吗?

$_POST['post_user'] = mysql_real_escape_string($_POST['post_user']);

$_POST['post_pass'] = mysql_real_escape_string($_POST['post_pass']);

$query = mysql_num_rows(mysql_query("SELECT * FROM `users` WHERE
`user`='".$_POST['post_user']."' AND `pass`='".md5($_POST['post_pass'])."' AND
`rank`='0'"));

if($query == 1) {

$_SESSION[$this->host().'-us_user'] = $_POST['post_user'];

$_SESSION[$this->host().'-us_pass'] = md5($_POST['post_pass']);

$_SESSION[$this->host().'-us_token'] = $this->generateToken(16);

}

最佳答案

这种方法有两个错误,都来自同一个错觉。

mysql_real_escape_string 不会“保护”您的数据。因此,绝不能将其用于任何“ sanitizer ”目的。像这样使用此功能,您会将自己暴露在两种虽然不是直接但很可能的危险中。

  1. 在散列之前转义密码可能会破坏生成的散列。
  2. 转义 SQL 字符串旁边的任何值都将导致注入(inject)。

这就是为什么您应该始终使用参数化而不是“转义”。只是因为参数化正在发挥作用,而使用“转义”只是出于混淆。
我在你是 welcome to read 的文章中写了一个关于转义/参数化的完整解释。 .

关于php - 此代码是可转义的还是易受 SQL 注入(inject)攻击,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22926194/

相关文章:

php - 无法在 Linux 上启动 mysql(错误 2002 HY000)

mysql - 我需要当我的表(不是一个表很多表)使用 mysql 信息模式插入时

php - 在php中上传和检索图像到数据库

php - 防止SQL注入(inject): is mysql_real_escape_string() really all I need?

java - 如何使用 SQL 查询转义用户提供的参数?

php - 从动态生成的列表在 PHP 网页之间传递数据

php - 坚持使用 PHP 还是学习 Go-lang?

PHP 代码修改以仅检索要添加到 PDF 的第一张图像

mysql - 为什么不同数据库上的两个mysql锁定和刷新语句挂起

php - 这在 SQL 注入(inject)方面安全吗?