addslashes()用途与php怎样防止mysql注入?
php5.2环境,启用了魔术引用,前台表单提交后在php写入mysql前打印数据看到确实加了,但是写到数据库中却没有。
1.表单数据
显示的是表单的数据
2.php的抓取的表单数据
已经自动加了\
3.mysql数据 (最下面一行)
写到mysql中居然没有
4.怀疑是被mysql软件隐藏掉了,进命令行看看:
也没有看到\
按照官方的说法
http://www.php.net/manual/zh/...
一个使用 addslashes() 的例子是当你要往数据库中输入数据时。 例如,将名字 O'reilly 插入到数据库中,这就需要对其进行转义。 强烈建议使用 DBMS 指定的转义函数 (比如 MySQL 是 mysqli_real_escape_string(),PostgreSQL 是 pg_escape_string()),但是如果你使用的 DBMS 没有一个转义函数,并且使用 \ 来转义特殊字符,你可以使用这个函数。 仅仅是为了获取插入数据库的数据,额外的 \ 并不会插入。 当 PHP 指令 magic_quotes_sybase 被设置成 on 时,意味着插入 ' 时将使用 ' 进行转义。
问题:
1.addsleshes()函数在起到防止注入的作用时,是怎样一种机制?
2.加了斜杠的变量在插入到mysql的时候,斜杠哪去了?
3.对表单提交过来的数据本身就有引号和双引号的,应该怎么处理?
.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
自己来答一下吧,这里不讨论pdo和mysqli的prepare方法。
addslashes()和get_magic_quotes_gpc()其实这里面会有几个问题细节。
1.addslashes()斜杠是怎么防止注入的
2.get_magic_quotes_gpc()默认启用的时候加的斜杠,为什么存到mysql中没有
3.正常的处理方法是怎么样的
分别答一下。
1.addslashes()就是为变量中的'或者"加\,当有人在变量(url)打入特殊的字符串的时候,语义起到变化。加斜杠后破坏语义,所以起到防注入的作用。具体的sf上面文章很多,有举自己查一下。
2.第二个问题,不管系统是否启用了magic_quotes_gpc(),当你写入一个字符串,比如 let\'s ,真正存到mysql中,这个斜杠都不见了。也就是说mysqli->query()之前,php会进行悄悄进行strip_slashes(),所以存进行去就没有了。
这里衍生出另一个问题,在不加斜杠的情况下,如果你的sql字符串是用两个'包含的,那么变量包含'会导致sql语句错误。如果包含在两个"之间,变量包含"会造成sql语法错误。
3.正确的做法
a.手工操作。magic_quotes_gpc如果没有启用,就手工对所有$_GET和$_POST变量加斜杠。
b.对存入mysql的变量不需要strip_slashe(),因为php会自动去的。
c.仅在php中进行变量操作和输出的情况下,需要strip_slashe(),不然显示在浏览器上就多个斜杠。
d.如果是个新项目,从头就用pdo或者prepare
ps:
在php5.4及以后的版本中,不再支持magic_quotes_gpc,即使加到php.ini中也没用。
但是,使用get_magic_quotes_gpc()这个函数还是有用的,用来判断是否了启用魔术引用。
.
如文档上写的呀,
addslashes
就是为参数的引号前加了个斜杠。也如你所打印的数据,参数前也有斜杠。
但是数据库里就不应该有斜杠呀!
addslashes
是如何防注入的,就是防止在我们写SQL
时直接套用输入参数而导致产生可被注入的SQL
来防注入的。例如
$sql = "SELECT * FROM user WHERE id = '$id'";
,如果这里的$id
参数被人故意操作成了1' OR '1 = 1'
,那不就成了注入SQL
了吗?而如果用
addslashes
加上斜杠,$id
中的引号就会被转意,也就不会产生错误的SQL
。但这些结果都不会影响到数据写入,因为真正插入和更新数据时,这些斜杠又会被转意回来的。防御SQL注入(输入数据库):
PDO bindParam 或 mysqli_stmt_bind_param: 避免SQL注入.
addslashes: 用反斜杠转义所有的单引号,双引号,反斜杠和NUL's,一定程度上避免SQL注入.
mysqli_real_escape_string: 转义SQL语句中的特殊字符.
有了bind_param,就不需要使用addslashes,mysqli_real_escape_string,magic_quotes_gpc这些功能了.
比如:
你说的htmlspecialchars是在输出HTML时防御XSS攻击的,区别于上面说的防御SQL注入.