php内一些可以防止注入的函数
一、addslashes()
看名字时,不会这个英文单词的你此时应该跟我一样,看不懂单词,也看不懂这个函数到底是做啥的,那么现在我们一起来学习一下吧!
除了",他还会转义其他的符号吗?我们一起动手试试吧!
所以这里可以看出来,他是不止只对"进行转义的!
定义和用法 addslashes() 函数返回在预定义字符之前添加反斜杠的字符串。 预定义字符是: 单引号(') 双引号(") 反斜杠(\) NULL 提示:该函数可用于为存储在数据库中的字符串以及数据库查询语句准备字符串。 注释:默认地,PHP 对所有的 GET、POST 和 COOKIE 数据自动运行 addslashes()。所以您不应对已转义过的字符串使用 addslashes(),因为这样会导致双层转义。遇到这种情况时可以使用函数 get_magic_quotes_gpc() 进行检测。
二、stripslashes()
strip,一看就是剔除什么,那剔除的是啥呢?
除了剔除\,这个函数还能剔除啥呢?
定义和用法 stripslashes() 函数删除由 addslashes() 函数添加的反斜杠。 提示:该函数可用于清理从数据库中或者从 HTML 表单中取回的数据。
这个函数是不是有点像是addslashes()的死对头?在php里处理sql查询语句似乎很少看到。
二、mysql_real_escape_string()
定义和用法 mysql_real_escape_string() 函数转义 SQL 语句中使用的字符串中的特殊字符。 下列字符受影响: \x00 \n \r \ ' " \x1a 如果成功,则该函数返回被转义的字符串。如果失败,则返回 false。 语法 mysql_real_escape_string(string,connection)
例子 1
<?php $con = mysql_connect("localhost", "hello", "321"); if (!$con) { die('Could not connect: ' . mysql_error()); } // 获得用户名和密码的代码 // 转义用户名和密码,以便在 SQL 中使用 $user = mysql_real_escape_string($user); $pwd = mysql_real_escape_string($pwd); $sql = "SELECT * FROM users WHERE user='" . $user . "' AND password='" . $pwd . "'" // 更多代码 mysql_close($con); ?>
例子 2
<?php $con = mysql_connect("localhost", "hello", "321"); if (!$con) { die('Could not connect: ' . mysql_error()); } $sql = "SELECT * FROM users WHERE user='{$_POST['user']}' AND password='{$_POST['pwd']}'"; mysql_query($sql); // 不检查用户名和密码 // 可以是用户输入的任何内容,比如: $_POST['user'] = 'john'; $_POST['pwd'] = "' OR ''='"; // 一些代码... mysql_close($con); ?>
例子 3 (防御)
<?php function check_input($value) { // 去除斜杠 if (get_magic_quotes_gpc()) { $value = stripslashes($value); } // 如果不是数字则加引号 if (!is_numeric($value)) { $value = "'" . mysql_real_escape_string($value) . "'"; } return $value; } $con = mysql_connect("localhost", "hello", "321"); if (!$con) { die('Could not connect: ' . mysql_error()); } // 进行安全的 SQL $user = check_input($_POST['user']); $pwd = check_input($_POST['pwd']); $sql = "SELECT * FROM users WHERE user=$user AND password=$pwd"; mysql_query($sql); mysql_close($con); ?>
上述函数没法直接展示,只能大家自己去冥想了,.^-^.