> 백엔드 개발 > PHP 튜토리얼 > 为了防注入,对sql查询语句加转义addslashes后,语句语法出现问题

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

WBOY
풀어 주다: 2016-06-06 20:36:53
원래의
1270명이 탐색했습니다.

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

<code>$sql="select * from table_project where a_username='{$username}' and a_password='{$password}';";
</code>
로그인 후 복사
로그인 후 복사

然后查询:

<code>$res=mysql_query($sql);
……省略
</code>
로그인 후 복사
로그인 후 복사

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

<code>$sql=addslashes($sql);
$res=mysql_query($sql);
</code>
로그인 후 복사
로그인 후 복사

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

<code>错误编号: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
</code>
로그인 후 복사
로그인 후 복사

多谢!

回复内容:

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

<code>$sql="select * from table_project where a_username='{$username}' and a_password='{$password}';";
</code>
로그인 후 복사
로그인 후 복사

然后查询:

<code>$res=mysql_query($sql);
……省略
</code>
로그인 후 복사
로그인 후 복사

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

<code>$sql=addslashes($sql);
$res=mysql_query($sql);
</code>
로그인 후 복사
로그인 후 복사

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

<code>错误编号: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
</code>
로그인 후 복사
로그인 후 복사

多谢!

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

<code>php</code><code>$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);
</code>
로그인 후 복사

再不济mysqli也可以。

<code>php</code><code>$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);
</code>
로그인 후 복사

如果应用程序只使用预处理语句,可以确保不会发生SQL 注入。
------ php 手册 预处理语句

放弃mysql_query的写法吧,用pdo,另外建议不要使用addslashes,mysqli或者pdo有现成的转义方法

<code>$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\';
</code>
로그인 후 복사

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

另外还是建议使用PDO

好吧,我小白了。
我在用户名变量那个地方做了转义,没有对整个sql语句做转义,然后就好了。

<code>$username=addslashes($username);
$password=md5($password);
$sql="select * from table_project where...;";
</code>
로그인 후 복사

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

<code>php</code><code>$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}';";
</code>
로그인 후 복사

使用PDO,参数化查询,不要使用拼接字符串的方式。注意使用PDO需要先在php.ini里面开启该功能

你不能对整个SQL语句转义,需要转义的仅仅是变量而已。

<code>    $username=addslashes($username);
    $sql="select * from table_project where a_username='{$username}' and a_password='{$password}';";
</code>
로그인 후 복사

addslashes() 函数在指定的预定义字符前添加反斜杠。
这些预定义字符是:
单引号 (')
双引号 (")
反斜杠 ()
NULL
而加上\的意义在于mysql把它当作字符串来对待。

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

관련 라벨:
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿