具体用法
addslashes防止SQL注入
虽然国内很多PHP程序员仍在依靠addslashes防止SQL注入还是建议大家加强中文防止SQL注入的检查addslashes的问题在 于黑客 可以用xbf来代替单引号而addslashes只是将xbf修改为xbfc成为一个有效的多字节字符其中的xbfc仍会 被看作是单引号所以addslashes无法成功拦截
当然addslashes也不是毫无用处它是用于单字节字符串的处理多字节字符还是用mysql_real_escape_string吧
另外对于php手册中get_magic_quotes_gpc的
举例
代码如下
<?php
function post_check($post)
{
if (!get_magic_quotes_gpc()) // 判断magic_quotes_gpc是否为打开
{
$post = addslashes($post); // 进行magic_quotes_gpc没有打开的情况对提交数据的过滤
}
$post = str_replace("_" "_" $post); // 把 _过滤掉
$post = str_replace("%" "%" $post); // 把 % 过滤掉
$post = nlbr($post); // 回车转换
$post= htmlspecialchars($post); // html标记转换
return $post;
}
?>
或
<?php
function inject_check($sql_str)
{
return eregi(select|insert|update|delete||
function verify_id($id=null)
{
if (!$id) { exit(没有提交参数!); } // 是否为空判断
elseif (inject_check($id)) { exit(提交的参数非法!); } // 注射判断
elseif (!is_numeric($id)) { exit(提交的参数非法!); } // 数字判断
$id = intval($id); // 整型化
return $id;
}
?>
string mysql_real_escape_string ( string $unescaped_string [ resource $link_identifier ] )
本函数将 unescaped_string 中的特殊字符转义并计及连接的当前字符集因此可以安全用于 mysql_query()
Note: mysql_real_escape_string() 并不转义 % 和 _
mysql_real_escape_string
Example# mysql_real_escape_string() 例子
代码如下
<?php
$item = "Zaks and Dericks Laptop" ;
$escaped_item = mysql_real_escape_string ( $item );
printf ( "Escaped string: %sn" $escaped_item );
?>
以上例子将产生如下输出
Escaped string: Zaks and Dericks Laptop
mysql_escape_string
本函数将 unescaped_string 转义使之可以安全用于 mysql_query()
注: mysql_escape_string() 并不转义 % 和 _
本函数和 mysql_real_escape_string() 完全一样除了 mysql_real_escape_string() 接受的是一个连接句柄并根据当前字符集转移字符串之外mysql_escape_string() 并不接受连接参数也不管当前字符集设定
例子 mysql_escape_string() 例子
代码如下
<?php
$item = "Zaks Laptop";
$escaped_item = mysql_escape_string($item);
printf ("Escaped string: %sn" $escaped_item);
?>
输出
Escaped string: Zaks Laptop
mysql_real_escape_string和mysql_escape_string这个函数的区别
mysql_real_escape_string 必须在(PHP >= PHP )的情况下才能使用否则只能用 mysql_escape_string 两者的区别是mysql_real_escape_string 考虑到连接的当前字符集而mysql_escape_string 不考虑
我们可以利用判断来综合处理
代码如下 function cleanuserinput($dirty){
if (get_magic_quotes_gpc()) {
$clean = mysql_real_escape_string(stripslashes($dirty));
}else{
$clean = mysql_real_escape_string($dirty);
}
return $clean;
}
总结一下
* addslashes() 是强行加;
* mysql_real_escape_string() 会判断字符集但是对PHP版本有要求;
* mysql_escape_string不考虑连接的当前字符集