首页 > 编程技术 > php

php 过滤危险html函数 代码

发布时间:2016-11-25 15:25

1、删除html注释;
2、删除script、link、object、embed、iframe、frame、frameset以及拥有on开头、包含网页特效:[^;]或expression的属性的标签;
3、删除css教程中的注释(防止用这个来欺骗删除expression表达式,不知道还有其他什么方法可以欺骗删除expression);

4、删除expression表达式;


过滤危险html */

 代码如下 复制代码

function fillter_html( $str ) {
        /* 过滤style标签 */
        return preg_replace_callback(
                        /* 过滤style标签内容 */
                        '/(<s*style[^>]*>)((?:(?!<s*/s*styles*>).)*)(<s*/s*styles*>)?/i',
                        create_function('$str', 'return $str[1] . fillter_css($str[2]) . $str[3];'),
                        preg_replace(
                                array(
                                        /* 删除html注释 */
                                        '/<!--.*?-->/i',
                                        /* 删除标签:script、link、object、embed、iframe、frame、frameset */
                                        '/<s*(script|object|embed|link|i?frame(set)?)[^>]*>(.*?<s*/s*\1s*>)?/i',
                                        /* 删除事件、javascript协议、css表达式 */
                                        '/<[^>]+((on[a-z]+s*=|javascript:[^;"\']|expressions*()[^>]*)+>?/i',
                                ),
                                '',
                                $str
                        )
        );
}

/* 过滤样式正文 */
function fillter_css( $str ) {
        /* 删除注释、javascript协议、表达式 */
        return preg_replace(array('/(/*((?!*/).)**/|/*|*/)/i', '/expressions*((.*?))?|javascripts*:/i',), '', $str);
}
?>

方法一
<?php

 代码如下 复制代码
echo strip_tags("hello <b>world!</b>");


strip_tags --- 去除字串中的html和php标签

语法 : string strip_tags (string str [, string allowable_tags])

说明 :

此函式试着从给予的字串中去除所有html和php标签,如果是不完整或是假的标签时则会有错误,它和fgetss( )使用相同的方法去除标签。

 

 代码如下 复制代码
$reg = '/(</?p>|<brs*/?>)|<.+?>/i';
    echo preg_replace($reg,'$1',$str);
?>

过滤方法二

 代码如下 复制代码
function delhtml($str){   //清除html标签
$st=-1; //开始
$et=-1; //结束
$stmp=array();
$stmp[]="&nbsp;";
$len=strlen($str);
for($i=0;$i<$len;$i++){
   $ss=substr($str,$i,1);
   if(ord($ss)==60){ //ord("<")==60
    $st=$i;
   }
   if(ord($ss)==62){ //ord(">")==62
    $et=$i;
    if($st!=-1){
     $stmp[]=substr($str,$st,$et-$st+1);
    }
   }
}
$str=str_replace($stmp,"",$str);
return $str;
}

过滤方法三

 代码如下 复制代码

function clear_html_label($html)
{
$search = array ("'<script[^>]*?>.*?</script>'si", "'<[/!]*?[^<>]*?>'si", "'([rn])[s]+'", "'&(quot|#34);'i", "'&(amp|#38);'i", "'&(lt|#60);'i", "'&(gt|#62);'i", "'&(nbsp|#160);'i", "'&(iexcl|#161);'i", "'&(cent|#162);'i", "'&(pound|#163);'i", "'&(copy|#169);'i", "'&#(d+);'e");
$replace = array ("", "", "1", """, "&", "<", ">", " ", chr(161), chr(162), chr(163), chr(169), "chr(1)");

return preg_replace($search, $replace, $html);
}

//实例应用

$string ='aaa<br /> <script>fdsafsa';
echo clear_html_label($string);//aaa fdsafsa

本款提供二种用户登录的方法,一种是普通的php mysql用户登录,另一种是利用window验证来登录哦,后来种更安全,但不适合于其它应用。

//方法一 window 验证用户登录


   

 代码如下 复制代码

     $admin_name="admin";
        $admin_pawd="admin";
        if($php_auth_user!=$admin_name||$php_auth_pw!=$admin_pawd)
        {
                header('www-authenticate: basic realm="系统验证"');
                header('http/1.0 401 unauthorized');
                echo "服务器拒绝请求,你没有权限!";
                exit();
        }

//


  if (empty($_server['php_auth_user'])) {
    header("content-type: text/html; charset=big5");
    header('www-authenticate: basic realm=" authentication "');
    header('http/1.0 401 unauthorized');
    echo '请输入正确的账号及密码, 不可以取消!';
    exit;
  } else {
    echo "你登录的账号是 ".$_server['php_auth_user']."<br>";
    echo "你使用的密码是 ".$_server['php_auth_pw']."<p>";
    $correctname="john";
    $correctpwd="1234" ;
     if (($_server['php_auth_user'] != $correctname) or
            ($_server['php_auth_pw'] !=$correctpwd)){
        echo "登录失败, 请打开新的浏览器重新登录";
     }else{
     echo "登录成功.....";
     }
  }
?>

方法二 php mysq

 代码如下 复制代码

<?php
   if (($_post['name'] != "john") or ($_post['passwd'] != "1234")):
?>
   <html>
   <title>登录画面</title>
   <body>
   <b>未输入账号或密码, 或账号,密码不正确 </b><p>
   <form action=<?php echo $_server['php_self'] ?> method=post>
   账号 <input type=text name=name value="请输入账号" size=10><p>
   密码 <input type=password name=passwd size=10><p>
   <input type=submit value=" 登录 ">
   <input type=reset  value=" 清除 ">
   </form>
   </body>
   </html>
<?php
   else:
     echo "登录成功 .....<p>";
     echo "你登录的账号是 ".$_post['name']."<br>";
     echo "你使用的密码是 ".$_post['passwd'];
   endif
?>

在php 中自带了删除文件的函数unlink来删除,我们只要把文件给它,就可以执行删除了,本款实例就是加了判断用户给它的是不是文件,如果是看删除返回是否为真,如果是文件删除成功,否则可能是权限不够了。


$filename ='bb.gif';
if( is_file( $filename ) )
{
 if( unlink($filename) )
 {
  echo '文件删除成功';
 }
 else
 {
  echo '文件删除失败,权限不够';
 }
}
else
{
 echo '不是有一个有效的文件';
}

/*
php unlink函数说明

unlink定义和用法

unlink() 函数删除文件。

若成功,则返回 true,失败则返回 false。

语法
unlink(filename,context)参数 描述
filename 必需。规定要删除的文件。
context 可选。规定文件句柄的环境。context 是可修改流的行为的一套选项。

由于注册的时候常常会用到注册码来防止机器恶意注册,这里我发表一个产生png图片验证码的基本图像,很简陋但思想很清晰:
1、产生一张png的图片
2、为图片设置背景色
3、设置字体颜色和样式
4、产生4位数的随机的验证码
5、把产生的每个字符调整旋转角度和位置画到png图片上
6、加入噪点和干扰线防止注册机器分析原图片来恶意注册
7、输出图片
8、释放图片所占内存
authcode.php文件

 代码如下 复制代码

<?php
        session_start ();
        header ( 'content-type: image/png' );
        //创建图片
        $im = imagecreate($x=130,$y=45 );
        $bg = imagecolorallocate($im,rand(50,200),rand(0,155),rand(0,155)); //第一次对 imagecolorallocate() 的调用会给基于调色板的图像填充背景色
        $fontcolor = imagecolorallocate ( $im, 255, 255, 255 );   //字体颜色
        $fontstyle = 'rock.ttf';                   //字体样式,这个可以从c:windows onts文件夹下找到,我把它放到和authcode.php文件同一个目录,这里可以替换其他的字体样式
        //产生随机字符
        for($i = 0; $i < 4; $i ++) {
                $randasciinumarray         = array (rand(48,57),rand(65,90));
                $randasciinum                 = $randasciinumarray [rand ( 0, 1 )];
                $randstr                         = chr ( $randasciinum );
                imagettftext($im,30,rand(0,20)-rand(0,25),5+$i*30,rand(30,35),$fontcolor,$fontstyle,$randstr);
                $authcode                        .= $randstr;
        }
        $_session['authcode']        = $randfourstr;//用户和用户输入的验证码做比较
        //干扰线
        for ($i=0;$i<8;$i++){
                $linecolor        = imagecolorallocate($im,rand(0,255),rand(0,255),rand(0,255));
                imageline ($im,rand(0,$x),0,rand(0,$x),$y,$linecolor);
        }
        //干扰点
        for ($i=0;$i<250;$i++){
                imagesetpixel($im,rand(0,$x),rand(0,$y),$fontcolor);
        }
        imagepng($im);
        imagedestroy($im);               
?>

标签:[!--infotagslink--]

您可能感兴趣的文章: