Maison >développement back-end >tutoriel php >addslashes()用途与php怎样防止mysql注入?
1.表单数据
显示的是表单的数据
2.php的抓取的表单数据
已经自动加了\
3.mysql数据 (最下面一行)
写到mysql中居然没有
4.怀疑是被mysql软件隐藏掉了,进命令行看看:
也没有看到\
按照官方的说法
http://www.php.net/manual/zh/function.addslashes.php
一个使用 addslashes() 的例子是当你要往数据库中输入数据时。 例如,将名字 O'reilly 插入到数据库中,这就需要对其进行转义。 强烈建议使用 DBMS 指定的转义函数 (比如 MySQL 是 mysqli_real_escape_string(),PostgreSQL 是 pg_escape_string()),但是如果你使用的 DBMS 没有一个转义函数,并且使用 \ 来转义特殊字符,你可以使用这个函数。 仅仅是为了获取插入数据库的数据,额外的 \ 并不会插入。 当 PHP 指令 magic_quotes_sybase 被设置成 on 时,意味着插入 ' 时将使用 ' 进行转义。
问题:
1.addsleshes()函数在起到防止注入的作用时,是怎样一种机制?
2.stripslashes()在什么情况下使用?
3.对表单提交过来的数据直接用htmlspecialchars()转义处理并存入数据库,是不是更好?
4.好是的防止sql注入的方式是怎样的?
.
1.表单数据
显示的是表单的数据
2.php的抓取的表单数据
已经自动加了\
3.mysql数据 (最下面一行)
写到mysql中居然没有
4.怀疑是被mysql软件隐藏掉了,进命令行看看:
也没有看到\
按照官方的说法
http://www.php.net/manual/zh/function.addslashes.php
一个使用 addslashes() 的例子是当你要往数据库中输入数据时。 例如,将名字 O'reilly 插入到数据库中,这就需要对其进行转义。 强烈建议使用 DBMS 指定的转义函数 (比如 MySQL 是 mysqli_real_escape_string(),PostgreSQL 是 pg_escape_string()),但是如果你使用的 DBMS 没有一个转义函数,并且使用 \ 来转义特殊字符,你可以使用这个函数。 仅仅是为了获取插入数据库的数据,额外的 \ 并不会插入。 当 PHP 指令 magic_quotes_sybase 被设置成 on 时,意味着插入 ' 时将使用 ' 进行转义。
问题:
1.addsleshes()函数在起到防止注入的作用时,是怎样一种机制?
2.stripslashes()在什么情况下使用?
3.对表单提交过来的数据直接用htmlspecialchars()转义处理并存入数据库,是不是更好?
4.好是的防止sql注入的方式是怎样的?
.
如文档上写的呀,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这些功能了.
比如:
<code>PDO MySQL: //方法1(问号占位符) $stmt = $db->prepare('UPDATE posts SET post_title = ?, post_content = ? WHERE id = ?'); $stmt->execute(array($title,$content,$id)); //所有值视作PDO::PARAM_STR处理 //方法2(命名占位符) $stmt = $db->prepare('UPDATE posts SET post_title = :title, post_content = :content WHERE id = :id'); $stmt->execute(array(':title' => $title,':content' => $content,':id' => $id)); //所有值视作PDO::PARAM_STR处理 //方法3 $stmt = $db->prepare('UPDATE posts SET post_title = ?, post_content = ? WHERE id = ?'); $stmt->bindParam(1, $title, PDO::PARAM_STR); $stmt->bindParam(2, $content, PDO::PARAM_STR); $stmt->bindParam(3, $id, PDO::PARAM_INT); $stmt->execute(); //方法4 $stmt = $db->prepare('UPDATE posts SET post_title = :title, post_content = :content WHERE id = :id'); $stmt->bindParam(':title', $title, PDO::PARAM_STR); $stmt->bindParam(':content', $content, PDO::PARAM_STR); $stmt->bindParam(':id', $id, PDO::PARAM_INT); $stmt->execute(); MySQLi: //MySQLi只需执行一次bind_param,要比PDO简洁一些,MySQLi不支持命名占位符. $stmt->bind_param('ssi', $title, $content, $id);</code>
你说的htmlspecialchars是在输出HTML时防御XSS攻击的,区别于上面说的防御SQL注入.