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一统江湖的好。
