PHP字符编码与特殊字符过滤

Post by agang 2010-8-16 10:59 Monday Filed under:php

1、强制加入反斜线

 

由于有些主机默认开启魔术引用get_magic_quotes_gpc,有些可能关闭,所以在程序上最好一律强制加入反斜线,这样可以统一处理,字符涉及单引号、双引号和反斜线。

PHP代码
   
function fnAddSlashes($data)      
{      
    if(!get_magic_quotes_gpc()) //只对POST/GET/cookie过来的数据增加转义      
        return is_array($data)?array_map('addslashes',$data):addslashes($data);      
    else     
        return $data;      

 

 
 

2、对特殊字符处理
以下是几个常用字符串处理,可以视具体情况取舍。由于上面已经对提交表单数据进行一次转义,所以如果需要对内容替换或过滤需要考虑addslashes对相关字符的影响,替换或查找时需考虑反斜杠的添加。其它字符替换不影响,比如\r\n替换。

A、多个连续空格只保留一个

PHP代码
   
$data = preg_replace("/\s(?=\s)/","\\1",$data );//多个连续空格只保留一个

 

B、回车换行替换成
 

PHP代码
   
$data = str_replace("\r","<BR>",$data );      
$data = str_replace("\n","<BR>",$data );      
//html中默认<BR>没封堵,xhtml中<BR>有封堵,建议使用<BR>

 

 
 

C、多个连续
只保留一个

PHP代码
   
$data = preg_replace("/((<BR\ ?>)+)/i", "<BR>", $data );//多个连续<BR>标签只保留一个 

 

 

 

D、全部过滤HTML标记
该方式是全部过滤潜在危险的标记,包括HTML、链接、未封堵HTML标记、JS、PHP。

使用函数strip_tags($data)

该函数使用后会过滤全部的HTML标记(包括链接)和PHP标记、JS代码等,其中链接会保留链接原文只是去除<a>标记和href部分内容,PHP标记和JS标记则会整体去除,包括中间的内容

E、不过滤标记,只是把他们HTML化

该方法是把原提交内容全部按照普通文本来处理。

使用函数htmlspecialchars($data),该函数执行后会把提交数据全部按照普通文本来展示

使用htmlentities函数执行结果(中文显示乱码)

 

三、写入数据库
由于使用addslashes($data)后对于高级的可信任用户可以直接写入数据库,但是addslashes无法拦截使用0xbf27代替的单引号,所以最好还是使用mysql_real_escape_string或mysql_escape_string进行转义,不过转义之前需先去除反斜杠(假设已默认开启addslashes)。

PHP代码
   
function fnEscapeStr($data){      
    if (get_magic_quotes_gpc()){      
        $data= stripslashes($value);      
    }      
    $data="'". mysql_escape_string($value) ."'";      
    return $data;      
}      
$data=fnEscapeStr($data); 

 
四、提交后的即时显示
1、如果上文使用了addslashes,则必须在把数据回显之前去除反斜线

使用函数stripslashes($data)

注意这个函数只是面向被addslashes($data)处理后的数据,要谨慎使用,否则会导致反斜线丢失(比如内容的文件夹路径分割线、驱动器路径等)。

2、使用函数htmlspecialchars($data),该函数执行后会把提交数据全部按照文本来展示,除非允许链接等需特殊处理外,可以一律使用 htmlspecialchars输出,尤其是对于未封堵的HTML标记,如果既没有过滤再不采用标记转换,那么输出后可能会导致版面混乱。

htmlentities则不建议使用,一方面对输出的源码造成很大的阅读障碍,再者使用htmlentities函数会造成双字节字符比如中文会显示一堆乱码。其它字符显示还算正常。

第二种输出方法,视情况需要,如果确认没有非法标记或潜在的执行风险,可以直接输出。

htmlentities和htmlspecialchars这两个函数的功能都是转换字符为HTML字符编码,特别是url和代码字符串。防止字符标记被浏览器执行。转换英文时二者不会出现问题,当转换中文时htmlentities()必须加上编码,否则就会出现乱码。

 
PHP代码
   
echo htmlentities($str, ‘utf-8′);//或者是gb2312,注意:不支持GBK      
echo htmlentities($str, ENT_QUOTES, ‘utf-8′);      
     
echo htmlspecialchars($str, ‘utf-8′);      
echo htmlspecialchars($str, ENT_QUOTES, ‘utf-8′); 

 

区别:htmlentities转换所有的html标记,而htmlspecialchars只转换&、”、’、<、>这5个标记

PS:有些GBK编码的内容,要在后面加个空格才不会显示正常,否则就出现乱码,不解。 还是UTF-8一统江湖的好。
 

引用地址:

发表评论:

姓  名:
电子邮件: (选填)
个人主页: (选填)
内  容: