php - 为了防注入,对sql查询语句加转义addslashes后,语句语法出现问题

 可爱爱美女_815 发布于 2022-12-01 17:36

【php+mysql的一个项目】
有一个用户,用户名是admin,密码是admin。
查询语句是:

$sql="select * from table_project where a_username='{$username}' and a_password='{$password}';";

然后查询:

$res=mysql_query($sql);
……省略

因为防止sql注入,所以想在sql语句查询之前都进行一下转义,所以用addslashes对$sql语句转义了一下,但是就出错了。

$sql=addslashes($sql);
$res=mysql_query($sql);

在没有加转义的那一行代码前,用admin,admin可以顺利登录。
加了之后,用admin,admin登录后,捕捉了如下错误,请教大牛们怎么破?

错误编号:1064
错误内容:You have an error in your SQL syntax;check the manual that corresponds to your MySQL server version for the right syntax to use near '\'admin\' and a_password=\'21232f297a57a5a743894a0e4a801fc3\'' at line 1

多谢!

9 个回答
  • 少年,PDO才是王道.mysqli也行。

    php$db = new PDO('mysql:host=127.0.0.1;dbname=test;charset=utf8','root','rootpass');
    $stm = $db->prepare("select * from test where field = :value");
    $stm->bindValue(':value',$_GET['field'],PDO::PARAM_STR);
    $stm->execute();
    
    $rows = $stm->fetchAll(PDO::FETCH_ASSOC);
    var_dump($rows);
    

    再不济mysqli也可以。

    php$db = new mysqli('127.0.0.1','root','rootpass','database_name');
    $stmt = $db->prepare("select * from test where field = ?");
    $stmt->bind_param('s',$_GET['field']);
    $stmt->execute();
    $rows = array();
    while ($row = $stmt->fetch()) array_push($rows,$row);
    var_dump($rows);
    
    2022-12-01 18:08 回答
  • 如果应用程序只使用预处理语句,可以确保不会发生SQL 注入。
    ------ php 手册 预处理语句

    2022-12-01 18:08 回答
  • 放弃mysql_query的写法吧,用pdo,另外建议不要使用addslashes,mysqli或者pdo有现成的转义方法

    2022-12-01 18:08 回答
  • $username = 'aaa';
    $password = 'bbb';
    $sql="select * from table_project where a_username='{$username}' and a_password='{$password}';";
    echo addslashes($sql);
    
    select * from table_project where a_username=\'aaa\' and a_password=\'bbb\';
    

    用来包裹字符串的单引号被转义了当然报错了。

    另外还是建议使用PDO

    2022-12-01 18:08 回答
  • 好吧,我小白了。
    我在用户名变量那个地方做了转义,没有对整个sql语句做转义,然后就好了。

    $username=addslashes($username);
    $password=md5($password);
    $sql="select * from table_project where...;";
    

    密码是md5转换后的,用户名用addslashes转义后,然后放到sql语句中查询,貌似这样就行了。
    不知道一般的项目中是不是也是这样处理的啊?

    2022-12-01 18:08 回答
  • php$username=mysql_real_escape_string($username);
    $password=mysql_real_escape_string($password);
    $sql="select * from table_project where a_username='{$username}' and a_password='{$password}';";
    
    2022-12-01 18:08 回答
  • 使用PDO,参数化查询,不要使用拼接字符串的方式。注意使用PDO需要先在php.ini里面开启该功能

    2022-12-01 18:08 回答
  • 你不能对整个SQL语句转义,需要转义的仅仅是变量而已。

        $username=addslashes($username);
        $sql="select * from table_project where a_username='{$username}' and a_password='{$password}';";
    
    2022-12-01 18:08 回答
  • addslashes() 函数在指定的预定义字符前添加反斜杠。
    这些预定义字符是:
    单引号 (')
    双引号 (")
    反斜杠 ()
    NULL
    而加上\的意义在于mysql把它当作字符串来对待。

    你不可以对$sql进行。如果你对整个$sql进行addslashes ,你可以打印一下你的sql语句,肯定是不正确的。

    2022-12-01 18:08 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有