为了防注入,对sql查询语句加转义addslashes后,语句语法出现问题
澳门新葡京官网
澳门新葡京官网
当前位置 : 澳门新葡京官网 > 新葡京娱乐场

为了防注入,对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

多谢!

少年,PDO才是王道.mysqli也行。

php$db = new PDOmysql: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->fetchAllPDO::FETCH_ASSOC;
var_dump$rows;

再不济mysqli也可以。

php$db = new mysqli127.0.0.1,root,rootpass,database_name;
$stmt = $db->prepare"select * from test where field = ?";
$stmt->bind_params,$_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语句,肯定是不正确的。

栏目列表

广告位

澳门新葡京官网