php过滤特殊危险字符的总结

一般,对于传进来的字符,php可以用addslashes函数处理一遍(要get_magic_quotes_gpc()为假才处理,不然就重复转义了!),这样就能达到一定程度的安全要求
比如这样

 代码如下 复制代码

if (!get_magic_quotes_gpc()) {    
     add_slashes($_GET);    
     add_slashes($_POST);    
     add_slashes($_COOKIE);    
}    
    
function add_slashes($string) {    
     if (is_array($string)) {    
         foreach ($string as $key => $value) {    
             $string[$key] = add_slashes($value);    
         }    
     } else {    
         $string = addslashes($string);    
     }    
     return $string;    
}

但是还可以更进一步进行重新编码,解码,如下:

 代码如下 复制代码

//编码

function htmlencode($str) {     
      if(empty($str)) return;
      if($str=="") return $str;      
      $str=trim($str);
      $str=str_replace("&","&",$str);
      $str=str_replace(">",">",$str);
      $str=str_replace("<","<",$str);
      $str=str_replace(chr(32)," ",$str);
      $str=str_replace(chr(9)," ",$str);
      $str=str_replace(chr(34),"&",$str);
      $str=str_replace(chr(39),"'",$str);
      $str=str_replace(chr(13),"<br />",$str);
      $str=str_replace("'","''",$str);
      $str=str_replace("select","select",$str);
      $str=str_replace("join","join",$str);
      $str=str_replace("union","union",$str);
      $str=str_replace("where","where",$str);
      $str=str_replace("insert","insert",$str);
      $str=str_replace("delete","delete",$str);
      $str=str_replace("update","update",$str);
      $str=str_replace("like","like",$str);
      $str=str_replace("drop","drop",$str);
      $str=str_replace("create","create",$str);
      $str=str_replace("modify","modify",$str);
      $str=str_replace("rename","rename",$str);
      $str=str_replace("alter","alter",$str);
      $str=str_replace("cast","cas",$str);      
      return $str; 
}

这样就能更放心的对外来数据进行入库处理了, 但是从数据库取出来,在前台显示的时候,必须重新解码一下:

 代码如下 复制代码

//解码

function htmldecode($str) {     
      if(empty($str)) return;
      if($str=="")  return $str;
      $str=str_replace("select","select",$str);
      $str=str_replace("join","join",$str);
      $str=str_replace("union","union",$str);
      $str=str_replace("where","where",$str);
      $str=str_replace("insert","insert",$str);
      $str=str_replace("delete","delete",$str);
      $str=str_replace("update","update",$str);
      $str=str_replace("like","like",$str);
      $str=str_replace("drop","drop",$str);
      $str=str_replace("create","create",$str);
      $str=str_replace("modify","modify",$str);
      $str=str_replace("rename","rename",$str);
      $str=str_replace("alter","alter",$str);
      $str=str_replace("cas","cast",$str);
      $str=str_replace("&","&",$str);
      $str=str_replace(">",">",$str);
      $str=str_replace("<","<",$str);
      $str=str_replace(" ",chr(32),$str);
      $str=str_replace(" ",chr(9),$str);
      $str=str_replace("&",chr(34),$str);
      $str=str_replace("'",chr(39),$str);
      $str=str_replace("<br />",chr(13),$str);
      $str=str_replace("''","'",$str);      
      return $str;
}

虽然多了一步编码,解码的过程,但是安全方面,会更进一步,要如何做,自己取舍吧。

再附一些

 代码如下 复制代码

function safe_replace($string) {
 $string = str_replace(' ','',$string);
 $string = str_replace(''','',$string);
 $string = str_replace(''','',$string);
 $string = str_replace('*','',$string);
 $string = str_replace('"','"',$string);
 $string = str_replace("'",'',$string);
 $string = str_replace('"','',$string);
 $string = str_replace(';','',$string);
 $string = str_replace('<','<',$string);
 $string = str_replace('>','>',$string);
 $string = str_replace("{",'',$string);
 $string = str_replace('}','',$string);
 return $string;
}

更全面的

 代码如下 复制代码

//处理提交的数据
function htmldecode($str) {
 if (empty ( $str ) || "" == $str) {
 return "";
 }
 
 $str = strip_tags ( $str );
 $str = htmlspecialchars ( $str );
 $str = nl2br ( $str );
 $str = str_replace ( "?", "", $str );
 $str = str_replace ( "*", "", $str );
 $str = str_replace ( "!", "", $str );
 $str = str_replace ( "~", "", $str );
 $str = str_replace ( "$", "", $str );
 $str = str_replace ( "%", "", $str );
 $str = str_replace ( "^", "", $str );
 $str = str_replace ( "^", "", $str );
 $str = str_replace ( "select", "", $str );
 $str = str_replace ( "join", "", $str );
 $str = str_replace ( "union", "", $str );
 $str = str_replace ( "where", "", $str );
 $str = str_replace ( "insert", "", $str );
 $str = str_replace ( "delete", "", $str );
 $str = str_replace ( "update", "", $str );
 $str = str_replace ( "like", "", $str );
 $str = str_replace ( "drop", "", $str );
 $str = str_replace ( "create", "", $str );
 $str = str_replace ( "modify", "", $str );
 $str = str_replace ( "rename", "", $str );
 $str = str_replace ( "alter", "", $str );
 $str = str_replace ( "cast", "", $str );
 
 $farr = array ("//s+/", //过滤多余的空白
"/<(//?)(img|script|i?frame|style|html|body|title|link|meta|/?|/%)([^>]*?)>/isU", //过滤 <script 防止引入恶意内容或恶意代码,如果不需要插入flash等,还可以加入<object的过滤
"/(<[^>]*)on[a-zA-Z]+/s*=([^>]*>)/isU" )//过滤javascript的on事件
;
 $tarr = array (" ", "", //如果要直接清除不安全的标签,这里可以留空
"" );
 return $str;
}

时间: 2024-12-21 16:16:15

php过滤特殊危险字符的总结的相关文章

aspx-c # asp.net有没有一段正则表达式 可以过滤那些危险字符的

问题描述 c # asp.net有没有一段正则表达式 可以过滤那些危险字符的 c # asp.net有没有一段正则表达式 可以过滤那些危险字符的 比如我在文本框输入<br>alert("测试") 或者 update delete insert 这样的字符就提示是危险字符串.. 有上面好的思路 或者相关的文章 解决方案 cmd.Parameters.AddWithValue(""@参数名""参数值);假定这里cmd是SqlCommand

SQL字符串过滤 检测是否有危险字符

  一个C# SQL数据库字串操作函数,可实现对SQL字符串过滤.检测SQL是否有危险字符.修正sql语句中的转义字符,确保SQL不被注入: SQL字符串过滤函数: 01public static bool ProcessSqlStr(string Str) 02{ 03 bool ReturnValue = true; 04 try 05 { 06 if (Str.Trim() != "") 07 { 08 string SqlStr ="exec|insert+|sele

url传递中文字符,特殊危险字符的解决方案(仅供参考)urldecode、base64

web开发的过程中,当我们需要在url中传递中文字符或是其它的html等特殊字符时,似乎总会碰到各种各样的小问题,因为不同的浏览器对他们的编码又不一样.对于中文,一般的做法是: 把这些文本字符串传给url之前,先进行urlencode($text)一下. 但是对于一些很"危险"的字符,比如说html字符,甚至是SQL注入相关的字符,如果很明显的传给系统,出于安全考虑,系统一般都会把它们过滤掉的. 那么,如果我们需要保留这些危险字符,不被过滤,该这么办呢? 我想到的办法是先给它们 bas

给whygod,如何过滤高亮显示非法字符!

高亮显示 <?//我只是做一个测试,如果再用类似tmd的字符串,一定要注意,如果字符串中的字符出现在$StartReplaceHtml或者$EndReplaceHtml中,你需要修改下面的preg_replace中的规则$CheckedMessage="Hello!!他X的..他....X...的....How are you m d ";     //the message to be checked echo $CheckedMessage."<br>&

ASP过滤SQL非法字符并格式化html代码

sql <%function changechr(str) changechr=replace(replace(replace(replace(str,"<","<"),">",">"),chr(13),"<br>")," "," ") changechr=replace(replace(replace(replace(cha

dedecms“输入内容存在危险字符,安全起见,已被本站拦截”的解决方法

风信网(ithov.com)原创文章:鉴于dedecms官方补丁更新较慢,但现在很多的网站都在使用dedecms的建站系统来建立属于自己的网站,但是有很多dede的网站因为安全问题而被黑客留下了木马,或是后门程序,这是互联网中是非常危险的,黑客可以利用网站进行流量劫持,挂木马,做钓鱼等. 笔者推荐大家安装360推出的网站安全检测工具,来修复dedecms的网站安全漏洞,迅速查杀网站的木马及后门. 安装完dedecms检测程序之后的效果截图如下: 今天在测试dedecms程序时,发现dedecms

CodeIgniter框架过滤HTML危险代码_php实例

CodeIgniter过滤HTML危险代码的方法其实有好几种,其中最常见的有如下几种: 1.可以选择使用htmlspecialchars()方法过滤. 2.可以将config文件夹下面的config.php文件中的$config['global_xss_filtering'] = FALSE;设置为: 复制代码 代码如下: $config['global_xss_filtering'] = true; 但是这样设置后会加大服务器的开销的.所以看情况来设置. 3.可以在$this->input->

php中url传递中文字符,特殊危险字符的解决方法_php技巧

我们需要在url中传递中文字符或是其它的html等特殊字符,似乎总会有各种乱,不同的浏览器对他们的编码又不一样, 对于中文,一般的做法是: 把这些文本字符串传给url之前,先进行urlencode($text)一下: 但是对于一些很"危险"的字符,比如说html字符,甚至是SQL注入相关的字符,如果很明显的传给系统,出于安全考虑,系统一般都会把它们过滤掉的. 现在,我们需要这些危险字符,该这么办? 我想到的办法是 先给它们 base64_encode($text) 编码,到服务端时,又

php中url传递中文字符,特殊危险字符的解决方案

我们需要在url中传递中文字符或是其它的html等特殊字符,似乎总会有各种乱,不同的浏览器对他们的编码又不一样, 对于中文,一般的做法是: 把这些文本字符串传给url之前,先进行urlencode($text)一下: 但是对于一些很"危险"的字符,比如说html字符,甚至是SQL注入相关的字符,如果很明显的传给系统,出于安全考虑,系统一般都会把它们过滤掉的. 现在,我们需要这些危险字符,该这么办? 我想到的办法是 先给它们 base64_encode($text) 编码,到服务端时,又