一个简单的 PHP防注入类

 更新时间:2016年11月25日 15:22  点击:1961
PHP防注入注意要过滤的信息基本是get,post,然后对于sql就是我们常用的查询,插入等等sql命令了,下面我给各位整理两个简单的例子,希望这些例子能给你网站带来安全哦。
 代码如下 复制代码


<?php
/**
 * 参数处理类
 * @author JasonWei
 */
class Params
{
    public $get = array();
 
    public $post = array();
 
    function __construct()
    {
if (!empty($_GET)) {
    foreach ($_GET as $key => $val) {
if (is_numeric($val)) {
    $this->get[$key] = $this->getInt($val);
} else {
    $this->get[$key] = $this->getStr($val);
}
    }
}
if (!empty($_POST)) {
    foreach ($_POST as $key => $val) {
if (is_numeric($val)) {
    $this->post[$key] = $this->getInt($val);
} else {
    $this->post[$key] = $this->getStr($val);
}
    }
}
    }
 
    public function getInt($number)
    {
return intval($number);
    }
 
    public function getStr($string)
    {
if (!get_magic_quotes_gpc()) {
    $string = addslashes($string);
}
return $string;
    }
 
    public function checkInject($string)
    {
return eregi('select|insert|update|delete|/*|*|../|./|union|into|load_file|outfile', $string);
    }
 
    public function verifyId($id = null)
    {
if (!$id || $this->checkInject($id) || !is_numeric($id)) {
    $id = false;
} else {
    $id = intval($id);
}
return $id;
    }
}
?>

例子二

 代码如下 复制代码

 

<?    
/************************* 
说明:   
判断传递的变量中是否含有非法字符   
  
如$_POST、$_GET   
功能:   
防注入   
*************************/   
//要过滤的非法字符    
$ArrFiltrate=array("'","or","and","union","where");    
//出错后要跳转的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)){    
echo "<script language='javascript'>alert('传递的信息中不得包含{',or,and,union}等非法字符请您把他们换成{‘,OR,AND,UNION}');</script>";    
if (emptyempty($StrGoUrl)){    
echo "<scriptlanguage='javascript'>history.go(-1);</script>";    
}else{    
echo "<scriptlanguage='javascript'>window.location='".$StrGoUrl."';</script>";    
}    
exit;    
}    
}    
/***************结束防止PHP注入*****************/   
?>  

Memcache是一个高性能的分布式的内存对象缓存系统,通过在内存里维护一个统一的巨大的hash表,它能够用来存储各种格式的数据,包括图像、视频、文件以及数据库检索的结果等。简单的说就是将数据调用到内存中,然后从内存中读取,从而大大提高读取速度。

本篇主要简述编译php及其扩展memcache,在阅读后面内容之前,建议先阅读一下官方文档(地址)。下面我们以php5.3为例。

一、编译环境

根据你的php版本选择相应的编译器:

php 5.3-5.4 :Visual C++ 9.0(Visual Studio 2008)

php 5.5+ :Visual C++ 11.0(Visual Studio 2012)

如果是php5.3-5.4,还要下载Windows SDK 6.1(下载地址)

 

二、编译文件

1、下载php源代码,http://snaps.php.net/

1.jpg

2、下载php sdk文件,http://windows.php.net/downloads/php-sdk/

2.jpg

那么我们这里下载这两个文件。

3、下载memcache扩展代码包,http://pecl.php.net/package/memcache


3.jpg

三、编译工作

1、创建编译目录“C:\php_sdk”

2、解压php-sdk-binary-tools-20110915.zip里面的文件到php_sdk目录下

3、在开始菜单找到并打开Windows SDK CMD Shell,然后执行

setenv /x86 /xp /release
cd php_sdk
bin\phpsdk_setvars.bat
bin\phpsdk_buildtree.bat phpdev

执行后,目录下会生成phpdev文件夹

4、进入C:\php_sdk\phpdev\vc9\x86\,把deps-5.3-vc9-x86.7z解压到该目录下,覆盖deps文件夹。

5、把php源代码也解压到x86目录下。

6、在x86目录下创建pecl文件夹,把memcache压缩包内容解压到pecl目录,并把文件夹名memcache-2.2.7改为memcache

7、在x86目录下创建obj文件夹,用于保存编译时生成的文件

8、执行以下命令,用于创建php编译配置

cd phpdev\vc9\x86\php5.3-201308211030
buildconf
configure --help >..\configure_help.txt
configure --disable-all --enable-snapshot-build --enable-cli --enable-cgi --enable-memcache=shared --enable-object-out-dir=..\obj --enable-session

注:配置中的–enable-memcache=shared意思是memcache要生成dll,否则就会和php打包到一起了

9、编译php,执行以下命令

nmake

10、如果想打包php,执行以下命令

nmake snap


到这里,编译工作应该结束了。可以在C:\php_sdk\phpdev\vc9\x86\obj\ReleaseTS\目录中找到php_memcache.dll


四、结束语

这篇文章讲述如何编译php及其本身自带的php扩展,与之前写的windows下编译php扩展 eAccelerator做区别。还可以生成哪些php扩展,具体可以看x86目录刚刚生成的帮助文档configure_help.txt

原文来自:lvtao.net博客

 

在一些开发中,我们使用curl等进行通信,如果你的一些隐私数据不进行加密,就可能造成信息泄露,带来不必要的麻烦。我们提供一个带密钥的加密解密函数,只要你的密钥不泄露,就可能很好的保护你的传输。

代码

 代码如下 复制代码

function encrypt($data, $key)
{
    $key    =   md5($key);
    $x      =   0;
    $len    =   strlen($data);
    $l      =   strlen($key);
    for ($i = 0; $i < $len; $i++)
    {
        if ($x == $l) 
        {
            $x = 0;
        }
        $char .= $key{$x};
        $x++;
    }
    for ($i = 0; $i < $len; $i++)
    {
        $str .= chr(ord($data{$i}) + (ord($char{$i})) % 256);
    }
    return base64_encode($str);
}

function decrypt($data, $key)
{
    $key = md5($key);
    $x = 0;
    $data = base64_decode($data);
    $len = strlen($data);
    $l = strlen($key);
    for ($i = 0; $i < $len; $i++)
    {
        if ($x == $l) 
        {
            $x = 0;
        }
        $char .= substr($key, $x, 1);
        $x++;
    }
    for ($i = 0; $i < $len; $i++)
    {
        if (ord(substr($data, $i, 1)) < ord(substr($char, $i, 1)))
        {
            $str .= chr((ord(substr($data, $i, 1)) + 256) - ord(substr($char, $i, 1)));
        }
        else
        {
            $str .= chr(ord(substr($data, $i, 1)) - ord(substr($char, $i, 1)));
        }
    }
    return $str;
}

上面的两个函数,一个是加密函数,一个是解密函数。encrypt($data, $key) 为加密函数,其中$data是要加密的内容,$key是你的密钥。decrypt($data, $key) 是解密函数,其中$data是要解密的字符串,$key是密钥

在php中我们如果想让系统函数不被执行可以在php.ini中加上Disable_functions后面跟函数名就可以了。

禁用方法如下:
 
打开/etc/php.ini文件,
 
搜索定位到这行 

1.disable_functions = 

添加需禁用的函数名,比如: 

 代码如下 复制代码

phpinfo,eval,passthru,exec,system,chroot,scandir,chgrp,chown,shell_exec,proc_open,proc_get_status,ini_alter,ini_alter,ini_restore,dl,pfsockopen,openlog,syslog,readlink,symlink,popepassthru,stream_socket_server,fsocket,fsockopen

相反的如果要运行php运行某个函数删除相应的函数即可。但文章有个“eval”函数,这个不是系统函数所以无法禁止不信大家可试下。


以上只是列了部分不叫常用的文件处理函数,你也可以把上面执行命令函数和这个函数结合,
就能够抵制大部分的phpshell了。

但是我后来看一文章告诉我们这样做不是万能的在linux中可以直接突破Disable_functions执行Linux命令

 代码如下 复制代码

<?php
//PHP4调用方法
dl('../../../../../home/apache/htdocs/php4.so');
biguanspider('uname -a');//调用函数
?> www.111cn.net

<?php
//PHP5调用方法
dl('../../../../../home/apache/htdocs/php5.so');
spiderbiguan('uname -a');//调用函数
?>

很多管理员在封杀PHP危险函数的时候一般都是这样的:disable_functions = proc_open,exec,passthru,shell_exec,system,popen
但是如果编译PHP时带–enable-pcntl参数就危险了,可以用pcntl_exec函数执行指定程序,也可以反弹一个SHELL,在PHPINFO里查看编译参数。
描述:pcntl_exec — 在当前进程空间执行指定程序,具体的做法我就不写了,所以linux安全还是得从本身设置不要想到php这样配置就KO了。

.inc文件在很久以前都是配置文件了,这样如果apache没有配置好很容易配置文件给爆露出来,下面我就来介绍具体的设置办法。

发现现在的项目是把所有的包含文件放在主目录下面,如下图:

网站目录为public,除了入口文件,所有的源码及配置文件,都在网站目录外。
刚开始没有意识到为什么这么做,后来想了想,真的很有必要,否则很容易就吧源代码和一些重要信息暴露在外了:
(1)比如说.inc扩展名的配置文件,和其它文本类型的文件,直接就可以在浏览器上访问了,很多能这里面就有数据库的账号啊
(2)如果你的apache还没有对PHP支持的时候,php文件也会默认作为文本类型在浏览器上访问【升级apache,或修改配置的时候可能出现】
如果将你的程序包含在网站目录之外,就避免了保留私密信息的危险。当然,你可以在apache上配置如禁止在浏览器上访问.inc文件:

 代码如下 复制代码

<Files ~ ".inc$">
    Order allow,deny
    Deny from all
</Files>

类似的很多细节很容易被运维人员忘记

 

[!--infotagslink--]

相关文章

  • phpems SQL注入(cookies)分析研究

    PHPEMS(PHP Exam Management System)在线模拟考试系统基于PHP+Mysql开发,主要用于搭建模拟考试平台,支持多种题型和展现方式,是国内首款支持题冒题和自动评分与教师评分相...2016-11-25
  • ASP/PHP sql注入语句整理大全

    SQL注入攻击指的是通过构建特殊的输入作为参数传入Web应用程序,而这些输入大都是SQL语法里的一些组合,通过执行SQL语句进而执行攻击者所要的操作 标准注入语句1.判...2016-11-25
  • PHP防止SQL注入的例子

    防止SQL注入是我们程序开发人员必须要做的事情了,今天我们就来看一篇关于PHP防止SQL注入的例子了,具体的实现防过滤语句可以参考下面来看看吧。 使用prepared以及参...2016-11-25
  • php简单数据操作的实例

    最基础的对数据的增加删除修改操作实例,菜鸟们收了吧...2013-09-26
  • AngularJS 依赖注入详解及示例代码

    本文主要介绍AngularJS 依赖注入的知识,这里整理了相关的基础知识,并附示例代码和实现效果图,有兴趣的小伙伴可以参考下...2016-08-24
  • PHP中自带函数过滤sql注入代码分析

    SQL注入攻击是黑客攻击网站最常用的手段。如果你的站点没有使用严格的用户输入检验,那么常容易遭到SQL注入攻击。SQL注入攻击通常通过给站点数据库提交不良的数据或...2016-11-25
  • 关于MySQL外键的简单学习教程

    在MySQL中,InnoDB引擎类型的表支持了外键约束。 外键的使用条件: 1.两个表必须是InnoDB表,MyISAM表暂时不支持外键(据说以后的版本有可能支持,但至少目前不支持); 2.外键列必须建立了索引,MySQL 4.1.2以后的版本在建立外键时...2015-11-24
  • Spring boot 无法注入service问题

    这篇文章主要介绍了Spring boot 无法注入service问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教...2021-10-09
  • C# 实现简单打印的实例代码

    C# 实现简单打印的实例代码,需要的朋友可以参考一下...2020-06-25
  • Spring 配置文件字段注入到List、Map

    这篇文章主要介绍了Spring 配置文件字段注入到List、Map,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-10-19
  • php sql防注入以及 html 过滤安全函数

    方法一过滤html自定义函数 代码如下 复制代码 function ihtmlspecialchars($string) { if(is_array($string)) { foreach($string as $key =>...2016-11-25
  • sql安全之SQL注入漏洞拖库原理解析

    本文章以自己的一些经验来告诉你黑客朋友们会怎么利用你数据库的sql漏洞来把你的数据库下载哦,有需要的同这参考一下本文章。 在数据库中建立一张表: 代码...2016-11-25
  • .Net防sql注入的几种方法

    这篇文章主要给大家总结介绍了关于.Net防sql注入的几种方法,文中通过示例代码介绍的非常详细,对大家学习或者使用.Net具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧...2021-09-22
  • ASP.NET防止SQL注入的方法示例

    这篇文章主要介绍了ASP.NET防止SQL注入的方法,结合具体实例形式分析了asp.net基于字符串过滤实现防止SQL注入的相关操作技巧,需要的朋友可以参考下...2021-09-22
  • ajax简单与ajax+php实例应用(1/4)

    [ajax介绍]   ajax是使用客户端脚本与web服务器交换数据的web应用开发方法。web页面不用打断交互流程进行重新加裁,就可以动态地更新。使用ajax,用户可以创建接近本地...2016-11-25
  • SpringBoot属性注入的多种方式实例

    在 SpringBoot中,提供了一种新的属性注入方式,支持各种java基本数据类型及复杂类型的注入,下面这篇文章主要给大家介绍了关于SpringBoot属性注入的多种方式,需要的朋友可以参考下...2021-10-30
  • C#最简单的字符串加密解密方法

    这篇文章主要介绍了C#最简单的字符串加密解密方法,本文直接给出实例代码,需要的朋友可以参考下...2020-06-25
  • spring中向一个单例bean中注入非单例bean的方法详解

    Spring是先将Bean对象实例化之后,再设置对象属性,所以会先调用他的无参构造函数实例化,每个对象存在一个map中,当遇到依赖,就去map中调用对应的单例对象,这篇文章主要给大家介绍了关于spring中向一个单例bean中注入非单例bean的相关资料,需要的朋友可以参考下...2021-07-19
  • PS简单给偏暗的人物图片美白及锐化处理(1/2)

    最终效果 ps简单给偏暗...2016-09-14
  • .NET Core源码解析配置文件及依赖注入

    这篇文章我们设计了一些复杂的概念,因为要对ASP.NET Core的启动及运行原理、配置文件的加载过程进行分析,依赖注入,控制反转等概念的讲解等...2021-09-22