Home  >  Article  >  Backend Development  >  这种方法为什么无法防止SQL注入?

这种方法为什么无法防止SQL注入?

WBOY
WBOYOriginal
2016-06-23 14:10:59830browse

首先不知道MySQL是不是所有类型的数据都可以加上单引号,我刚才试了一下,在整数左右加上单引号好像是没有问题。
如果确实任何类型的数据都可以加单引号的话,那么就在生成MySQL语句的时候为任何数据都加上单引号,然后使用mysql_escape_string将接收到的字符中的所有特殊字符转义。这样就可以将接收到的字符串完全“限制”在单引号之间了。

但是就算这样好像也是不能一劳永逸,因为类似like子句后面的字符串中的转义和正常的字符串好像是不一样的。另外如果AMP中任何一个的更新涉及到转义的话,可能都会出现问题。这两个问题有没有一劳永逸地解决的方法?还有没有其他的问题?


回复讨论(解决方案)

like子句后面的字符串中的转义和正常的字符串好像是不一样的
怎么不一样?

mysqli、pdo 都提供有数据绑定
使用数据绑定时,都不需要手工实现转义

like子句后面的字符串中的转义和正常的字符串好像是不一样的
怎么不一样?

mysqli、pdo 都提供有数据绑定
使用数据绑定时,都不需要手工实现转义
like里的反斜线好像是\\\。

不要好像,拿出实例来

不要好像,拿出实例来
好像和PHP有关,直接在命令行里面试不出来。在命令行里是完全正常的。另外在phpmyadmin里也需要三个反斜线。


不要好像,拿出实例来
好像和PHP有关,直接在命令行里面试不出来。在命令行里是完全正常的。另外在phpmyadmin里也需要三个反斜线。
我刚才把反斜线打成斜线了,改了之后在命令行里也能试出来了。

mysql> use testDatabase changedmysql> create table backlash (id int, value char(20));Query OK, 0 rows affected (0.00 sec)mysql> insert into backlash(id, value) values(1,'\\');Query OK, 1 row affected (0.00 sec)mysql> select * from backlash where value='\\';+------+-------+| id   | value |+------+-------+|    1 | \     |+------+-------+1 row in set (0.00 sec)mysql> select * from backlash where value like '%\\%';Empty set (0.00 sec)mysql> select * from backlash where value like '%\\\%';+------+-------+| id   | value |+------+-------+|    1 | \     |+------+-------+1 row in set (0.00 sec)mysql>

不要好像,拿出实例来
用PHP要加六个反斜线:

<?phprequire 'connect.php';$db_selected = mysql_select_db("test", $conn);$sql='select value from backlash where value like \'%\\\\\%\'';echo $sql;echo '<br />';$result=mysql_query($sql, $conn);$row=mysql_fetch_row($result);echo $row[0];echo '<br />';?>

我之前做的时候只是通过get得到的反斜线,所以直接三个就行了。弄混了。

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn