PHP防止远程非法提交表单程序代码

 更新时间:2016年11月25日 15:23  点击:2381
防止远程提交表单是一个防止黑客非法远程提交数据来给我们网站造成安全,下面我来介绍在php中防止远程非法提交表单实例。

具体方法

一、PHP防止站外提交数据的方法

 代码如下 复制代码
<?
$servername=$HTTP_SERVER_VARS['SERVER_NAME'];
$sub_from=$HTTP_SERVER_VARS["HTTP_REFERER"];
$sub_len=strlen($servername);
$checkfrom=substr($sub_from,7,$sub_len);
if($checkfrom!=$servername){
echo("警告!你正在从外部提交数据!!请立即终止!!");
exit;
}
?>

把以上代码放到需要防止外部提交数据的页面中,如果是直接输入网址或者是从外部网部链接到本页,则显示:警告!你正在从外部提交数据!!请立即终止!!;如果系从本站链接或通过表单提交到该页,则无此提示。这样做主要是为了防止一些伪造表单向站内提交数据 。

上面的代码通过curl可直接跳过了,我们可以参考dz论坛登录的一种做法


处理远程表单提交更好的方式是,根据一个惟一的字符串或时间戳生成一个令牌,并将这个令牌放在会话变量和表单中。提交表单之后,检查两个令牌是否匹配。如果不匹配,就知道有人试图从表单的远程副本发送数据。

要创建随机的令牌,可以使用 PHP 内置的 md5()、uniqid() 和 rand() 函数,如下所示

 

 代码如下 复制代码
<SPAN style="FONT-SIZE: small"><?php
session_start();   
       
if ($_POST['submit'] == "go"){   
    //check token   
    if ($_POST['token'] == $_SESSION['token']){   
        //strip_tags   
        $name = strip_tags($_POST['name']);   
        $name = substr($name,0,40);   
        //clean out any potential hexadecimal characters   
        $name = cleanHex($name);   
        //continue processing....   
    }else{   
        //stop all processing! remote form posting attempt!   
    }   
}   
       
$token = md5(uniqid(rand(), true));   
$_SESSION['token']= $token;   
       
       
function cleanHex($input){   
    $clean = preg_replace("![][xX]([A-Fa-f0-9]{1,3})!", "",$input);   
    return $clean;   
}   
?>   
       
       
<form action="<?php echo $_SERVER['PHP_SELF'];?>" method="post">   
<p><label for="name">Name</label>   
<input type="text" name="name" id="name" size="20" maxlength="40"/></p>   
<input type="hidden" name="token" value="<?php echo $token;?>"/>   
<p><input type="submit" name="submit" value="go"/></p>   
</form>   </SPAN>

没事把以前写的asp写出来

ASP防止外部提交数据的方法

 代码如下 复制代码
<%
Server_v1=Cstr(Request.ServerVariables("HTTP_REFERER"))
Server_v2=Cstr(Request.ServerVariables("SERVER_NAME"))
If   mid(server_v1,8,len(server_v2))<>server_v2   then
     Response.write "警告!你正在从外部提交数据!!请立即终止!!"
     Response.End
End if
%>
本文章总结了几乎所有可能出来的PHP防SQL注入类代码,各位同学不防进入参考。

确定XP_CMDSHELL可执行情况

发现WEB虚拟目录

上传ASP,php,jsp木马;

得到管理员权限;

//PHP整站防注入程序,需要在公共文件中require_once本文件   
//判断magic_quotes_gpc状态  
if (@get_magic_quotes_gpc ()) {   
    $_GET = sec ( $_GET );   
    $_POST = sec ( $_POST );   
    $_COOKIE = sec ( $_COOKIE );   
    $_FILES = sec ( $_FILES );   
}   
$_SERVER = sec ( $_SERVER );   
function sec(&$array) {   
    //如果是数组,遍历数组,递归调用   
    if (is_array ( $array )) {   
        foreach ( $array as $k => $v ) {   
            $array [$k] = sec ( $v );   
        }   
    } else if (is_string ( $array )) {   
        //使用addslashes函数来处理   
        $array = addslashes ( $array );   
    } else if (is_numeric ( $array )) {   
        $array = intval ( $array );   
    }   
    return $array;   
}

1、整型参数的判断

当输入的参数YY为整型时,通常abc.asp中SQL语句原貌大致如下:

select * from 表名 where 字段=YY,所以可以用以下步骤测试SQL注入是否存在。

①HTTP://xxx.xxx.xxx/abc.asp?p=YY’(附加一个单引号),此时abc.ASP中的SQL语句变成了

select * from 表名 where 字段=YY’,abc.asp运行异常;

②HTTP://xxx.xxx.xxx/abc.asp?p=YY and 1=1, abc.asp运行正常,而且与HTTP://xxx.xxx.xxx/abc.asp?p=YY运行结果相同;

③HTTP://xxx.xxx.xxx/abc.asp?p=YY and 1=2, abc.asp运行异常;

如果以上三步全面满足,abc.asp中一定存在SQL注入漏洞。

function num_check($id) {  
    if (! $id) {  
        die ( '参数不能为空!' );  
    } //是否为空的判断  
    else if (inject_check ( $id )) {  
        die ( '非法参数' );  
    } //注入判断  
    else if (! is_numetic ( $id )) {  
        die ( '非法参数' );  
    }  
    //数字判断  
    $id = intval ( $id );  
    //整型化  
    return $id;  

        
//字符过滤函数  
function str_check($str) {  
    if (inject_check ( $str )) {  
        die ( '非法参数' );  
    }  
    //注入判断  
    $str = htmlspecialchars ( $str );  
    //转换html  
    return $str;  
}  
function search_check($str) {  
    $str = str_replace ( "_", "_", $str );  
    //把"_"过滤掉  
    $str = str_replace ( "%", "%", $str );  
    //把"%"过滤掉  
    $str = htmlspecialchars ( $str );  
    //转换html  
    return $str;  
}  
//表单过滤函数  
function post_check($str, $min, $max) {  
    if (isset ( $min ) && strlen ( $str ) < $min) {  
        die ( '最少$min字节' );  
    } else if (isset ( $max ) && strlen ( $str ) > $max) {  
        die ( '最多$max字节' );  
    }  
    return stripslashes_array ( $str );  
}

输入的参数YY为字符串时,通常abc.php中SQL语句原貌大致如下:

select * from 表名 where 字段='YY',所以可以用以下步骤测试SQL注入是否存在。

①HTTP://xxx.xxx.xxx/abc.php?p=YY’(附加一个单引号),此时abc.ASP中的SQL语句变成了

select * from 表名 where 字段=YY’,abc.asp运行异常;

②HTTP://xxx.xxx.xxx/abc.php?p=YY&;nb ... 39;1'='1', abc.php运行正常,而且与HTTP://xxx.xxx.xxx/abc.asp?p=YY运行结果相同;

③HTTP://xxx.xxx.xxx/abc.php?p=YY&;nb ... 39;1'='2', abc.php运行异常;

如果以上三步全面满足,abc.asp中一定存在SQL注入漏洞。


//防注入函数  
function inject_check($sql_str) {  
    return eregi ( 'select|inert|update|delete|'|/*|*|../|./|UNION|into|load_file|outfile', $sql_str );  
    // 进行过滤,防注入 

function stripslashes_array(&$array) {  
    if (is_array ( $array )) {  
        foreach ( $array as $k => $v ) {  
            $array [$k] = stripslashes_array ( $v );  
        }  
    } else if (is_string ( $array )) {  
        $array = stripslashes ( $array );  
    }  
    return $array;  
}


//php 批量过滤post,get敏感数据
if (get_magic_quotes_gpc()) {
$_GET = stripslashes_array($_GET);
$_POST = stripslashes_array($_POST);
}

function stripslashes_array(&$array) {
while(list($key,$var) = each($array)) {
if ($key != 'argc' && $key != 'argv' && (strtoupper($key) != $key || ''.intval($key) == "$key")) {
if (is_string($var)) {
$array[$key] = stripslashes($var);
}
if (is_array($var))  {
$array[$key] = stripslashes_array($var);
}
}
}
return $array;
}
//过滤
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(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("SCRIPT","SCRIPT",$str);
$str=str_replace("script","script",$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(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;
}

// 函数:string_filter($string, $match_type=1)
// 功能:过滤非法内容
// 参数:
// $string 需要检查的字符串
// $match_type 匹配类型,1为精确匹配, 2为模糊匹配,默认为1
//
// 返回:有非法内容返回True,无非法内容返回False
// 其他:非法关键字列表保存在txt文件里, 分为普通非法关键字和严重非法关键字两个列表
// 作者:heiyeluren
// 时间:2006-1-18
//
//======================================================================
function lib_lawless_string_filter($string, $match_type=1)
{
//字符串空直接返回为非法
$string = trim($string);
if (empty($string))
{
return false;
}
//获取重要关键字列表和普通关键字列表
$common_file = "common_list.txt"; //通用过滤关键字列表
$signify_file = "signify_list.txt"; //重要过滤关键字列表
//如果任何列表文件不存在直接返回false,否则把两个文件列表读取到两个数组里
if (!file_exists($common_file) || !file_exists($signify_file))
{
return false;
}
$common_list = file($common_file);
$signify_list = file($signify_file);

//精确匹配
if ($match_type == 1)
{
$is_lawless = exact_match($string, $common_list);
}

//模糊匹配
if ($match_type == 2)
{
$is_lawless = blur_match($string, $common_list, $signify_list);
}

//判断检索结果数组中是否有数据,如果有,证明是非法的
if (is_array($is_lawless) && !empty($is_lawless))
{
return true;
}
else
{
return false;
}
}

//---------------------
// 精确匹配,为过滤服务
//---------------------
function exact_match($string, $common_list)
{
$string = trim($string);
$string = lib_replace_end_tag($string);

//检索普通过滤关键字列表
foreach($common_list as $block)
{
$block = trim($block);
if (preg_match("/^$string$/i", $block))
{
$blist[] = $block;
}
}
//判断有没有过滤内容在数组里
if (!empty($blist))
{
return array_unique($blist);
}

return false;
}

//----------------------
// 模糊匹配,为过滤服务
//----------------------
function blur_match($string, $common_list, $signify_list)
{
$string = trim($string);
$s_len = strlen($string);
$string = lib_replace_end_tag($string);

//检索普通过滤关键字列表
foreach($common_list as $block)
{
$block = trim($block);
if (preg_match("/^$string$/i", $block))
{
$blist[] = $block;
}
}
//检索严重过滤关键字列表
foreach($signify_list as $block)
{
$block = trim($block);
if ($s_len>=strlen($block) && preg_match("/$block/i", $string))
{
$blist[] = $block;
}
}
//判断有没有过滤内容在数组里
if (!empty($blist))
{
return array_unique($blist);
}

return false;
}

//--------------------------
// 替换HTML尾标签,为过滤服务
//--------------------------
function lib_replace_end_tag($str)
{
if (empty($str)) return false;
$str = htmlspecialchars($str);
$str = str_replace( '/', "", $str);
$str = str_replace("", "", $str);
$str = str_replace("&gt", "", $str);
$str = str_replace("&lt", "", $str);
$str = str_replace("<SCRIPT>", "", $str);
$str = str_replace("</SCRIPT>", "", $str);
$str = str_replace("<script>", "", $str);
$str = str_replace("</script>", "", $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(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);
$str=str_replace("css","'",$str);
$str=str_replace("CSS","'",$str);

return $str;

//HTML标签,可以作为扩展过滤
/*
$tags = array("/html", "/head", "/body", "/div", "/span", "/DOCTYPE", "/title", "/link", "/meta", "/style", "/p", "/h1,", "/h2,", "/h3,", "/h4,", "/h5,", "/h6", "/strong", "/em", "/abbr", "/acronym", "/address", "/bdo", "/blockquote", "/cite", "/q", "/code", "/ins", "/del", "/dfn", "/kbd", "/pre", "/samp", "/var", "/br", "/a", "/img", "/area", "/map", "/object", "/param", "/ul", "/ol", "/li", "/dl", "/dt", "/dd", "/table", "/tr", "/td", "/th", "/tbody", "/thead", "/tfoot", "/col", "/colgroup", "/caption", "/form", "/input", "/textarea", "/select", "/option", "/optgroup", "/button", "/label", "/fieldset", "/legend", "/script", "/noscript", "/b", "/i", "/tt", "/sub", "/sup", "/big", "/small", "/hr" );
*/

}
引用是直接这样:
$xxx = htmlspecialchars($_POST['xxx']);
或者
$xxx = htmlspecialchars($_GET['xxx']);

php安全之一的PHP防注入是我们程序员必须了解与撑握的一项技术了,下面我来给各位同学介绍对于我们程序里的敏感信息的一些安全做法。


简单点来说就是你不想让别人知道的信息,比如说数据库的地址,用户名,密码等等,此类信息往往知道的人越少越好。

通常,PHP程序里的配置文件大致如下所示:

 代码如下 复制代码

<?php
 
return array(
    'database' => array(
        'host'     => '192.168.0.1',
        'user'     => 'administrator',
        'password' => 'e1bfd762321e409cee4ac0b6e841963c',
    ),
);
 
?>

有时候出于某些原因,比如说代码审查,亦或者合作开发等等,第三方需要获取代码版本仓库的读权限,一旦授权,数据库的地址,用户名,密码等敏感信息就暴露了。当然也可以不在代码版本仓库里保存配置文件,取而代之是撰写文档进行说明,但我不喜欢这样的方法,因为如此一来,代码本身是不完整的。

如何解决此类问题呢?最直接的方法是把敏感信息从代码中拿掉,换个地方保存。具体保存到哪里呢?有很多选择,比如说通过nginx的fastcgi_param来设置:

 代码如下 复制代码

fastcgi_param DATABASE_HOST 192.168.0.1;
fastcgi_param DATABASE_USER administrator;
fastcgi_param DATABASE_PASSWORD e1bfd762321e409cee4ac0b6e841963c;


经过这样的映射后,我们的代码就不会直接包含敏感信息了:

 代码如下 复制代码

<?php
 
return array(
    'database' => array(
        'host'     => $_SERVER['DATABASE_HOST'],
        'user'     => $_SERVER['DATABASE_USERNAME'],
        'password' => $_SERVER['DATABASE_PASSWORD'],
    ),
);
 
?>

此外,还可以通过php-fpm的env指令来设置:

 代码如下 复制代码

env[DATABASE_HOST] = 192.168.0.1
env[DATABASE_USERNAME] = administrator
env[DATABASE_PASSWORD] = e1bfd762321e409cee4ac0b6e841963c


需要说明的一点是,这个设置必须放在主配置文件php-fpm.conf里,不能放到include指令设置的子配置文件里,否则会报错:「Array are not allowed in the global section」;另外一点,虽然是通过env设置的,但结果还是在$_SERVER里,而不是$_ENV。

说明: @Laruence 提醒了我,如果配置信息通过nginx的fastcgi_param来设置的话,当nginx和php交互时,会带来大量的数据传输(如此看来通过php-fpm的env来设置相对更有优势),鸟哥建议使用独立的扩展来搞定,比如「hidef」。

通过nginx和php-fpm配置文件来解决问题的话,有一个缺点,仅对Web有效,如果通过命令行来运行,那么无法在$_SERVER里获取相关信息,不过这不算什么难事儿,只要写个公共的脚本正则匹配一下nginx或者php-fpm的配置文件,就可以动态的把这些信息映射到命令行环境,具体怎么搞就留给大家自己操作吧。

代码干净了,剩下的工作就是如何确保nginx或php-fpm配置文件的安全了,不过和代码比起来,nginx或php-fpm配置文件并不需要很多人有权限,所以相对更容易管理

还有一个重要的函数phpinfo()这个大家一定要注意了,如能正常显示phpinfo函数我们可


详情
PHPInfo提供了以下一些信息:
*PHP 版本 (包括build版本在内的精确版本信息)
*系统版本信息(包括build版本在内的精确版本信息)
*扩展目录(PHP所在目录)
*SMTP服务器信息
*Sendmail路径(如果Sendmail安装了的话)
*Posix版本信息
*数据库
*ODBC 设置(包括的路径,数据库名,默认的密码等等)
*MySQL 客户端的版本信息(包括build版本在内的精确版本信息)
*Oracle版本信息和库的路径
*所在位置的实际路径
*Web 服务器
*IIS 版本信息
*Apache 版本信息
*如果在Win32下运行:
*计算机名
*Windows目录的位置
*路径(能用来泄漏已安装的软件信息)

例子:
访问一个类似于下面的URL:
http://www.example.com/PHP/phpinfo.php

本文章是先自己自定义复杂MD5加密函数对密码进行加密,然后再由系统的md5加密程序进行加密,下面我来介绍一下实现方法。

虽然说md5的密文是有限的,不过其数量为6.3340286662973277706162286946812e+49 ,如果对这个数字没感觉,你可以想象一下一亿的五次方再乘个几千万就差不多了。。。。。

以前接触过不少程序(当菜鸟黑客的那段时光……),大部分程序加密方式都是“md5”,而且是纯加密,本来这也没有错,以为md5算法毕竟没有被破解,但是随着特征字符串的收集,使用纯md5加密已经越来越危险。

自己写程序一般习惯加上特征字符串再MD5,自以为万无一失,但是今天发现cmd5居然可以破解这种加密方式,当然前提是要知道特征字符串,虽然我的更为复杂,不过出于防范心理,还是对加密函数进行了复杂化。

 代码如下 复制代码
function md123($sstr)
{
$md_asc=”";
$mds=md5(“qwEqw”.$sstr.”2ddsdf”);
$mds=md5(“rtrTtyr”.$mds.”zcv34r”);
for($i=1;$i< strlen($mds);$i++){
$md_asc.=168/ord(substr($mds,$i,1));
}
return md5($md_asc);
}

这样通过随即字符串和ascii ,使密码安全性得到进一步提高,在通过ord的时候,一个简单的1已经被转换成了一下字符:

1.73195876288662.94736842105261.66336633663373.1111

1111111113.23076923076923.16981132075471.731958762

88661.683.42857142857142.94736842105261.681.681.6470

5882352943.11111111111111.66336633663372.94736842

105263.42857142857141.66336633663373.1698113207547

3.16981132075473.11111111111111.69696969696971.681.7

1428571428573.16981132075471.71428571428573.294117

64705881.681.64705882352941.69696969696971.64705882

352946ccc2eceada95b64bc7f55c07c2a6af6

这样再进行MD5加密,就安全了,如果这样还被破解了,那就用面条上吊吧

在php中防注入一般会写一个全局文件用来过滤特殊的字符串,本文章来总结了各种各样的php防注入函数代码,同时还可防sql注入大家可参考。

为了安全,我们常用到下面的函数来过滤一些传递过来的非法字符:

PHP防注入函数

 代码如下 复制代码

<?php
//要过滤的非法字符
$ArrFiltrate=array(“‘”,”;”,”union”,”select”,”delete”,”‘”,”or”,”and”,”=”);
//出错后要跳转的url,不填则默认前一页
$StrGoUrl=”";
//是否存在数组中的值
function FunStringExist($StrFiltrate,$ArrFiltrate){
foreach ($ArrFiltrate as $key=>$value){
if (eregi($value,$StrFiltrate)){
return true;
}
}
return false;
}
//合并$_POST 和 $_GET
if(function_exists(array_merge)){
$ArrPostAndGet=array_merge($HTTP_POST_VARS,$HTTP_GET_VARS);
}else{
foreach($HTTP_POST_VARS as $key=>$value){
$ArrPostAndGet[]=$value;
}
foreach($HTTP_GET_VARS as $key=>$value){
$ArrPostAndGet[]=$value;
}
}
//验证开始
foreach($ArrPostAndGet as $key=>$value){
if (FunStringExist($value,$ArrFiltrate)){
if (empty($StrGoUrl)){
echo “<script language=”javascript”>history.go(-1);</script>”;
}else{
echo “<script language=”javascript”>window.location=”".$StrGoUrl.””;</script>”;
}
exit;
}
}

再看一个实例与上面差不多,这个是dz论坛使用的方法

 代码如下 复制代码

 

$magic_quotes_gpc = get_magic_quotes_gpc();
@extract(daddslashes($_COOKIE));
@extract(daddslashes($_POST));
@extract(daddslashes($_GET));
if(!$magic_quotes_gpc) {
$_FILES = daddslashes($_FILES);
}


function daddslashes($string, $force = 0) {
if(!$GLOBALS['magic_quotes_gpc'] || $force) {
if(is_array($string)) {
foreach($string as $key => $val) {
$string[$key] = daddslashes($val, $force);
}
} else {
$string = addslashes($string);
}
}
return $string;
}

最后发一加强版的

 代码如下 复制代码

<?php
$field = explode(',', $data);
array_walk($field, array($this, 'add_special_char'));
$data = implode(',', $field);
/**
 * 对字段两边加反引号,以保证数据库安全
 * @param $value 数组值
 */
public function add_special_char(&$value) {
 if('*' == $value || false !== strpos($value, '(') || false !== strpos($value, '.') || false !== strpos ( $value, '`')) {
  //不处理包含* 或者 使用了sql方法。
 } else {
  $value = '`'.trim($value).'`';
 }
 return $value;
}
function str_filter($str) {
 $str = htmlspecialchars ( $str );
 if (! get_magic_quotes_gpc ()) {
  $str = addslashes ( $str );
 }
 //过滤危险字符
 return preg_replace ( "/["'=]|(and)|(or)|(create)|(update)|(alter)|(delete)|(insert)|(load_file)|(outfile)|(count)|(%20)|(char)/i", "", $str );
}
/*
函数名称:str_check()
函数作用:对提交的字符串进行过滤
参  数:$var: 要处理的字符串
返 回 值:返回过滤后的字符串
*/
function str_check($str) {
 if (! get_magic_quotes_gpc ()) { // 判断magic_quotes_gpc是否打开
  $str = addslashes ( $str ); // 进行过滤
 }
 $str = str_replace ( "_", "_", $str ); // 把 '_'过滤掉
 $str = str_replace ( "%", "%", $str ); // 把 '%'过滤掉
 return $str;
}

/*
函数名称:post_check()
函数作用:对提交的编辑内容进行处理
参  数:$post: 要提交的内容
返 回 值:$post: 返回过滤后的内容
*/
function post_check($post) {
 if (! get_magic_quotes_gpc ()) { // 判断magic_quotes_gpc是否为打开
  $post = addslashes ( $post ); // 进行magic_quotes_gpc没有打开的情况对提交数据的过滤
 }
 $post = str_replace ( "_", "_", $post ); // 把 '_'过滤掉
 $post = str_replace ( "%", "%", $post ); // 把 '%'过滤掉
 $post = nl2br ( $post ); // 回车转换
 $post = htmlspecialchars ( $post ); // html标记转换
 return $post;
}
/*
函数名称:inject_check()
函数作用:检测提交的值是不是含有SQL注射的字符,防止注射,保护服务器安全
参  数:$sql_str: 提交的变量
返 回 值:返回检测结果,ture or false
*/
function inject_check($sql_str) {
 return eregi('select|insert|and|or|update|delete|'|/*|*|../|./|union|into|load_file|outfile', $sql_str);     // 进行过滤
}

/*
函数名称:verify_id()
函数作用:校验提交的ID类值是否合法
参  数:$id: 提交的ID值
返 回 值:返回处理后的ID
*/
function verify_id($id=null) {
 if (!$id) { exit('没有提交参数!'); }     // 是否为空判断
 elseif (inject_check($id)) { exit('提交的参数非法!'); }     // 注射判断
 elseif (!is_numeric($id)) { exit('提交的参数非法!'); }     // 数字判断
 $id = intval($id);     // 整型化

 return   $id;
}

// $rptype = 0 表示仅替换 html标记
// $rptype = 1 表示替换 html标记同时去除连续空白字符
// $rptype = 2 表示替换 html标记同时去除所有空白字符
// $rptype = -1 表示仅替换 html危险的标记
function HtmlReplace($str, $rptype = 0) {
 $str = stripslashes ( $str );
 if ($rptype == 0) {
  $str = htmlspecialchars ( $str );
 } else if ($rptype == 1) {
  $str = htmlspecialchars ( $str );
  $str = str_replace ( " ", ' ', $str );
  $str = ereg_replace ( "[rnt ]{1,}", ' ', $str );
 } else if ($rptype == 2) {
  $str = htmlspecialchars ( $str );
  $str = str_replace ( " ", '', $str );
  $str = ereg_replace ( "[rnt ]", '', $str );
 } else {
  $str = ereg_replace ( "[rnt ]{1,}", ' ', $str );
  $str = eregi_replace ( 'script', 'script', $str );
  $str = eregi_replace ( "<[/]{0,1}(link|meta|ifr|fra)[^>]*>", '', $str );
 }
 return addslashes ( $str );
}
//递归ddslashes
function daddslashes($string, $force = 0, $strip = FALSE) {
 if (! get_magic_quotes_gpc () || $force) {
  if (is_array ( $string )) {
   foreach ( $string as $key => $val ) {
    $string [$key] = daddslashes ( $val, $force );
   }
  } else {
   $string = addslashes ( $strip ? stripslashes ( $string ) : $string );
  }
 }
 return $string;
}

//递归stripslashes
function dstripslashes($string) {
 if (is_array ( $string )) {
  foreach ( $string as $key => $val ) {
   $string [$key] = $this->dstripslashes ( $val );
  }
 } else {
  $string = stripslashes ( $string );
 }
 return $string;
}
/**
 * 安全过滤函数
 * @param $string 要过滤的字符串
 * @return string 返回处理过的字符串
 */
function safe_replace($string) {
 $string = str_replace('%20','',$string);
 $string = str_replace('%27','',$string);
 $string = str_replace('%2527','',$string);
 $string = str_replace('*','',$string);
 $string = str_replace('"','&quot;',$string);
 $string = str_replace("'",'',$string);
 $string = str_replace('"','',$string);
 $string = str_replace(';','',$string);
 $string = str_replace('<','&lt;',$string);
 $string = str_replace('>','&gt;',$string);
 $string = str_replace("{",'',$string);
 $string = str_replace('}','',$string);
 return $string;
}

/**
 * 使用htmlspecialchars处理字符串或数组
 * @param $obj 需要处理的字符串或数组
 * @return mixed 返回经htmlspecialchars处理过的字符串或数组
 */
function new_htmlspecialchars($string) {
 if(!is_array($string))
 return htmlspecialchars($string);
 foreach($string as $key => $val)
 $string[$key] = new_htmlspecialchars($val);
 return $string;
}

//处理禁用HTML但允许换行的内容
function TrimMsg($msg) {
 $msg = trim ( stripslashes ( $msg ) );
 $msg = nl2br ( htmlspecialchars ( $msg ) );
 $msg = str_replace ( "  ", "&nbsp;&nbsp;", $msg );
 return addslashes ( $msg );
}

[!--infotagslink--]

相关文章

  • 不打开网页直接查看网站的源代码

      有一种方法,可以不打开网站而直接查看到这个网站的源代码..   这样可以有效地防止误入恶意网站...   在浏览器地址栏输入:   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
  • php简单用户登陆程序代码

    php简单用户登陆程序代码 这些教程很对初学者来讲是很有用的哦,这款就下面这一点点代码了哦。 <center> <p>&nbsp;</p> <p>&nbsp;</p> <form name="form1...2016-11-25
  • PHP实现清除wordpress里恶意代码

    公司一些wordpress网站由于下载的插件存在恶意代码,导致整个服务器所有网站PHP文件都存在恶意代码,就写了个简单的脚本清除。恶意代码示例...2015-10-23
  • JS中artdialog弹出框控件之提交表单思路详解

    artDialog是一个基于javascript编写的对话框组件,它拥有精致的界面与友好的接口。本文给大家介绍JS中artdialog弹出框控件之提交表单思路详解,对本文感兴趣的朋友一起学习吧...2016-04-19
  • js识别uc浏览器的代码

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

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

    有时候我们为了省事就操作键盘组合键去代替使用鼠标,我们今天就使用JQuery实现Ctrl+Enter提交表单。我们发帖时,在内容输入框中输入完内容后,可以点击“提交”按钮来发表内容。可是,如果你够“懒”,你可以不用动鼠标,只需按...2015-10-23
  • JS日期加减,日期运算代码

    一、日期减去天数等于第二个日期function cc(dd,dadd){//可以加上错误处理var a = new Date(dd)a = a.valueOf()a = a - dadd * 24 * 60 * 60 * 1000a = new Date(a)alert(a.getFullYear() + "年" + (a.getMonth() +...2015-11-08
  • PHP开发微信支付的代码分享

    微信支付,即便交了保证金,你还是处理测试阶段,不能正式发布。必须到你通过程序测试提交订单、发货通知等数据到微信的系统中,才能申请发布。然后,因为在微信中是通过JS方式调用API,必须在微信后台设置支付授权目录,而且要到...2014-05-31
  • PHP常用的小程序代码段

    本文实例讲述了PHP常用的小程序代码段。分享给大家供大家参考,具体如下:1.计算两个时间的相差几天$startdate=strtotime("2009-12-09");$enddate=strtotime("2009-12-05");上面的php时间日期函数strtotime已经把字符串...2015-11-24
  • php怎么用拼音 简单的php中文转拼音的实现代码

    小编分享了一段简单的php中文转拼音的实现代码,代码简单易懂,适合初学php的同学参考学习。 代码如下 复制代码 <?phpfunction Pinyin($_String...2017-07-06
  • php导出csv格式数据并将数字转换成文本的思路以及代码分享

    php导出csv格式数据实现:先定义一个字符串 存储内容,例如 $exportdata = '规则111,规则222,审222,规222,服2222,规则1,规则2,规则3,匹配字符,设置时间,有效期'."/n";然后对需要保存csv的数组进行foreach循环,例如复制代...2014-06-07
  • ecshop商品无限级分类代码

    ecshop商品无限级分类代码 function cat_options($spec_cat_id, $arr) { static $cat_options = array(); if (isset($cat_options[$spec_cat_id]))...2016-11-25
  • 几种延迟加载JS代码的方法加快网页的访问速度

    本文介绍了如何延迟javascript代码的加载,加快网页的访问速度。 当一个网站有很多js代码要加载,js代码放置的位置在一定程度上将会影像网页的加载速度,为了让我们的网页加载速度更快,本文总结了一下几个注意点...2013-10-13
  • vue项目,代码提交至码云,iconfont的用法说明

    这篇文章主要介绍了vue项目,代码提交至码云,iconfont的用法说明,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-07-30