您好,欢迎访问一九零五行业门户网

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

【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

多谢!
回复内容: 【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

多谢!
少年,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);
如果应用程序只使用预处理语句,可以确保不会发生sql 注入。
------ php 手册 预处理语句
放弃mysql_query的写法吧,用pdo,另外建议不要使用addslashes,mysqli或者pdo有现成的转义方法
$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
好吧,我小白了。
我在用户名变量那个地方做了转义,没有对整个sql语句做转义,然后就好了。
$username=addslashes($username);$password=md5($password);$sql=select * from table_project where...;;
密码是md5转换后的,用户名用addslashes转义后,然后放到sql语句中查询,貌似这样就行了。
不知道一般的项目中是不是也是这样处理的啊?
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}';;
使用pdo,参数化查询,不要使用拼接字符串的方式。注意使用pdo需要先在php.ini里面开启该功能
你不能对整个sql语句转义,需要转义的仅仅是变量而已。
$username=addslashes($username); $sql=select * from table_project where a_username='{$username}' and a_password='{$password}';;
addslashes() 函数在指定的预定义字符前添加反斜杠。
这些预定义字符是:
单引号 (')
双引号 ()
反斜杠 ()
null
而加上\的意义在于mysql把它当作字符串来对待。
你不可以对$sql进行。如果你对整个$sql进行addslashes ,你可以打印一下你的sql语句,肯定是不正确的。
其它类似信息

推荐信息