php 恶意代码过滤函数

 更新时间:2016年11月25日 15:26  点击:1779

Public Function DecodeFilter(html, filter)
              html=LCase(html)
              filter=split(filter,",")
              For Each i In filter
                     Select Case i
                            Case "SCRIPT"              ' 去除所有客户端脚本javascipt,vbscript,jscript,js,vbs,event,...
                                   html = exeRE("(javascript|jscript|vbscript|vbs):", "#", html)
                                   html = exeRE("</?script[^>]*>", "", html)
                                   html = exeRE("on(mouse|exit|error|click|key)", "", html)
                            Case "TABLE":              ' 去除表格<table><tr><td><th>
                                   html = exeRE("</?table[^>]*>", "", html)
                                   html = exeRE("</?tr[^>]*>", "", html)
                                   html = exeRE("</?th[^>]*>", "", html)
                                   html = exeRE("</?td[^>]*>", "", html)
                                   html = exeRE("</?tbody[^>]*>", "", html)
                            Case "CLASS"              ' 去除样式类class=""
                                   html = exeRE("(<[^>]+) class=[^ |^>]*([^>]*>)", "$1 $2", html)
                            Case "STYLE"              ' 去除样式style=""
                                   html = exeRE("(<[^>]+) style=""[^""]*""([^>]*>)", "$1 $2", html)
                                   html = exeRE("(<[^>]+) style='[^']*'([^>]*>)", "$1 $2", html)
                            Case "IMG"              ' 去除样式style=""
                                   html = exeRE("</?img[^>]*>", "", html)
                            Case "XML"              ' 去除XML<?xml>
                                   html = exeRE("<\?xml[^>]*>", "", html)
                            Case "NAMESPACE"       ' 去除命名空间<o></o>
                                   html = exeRE("</?[a-z]+:[^>]*>", "", html)
                            Case "FONT"              ' 去除字体<font></font>
                                   html = exeRE("</?font[^>]*>", "", html)
                                   html = exeRE("</?a[^>]*>", "", html)
                                   html = exeRE("</?span[^>]*>", "", html)
                                   html = exeRE("</?br[^>]*>", "", html)
                            Case "MARQUEE"              ' 去除字幕<marquee></marquee>
                                   html = exeRE("</?marquee[^>]*>", "", html)
                            Case "OBJECT"              ' 去除对象<object><param><embed></object>
                                   html = exeRE("</?object[^>]*>", "", html)
                                   html = exeRE("</?param[^>]*>", "", html)
                                   'html = exeRE("</?embed[^>]*>", "", html)
                            Case "EMBED"
                               html =  exeRE("</?embed[^>]*>", "", html)
                            Case "DIV"              ' 去除对象<object><param><embed></object>
                                   html = exeRE("</?div([^>])*>", "$1", html)
                                   html = exeRE("</?p([^>])*>", "$1", html)
                            Case "ONLOAD"              ' 去除样式style=""
                                   html = exeRE("(<[^>]+) onload=""[^""]*""([^>]*>)", "$1 $2", html)
                                   html = exeRE("(<[^>]+) onload='[^']*'([^>]*>)", "$1 $2", html)
                            Case "ONCLICK"              ' 去除样式style=""
                                   html = exeRE("(<[^>]+) onclick=""[^""]*""([^>]*>)", "$1 $2", html)
                                   html = exeRE("(<[^>]+) onclick='[^']*'([^>]*>)", "$1 $2", html)
                            Case "ONDBCLICK"              ' 去除样式style=""
                                   html = exeRE("(<[^>]+) ondbclick=""[^""]*""([^>]*>)", "$1 $2", html)
                                   html = exeRE("(<[^>]+) ondbclick='[^']*'([^>]*>)", "$1 $2", html)
                                   
                     End Select
              Next
              'html = Replace(html,"<table","<")
              'html = Replace(html,"<tr","<")
              'html = Replace(html,"<td","<")
              DecodeFilter = html
       End Function

非法字符过滤本文章主要是讲 php 过滤非法字符没讲asp过滤非法字符 的函数但是思想都一样的.

) 过滤影响MySQL正常运行的字符。

当需要把用户输入的内容(有可能包含单引号、双引号 、反斜线、空字元 NUL )代入到mysql的语句 中执行时,应该把APACHE中的magic_quotes_gpc项设成On。

如果APACHE中的此项设成Off时,也可用php的函数addslashes()达到相同的目的,但这两种手段不能同时使用,否则会出现重复替换,出现错误。

样例:

PHP代码
<?php    
  
if (get_magic_quotes_gpc()) {    
  
    $content=$_POST["content"];    
  
} else {    
  
    $content=addslashes($_POST["content"]);    
  
}    
  
?>   

当然,如果APACHE中的magic_quotes_gpc项为On,但有时又不想转义某项的特殊字符,可以使用stripslashes()去掉其中的 \

2) 过滤影响MSSQL正常运行的字符。

当需要把用户输入的内容(有可能包含单引号)代入到mssql的语句中执行时,应该把APACHE中的magic_quotes_sybase项设成On,此时magic_quotes_gpc项不再生效。

如果APACHE中的此项设成Off时,php中并没有合适的函数达到相同的目的,只能使用字符串替换函数来达到此目的。

样例:

PHP代码
<?php    
  
$content=str_replace("'","''"$_POST["content"]);    
  
?>   

现在10.218.17.53上的PHP既要访问mysql又要访问mssql,APACHE中的设置不能兼顾两种数据库,所以只对mysql做了相应设置。

2. 应对用户输入包含SQL语句的一个措施。

以下两种SQL写法都比较普遍,但安全程度是不同的,当用户提交的$id='1 and 1=2 union select ...'时第一种就会显示出不该显示的数据,而第二种就相对安全些。

SQL代码
Select * FROM article Where articleid=$id    
Select * FROM article Where articleid='$id'   

3. 防止用户输入的内容因包含html标签或javascript而影响页面的正常显示。

可以用htmlspecialchars()过滤其中的 & " < >

PHP代码
$content = htmlspecialchars($content);   

4. 当页面要显示的内容包含回车换行时,可以使用nl2br()来达到页面上换行的效果。
方法一.
<?
function chkstr($paravalue,$paratype) //过滤非法字符
{
 if($paratype==1)
 {
  $inputstr=str_replace("'","''",$paravalue);
  }
 elseif($paratype==2)
 {
  $inputstr=str_replace("'","",$paravalue);
  }
 return $inputstr;
}
$user1=chkstr($_GET["user"],1);
$user2=chkstr($_GET["user"],2);
//$user=$_GET["user"];
print "方式1-----------------<br>";
print "$user1 <br>";
print "方式2-----------------<br>";
print "$user2 <br>";
?>
方法二.


<?php
//用法:qstr($str, get_magic_quotes_gpc())
function qstr($string, $magic_quotes=false, $tag=false)
{
  $tag_str = '';
  if ($tag) $tag_str = "'";
  if (!$magic_quotes) {
    if (strnatcmp(PHP_VERSION, '4.3.0') >= 0) {
      return $tag_str.mysql_real_escape_string($string).$tag_str;
    }
    $string = str_replace("'", "[url=file://\\]\\'[/url]" , str_replace('\\', '\\\\', str_replace("\0", "[url=]\\\0[/url]", $string)));
    return  $tag_str.$string.$tag_str;
  }
  return $tag_str.str_replace('\\"', '"', $string).$tag_str;
}
?>

php过滤不安全字符函数

function uh($str)
{
    $farr = array(
        "/\s+/",//过滤多余的空白
        "/<(\/?)(script|i?frame|style|html|body|title|link|meta|\?|\%)([^>]*?)>/isU",//过滤 <script 等可能引入恶意内容或恶意改变显示布局的代码,如果不需要插入flash等,还可以加入<object的过滤
        "/(<[^>]*)on[a-zA-Z]+\s*=([^>]*>)/isU",//过滤JavaScript的on事件
    );
   $tarr = array(
        " ",
        "<\\1\\2\\3>", //如果要直接清除不安全的标签,这里可以留空
        "\\1\\2",
   );

  $str = preg_replace($farr,$tarr,$str);
  return $str;


老话题今天又研究了一下:

目前我觉得有效的办法还是只有一个,图片验证码。

其它几种行不通的方法:
1.判断HTTP_REFERER,实际上这个信息是浏览器给服务器的,所以完全可以模拟
2.判断session 代码如下:
<?php
session_start();
if(isset($_POST['name']) && !empty($_POST['name'])){
if($_POST['check']==$_SESSION['check']){
  echo '正常访问';
}
else{
echo '外部访问';

}
}
$token=md5(uniqid(rand(),true));
$_SESSION['check']=$token;

?>
<FORM METHOD=POST ACTION="">
<INPUT TYPE="text" NAME="name"><INPUT TYPE="text" NAME="check" value="<?php echo $token;?>"><INPUT TYPE="submit">
</FORM>

[转]SQL 注入
SQL 注入
很多 web 开发者没有注意到 SQL 查询是可以被篡改的,因而把 SQL 查询当作可信任的命令。殊不知道,SQL 查询可以绕开访问控制,从而绕过身份验证和权限检查。更有甚者,有可能通过 SQL 查询去运行主机操作系统级的命令。
直接 SQL 命令注入就是攻击者常用的一种创建或修改已有 SQL 语句的技术,从而达到取得隐藏数据,或覆盖关键的值,甚至执行数据库主机操作系统命令的目的。这是通过应用程序取得用户输入并与静态参数组合成 SQL 查询来实现的。下面将会给出一些真实的例子。
由于在缺乏对输入的数据进行验证,并且使用了超级用户或其它有权创建新用户的数据库帐号来连接,攻击者可以在数据库中新建一个超级用户。
Example#1 一段实现数据分页显示的代码……也可以被用作创建一个超级用户(PostgreSQL系统)。
复制PHP内容到剪贴板
PHP代码:
$offset = $argv[0]; // 注意,没有输入验证!
$query  = "SELECT id, name FROM products ORDER BY name LIMIT 20 OFFSET $offset;";
$result = pg_query($conn, $query);


一般的用户会点击 $offset 已被斌值的“上一页”、“下一页”的链接。原本代码只会认为 $offset 是一个数值。然而,如果有人尝试把以下语句先经过 urlencode() 处理,然后加入URL中的话:
0;
insert into pg_shadow(usename,usesysid,usesuper,usecatupd,passwd)
    select 'crack', usesysid, 't','t','crack'
    from pg_shadow where usename='postgres';
--
那么他就可以创建一个超级用户了。注意那个 0; 只不过是为了提供一个正确的偏移量以便补充完整原来的查询,使它不要出错而已。
Note: -- 是 SQL 的注释标记,一般可以使用来它告诉 SQL 解释器忽略后面的语句。

对显示搜索结果的页面下手是一个能得到密码的可行办法。攻击者所要做的只不过是找出哪些提交上去的变量是用于 SQL 语句并且处理不当的。而这类的变量通常都被用于 SELECT 查询中的条件语句,如 WHERE, ORDER BY, LIMIT 和 OFFSET。如果数据库支持 UNION 构造的话,攻击者还可能会把一个完整的 SQL 查询附加到原来的语句上以便从任意数据表中得到密码。因此,对密码字段加密是很重要的。
Example#2 显示文章……以及一些密码(任何数据库系统)
复制PHP内容到剪贴板
PHP代码:
$query  = "SELECT id, name, inserted, size FROM products
                  WHERE size = '$size'
                  ORDER BY $order LIMIT $limit, $offset;";
$result = odbc_exec($conn, $query);


可以在原来的查询的基础上添加另一个 SELECT 查询来获得密码:
'
union select '1', concat(uname||'-'||passwd) as name, '1971-01-01', '0' from usertable;
--
假如上述语句(使用 ' 和 --)被加入到 $query 中的任意一个变量的话,那么就麻烦了。
SQL 中的 UPDATE 也会受到攻击。这种查询也可能像上面的例子那样被插入或附加上另一个完整的请求。但是攻击者更愿意对 SET 子句下手,这样他们就可以更改数据表中的一些数据。这种情况下必须要知道数据库的结构才能修改查询成功进行。可以通过表单上的变量名对字段进行猜测,或者进行暴力破解。对于存放用户名和密码的字段,命名的方法并不多。
Example#3 从重设密码……到获得更多权限(任何数据库系统)
复制PHP内容到剪贴板
PHP代码:
$query = "UPDATE usertable SET pwd='$pwd' WHERE uid='$uid';";


但是恶意的用户会把 ' or uid like'%admin%'; -- 作为变量的值提交给 $uid 来改变 admin 的密码,或者把 $pwd 的值提交为 "hehehe', admin='yes', trusted=100 "(后面有个空格)去获得更多的权限。这样做的话,查询语句实际上就变成了:
复制PHP内容到剪贴板
PHP代码:
// $uid == ' or uid like'%admin%'; --
$query = "UPDATE usertable SET pwd='...' WHERE uid='' or uid like '%admin%'; --";
// $pwd == "hehehe', admin='yes', trusted=100 "
$query = "UPDATE usertable SET pwd='hehehe', admin='yes', trusted=100 WHERE
...;";


下面这个可怕的例子将会演示如何在某些数据库上执行系统命令。
Example#4 攻击数据库所在主机的操作系统(MSSQL Server)
复制PHP内容到剪贴板
PHP代码:
$query  = "SELECT * FROM products WHERE id LIKE '%$prod%'";
$result = mssql_query($query);


如果攻击提交 a%' exec master..xp_cmdshell 'net user test testpass /ADD' -- 作为变量 $prod的值,那么 $query 将会变成
复制PHP内容到剪贴板
PHP代码:
$query  = "SELECT * FROM products
                    WHERE id LIKE '%a%'
                    exec master..xp_cmdshell 'net user test testpass /ADD'--";
$result = mssql_query($query);


MSSQL 服务器会执行这条 SQL 语句,包括它后面那个用于向系统添加用户的命令。如果这个程序是以 sa 运行而 MSSQLSERVER 服务又有足够的权限的话,攻击者就可以获得一个系统帐号来访问主机了。
Note: 虽然以上的例子是针对某一特定的数据库系统的,但是这并不代表不能对其它数据库系统实施类似的攻击。使用不同的方法,各种数据库都有可能遭殃。

预防措施
也许有人会自我安慰,说攻击者要知道数据库结构的信息才能实施上面的攻击。没错,确实如此。但没人能保证攻击者一定得不到这些信息,一但他们得到了,数据库有泄露的危险。如果你在用开放源代码的软件包来访问数据库,比如论坛程序,攻击者就很容得到到相关的代码。如果这些代码设计不良的话,风险就更大了。
这些攻击总是建立在发掘安全意识不强的代码上的。所以,永远不要信任外界输入的数据,特别是来自于客户端的,包括选择框、表单隐藏域和 cookie。就如上面的第一个例子那样,就算是正常的查询也有可能造成灾难。
永远不要使用超级用户或所有者帐号去连接数据库。要用权限被严格限制的帐号。
检查输入的数据是否具有所期望的数据格式。PHP 有很多可以用于检查输入的函数,从简单的变量函数和字符类型函数(比如 is_numeric(),ctype_digit())到复杂的 Perl 兼容正则表达式函数都可以完成这个工作。
如果程序等待输入一个数字,可以考虑使用 is_numeric() 来检查,或者直接使用 settype() 来转换它的类型,也可以用 sprintf() 把它格式化为数字。
Example#5 一个实现分页更安全的方法
复制PHP内容到剪贴板
PHP代码:
settype($offset, 'integer');
$query = "SELECT id, name FROM products ORDER BY name LIMIT 20 OFFSET $offset;";
// 请注意格式字符串中的 %d,如果用 %s 就毫无意义了
$query = sprintf("SELECT id, name FROM products ORDER BY name LIMIT 20 OFFSET %d;",
                 $offset);


使用数据库特定的敏感字符转义函数(比如 mysql_escape_string() 和 sql_escape_string())把用户提交上来的非数字数据进行转义。如果数据库没有专门的敏感字符转义功能的话 addslashes() 和 str_replace() 可以代替完成这个工作。看看第一个例子,此例显示仅在查询的静态部分加上引号是不够的,查询很容易被攻破。
要不择手段避免显示出任何有关数据库的信心,尤其是数据库结构。参见错误报告和错误处理函数。
也可以选择使用数据库的存储过程和预定义指针等特性来抽象数库访问,使用户不能直接访问数据表和视图。但这个办法又有别的影响。
除此之外,在允许的情况下,使用代码或数据库系统保存查询日志也是一个好办法。显然,日志并不能防止任何攻击,但利用它可以跟踪到哪个程序曾经被尝试攻击过。日志本身没用,要查阅其中包含的信息才行。毕竟,更多的信息总比没有要好。

[!--infotagslink--]

相关文章

  • php正确禁用eval函数与误区介绍

    eval函数在php中是一个函数并不是系统组件函数,我们在php.ini中的disable_functions是无法禁止它的,因这他不是一个php_function哦。 eval()针对php安全来说具有很...2016-11-25
  • php中eval()函数操作数组的方法

    在php中eval是一个函数并且不能直接禁用了,但eval函数又相当的危险了经常会出现一些问题了,今天我们就一起来看看eval函数对数组的操作 例子, <?php $data="array...2016-11-25
  • Python astype(np.float)函数使用方法解析

    这篇文章主要介绍了Python astype(np.float)函数使用方法解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下...2020-06-08
  • Python中的imread()函数用法说明

    这篇文章主要介绍了Python中的imread()函数用法说明,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-03-16
  • C# 中如何取绝对值函数

    本文主要介绍了C# 中取绝对值的函数。具有很好的参考价值。下面跟着小编一起来看下吧...2020-06-25
  • C#学习笔记- 随机函数Random()的用法详解

    下面小编就为大家带来一篇C#学习笔记- 随机函数Random()的用法详解。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧...2020-06-25
  • 不打开网页直接查看网站的源代码

      有一种方法,可以不打开网站而直接查看到这个网站的源代码..   这样可以有效地防止误入恶意网站...   在浏览器地址栏输入:   view-source:http://...2016-09-20
  • php 调用goolge地图代码

    <?php require('path.inc.php'); header('content-Type: text/html; charset=utf-8'); $borough_id = intval($_GET['id']); if(!$borough_id){ echo ' ...2016-11-25
  • JS基于Mootools实现的个性菜单效果代码

    本文实例讲述了JS基于Mootools实现的个性菜单效果代码。分享给大家供大家参考,具体如下:这里演示基于Mootools做的带动画的垂直型菜单,是一个初学者写的,用来学习Mootools的使用有帮助,下载时请注意要将外部引用的mootools...2015-10-23
  • JS+CSS实现分类动态选择及移动功能效果代码

    本文实例讲述了JS+CSS实现分类动态选择及移动功能效果代码。分享给大家供大家参考,具体如下:这是一个类似选项卡功能的选择插件,与普通的TAb区别是加入了动画效果,多用于商品类网站,用作商品分类功能,不过其它网站也可以用,...2015-10-21
  • JS实现自定义简单网页软键盘效果代码

    本文实例讲述了JS实现自定义简单网页软键盘效果。分享给大家供大家参考,具体如下:这是一款自定义的简单点的网页软键盘,没有使用任何控件,仅是为了练习JavaScript编写水平,安全性方面没有过多考虑,有顾虑的可以不用,目的是学...2015-11-08
  • php 取除连续空格与换行代码

    php 取除连续空格与换行代码,这些我们都用到str_replace与正则函数 第一种: $content=str_replace("n","",$content); echo $content; 第二种: $content=preg_replac...2016-11-25
  • 金额阿拉伯数字转换为中文的自定义函数

    CREATE FUNCTION ChangeBigSmall (@ChangeMoney money) RETURNS VarChar(100) AS BEGIN Declare @String1 char(20) Declare @String2 char...2016-11-25
  • php简单用户登陆程序代码

    php简单用户登陆程序代码 这些教程很对初学者来讲是很有用的哦,这款就下面这一点点代码了哦。 <center> <p>&nbsp;</p> <p>&nbsp;</p> <form name="form1...2016-11-25
  • Android开发中findViewById()函数用法与简化

    findViewById方法在android开发中是获取页面控件的值了,有没有发现我们一个页面控件多了会反复研究写findViewById呢,下面我们一起来看它的简化方法。 Android中Fin...2016-09-20
  • PHP实现清除wordpress里恶意代码

    公司一些wordpress网站由于下载的插件存在恶意代码,导致整个服务器所有网站PHP文件都存在恶意代码,就写了个简单的脚本清除。恶意代码示例...2015-10-23
  • C++中 Sort函数详细解析

    这篇文章主要介绍了C++中Sort函数详细解析,sort函数是algorithm库下的一个函数,sort函数是不稳定的,即大小相同的元素在排序后相对顺序可能发生改变...2022-08-18
  • PHP用strstr()函数阻止垃圾评论(通过判断a标记)

    strstr() 函数搜索一个字符串在另一个字符串中的第一次出现。该函数返回字符串的其余部分(从匹配点)。如果未找到所搜索的字符串,则返回 false。语法:strstr(string,search)参数string,必需。规定被搜索的字符串。 参数sea...2013-10-04
  • js识别uc浏览器的代码

    其实挺简单的就是if(navigator.userAgent.indexOf('UCBrowser') > -1) {alert("uc浏览器");}else{//不是uc浏览器执行的操作}如果想测试某个浏览器的特征可以通过如下方法获取JS获取浏览器信息 浏览器代码名称:navigator...2015-11-08
  • JS实现双击屏幕滚动效果代码

    本文实例讲述了JS实现双击屏幕滚动效果代码。分享给大家供大家参考,具体如下:这里演示双击滚屏效果代码的实现方法,不知道有觉得有用处的没,现在网上还有很多还在用这个特效的呢,代码分享给大家吧。运行效果截图如下:在线演...2015-10-30