Skip to content
PHP安全SDK及编码规范
Branch: master
Clone or download
iicoming Merge pull request #6 from momosecurity/1.1
增加上传文件安全校验
Latest commit 8755f57 May 21, 2019
Permalink
Type Name Latest commit message Commit time
Failed to load latest commit information.
src Merge pull request #6 from momosecurity/1.1 May 21, 2019
.gitignore 2019-0510 创建项目 May 10, 2019
LICENSE 2019-0510 创建项目 May 10, 2019
README.md Merge pull request #6 from momosecurity/1.1 May 21, 2019
composer.json 2019-0521 上传文件安全校验优化 May 21, 2019

README.md

项目简介

本项目包含两部分: php安全编码规范和PHP安全SDK,SDK介绍详见下述。

项目结构

├── composer.json
├── readme.md
└── src
    ├── DataSecurity
    │   ├── AESEncryptHelper.php                    //AES加解密
    │   ├── EncryptHelper.php
    │   └── RSAEncryptHelper.php                    //RSA加解密
    ├── EncoderSecurity
    │   ├── BaseEncoder.php
    │   ├── EncoderSecurity.php
    │   ├── HtmlEntityEncoder.php                   //html 实体编码
    │   └── JavaScriptEncoder.php                   //js编码
    ├── FileSecurity                                //上传文件安全校验
    │   ├── FileSecurity.php
    │   └── UploadedFileVerification.php
    ├── HTMLPurifier                                //xss payload过滤
    │   ├── HTMLPurifier
    │   ├── HTMLPurifier.php
    │   ├── HTMLPurifier_Default_config.php
    │   └── LICENSE
    ├── SLIM                                        //pdo增删改查封装
    │   ├── Clause
    │   ├── Database.php
    │   ├── LICENSE
    │   ├── Mysql.php
    │   ├── Statement
    │   ├── Statement.php
    │   └── docs
    ├── SecurityUtil.php
    └── URLSecurity
        ├── DefenseAgainstCSRF.php                  // csrf防护
        ├── DefenseAgainstRedirect.php              // 任意url重定向防护
        ├── DefenseAgainstSSRF.php                  // ssrf防护
        └── URLSecurity.php                         

目录

一、 安装

1、composer.json配置依赖:

"require": {
   "momosec/rhizobia": "1.1"
},
"repositories":[
{"type":"vcs","url":"https://github.com/momosecurity/rhizobia_P.git"}]


2、安装依赖:

composer install 

二、 调用说明

2.1 CSRF

1、前端获取cookie中植入的csrf_token字段使用POST方法提交:

function getCookie() {
    var value = "; " + document.cookie;
    var parts = value.split("; csrf_token=");
    if (parts.length == 2) 
        return parts.pop().split(";").shift();
}

$.ajax({
    type: "post",
    url: "/URL",
    data: {csrf_token:getCookie()},
    dataType: "json",
    success: function (data) {
        if (data.ec == 200) {
         //do something
        }
    }
});

2、初始化:

$this->securityUtil=SecurityUtil::getInstance();

3、后端验证token:

if(!$this->securityUtil->verifyCSRFToken()){
    return ;   //csrf token 校验失败
}
// 处理业务逻辑

注意: 受csrf_token生成方式影响,存在XSS问题时,可能会导致全局csrf防护失效。

2.2 XSS

1、初始化:

$this->securityUtil=SecurityUtil::getInstance();

2、输入过滤

$this->securityUtil->purifier($data);

以上会对$data做xss payload过滤。
说明: 参考自ezyang/htmlpurifier,psr-0改为psr-4,内容调整。
注意: 为保证处理速度,还应对相应文件夹赋予写权限,用于保存缓存文件。

chmod -R 0755 /src/HTMLPurifier/HTMLPurifier/DefinitionCache/Serializer

3、输出编码

1)输出数据到html:
$this->securityUtil->encodeForHTML($data)

以上会对$data做html实体编码

2)输出数据到JavaScript:
$this->securityUtil->encodeForJavaScript($data)

以上会对$data做javaScript编码

2.3 URL Redirect

1、初始化:

$this->securityUtil=SecurityUtil::getInstance();

2、校验url:

//仅信任域名protect.domain
$white="protect.domain";
//仅信任protect.domain所有子域
$white=".protect.domain";
//信任多个域名的子域名或多个域名
$white=array(".protect.domain","protect1.domain");

if(!$this->securityUtil->verifyRedirectUrl($url,$white)){
    // 非信任域名,退出或提供二次确认页
}
// 处理业务逻辑

其中verifyRedirectUrl函数默认参数$white值为array(),需设置白名单域名。
注意: 该封装方法默认拒绝任何非http、https的URL。

2.4 SQL Injection

1、获取数据库实例:

use Security\SQLSecurity\Mysql;  //引入需要的类



/**
 * 数据库连接配置信息
 */
$dbconf = array(
    "hostname" => "127.0.0.1",
    "port" => 3306,
    "database" => "oversold",
    "charset" => "utf8",
    "username" => "root",
    "password" => "toor",
);

$this->db = Mysql::getInstance()->initdb($dbconf);

数据库连接配置选项如下:

$config["hostname"]                //mysql地址
$config["port"]                    //mysql端口
$config["database"]                //使用的数据库
$config["timeout"]                 //超时时间,默认1s
$config["charset"]                 //字符集,默认UTF8
$config["ATTR_ERRMODE"]            //错误级别,默认PDO::ERRMODE_EXCEPTION
$config["ATTR_DEFAULT_FETCH_MODE"] //数据提取模式,默认PDO::FETCH_ASSOC
$config["ATTR_PERSISTENT"]         //是否启用持久连接,默认不启用
$config["username"]                //用户名
$config["password"]                //密码

2、增删改查:

//查询
$result=$this->db->select()->from("oversolod")->where("id","=",$id)->execute()->fetchAll();
//删除
$result=$this->db->delete()->from("oversolod")->where("name","like","%".$name."%")->execute();
//插入
$result=$this->db->insert(array("name","age"))->into("oversolod")->values(array($name,$age))->execute();
//更新
$result=$this->db->update(array("name" => $name))->table("oversolod")->where("id", "=", $id)->execute();

2.5 SSRF

1、初始化:

$this->securityUtil=SecurityUtil::getInstance();

2、校验url:

if(!$this->securityUtil->verifySSRFURL($url)){
    return ;   //非法url
}
// 开始处理业务逻辑

2.6 AES

1、初始化:

$this->securityUtil=SecurityUtil::getInstance();

2、设置初始化密钥:

$this->securityUtil->initAESConfig($key);

3、根据初始化密钥生成加密密钥:

//$uuid 用户唯一身份标识
$pwd = $this->securityUtil->createSecretKey($uuid); 

4、AES加密:

$data = $this->securityUtil->aesEncrypt($data, $pwd);

5、AES解密:

//$pwd为第三步生成的加密密钥
$result = $this->securityUtil->aesDecrypt($data, $pwd); 

注意: 默认初始化密钥值为"AES_KEY",需设置初始化密钥。

2.7 RSA

1、初始化:

$this->securityUtil=SecurityUtil::getInstance();

2、初始化公私钥:

$this->securityUtil->initRSAConfig(dirname(__FILE__)."/pri.key",dirname(__FILE__)."/pub.key");

3、公钥加密、私钥解密:

//公钥加密
$result=$this->securityUtil->rsaPublicEncrypt($data ); 
//私钥解密
$result= $this->securityUtil->rsaPrivateDecrypt($data); 

4、私钥加密、公钥解密:

//私钥加密
$result=$this->securityUtil->rsaPrivateEncrypt($data ); 
//公钥解密
$result= $this->securityUtil->rsaPublicDecrypt($data); 

2.8 上传文件安全校验

1、初始化:

$this->securityUtil=SecurityUtil::getInstance();

2、校验上传文件:

$config=array('limit'=>5 * 1024 * 1024, //允许上传的文件最大大小
    'type'=>array(                      //允许的上传文件后缀及MIME
         "gif"=>"image/gif",
         "jpg"=>"image/jpeg",
         "png"=>"image/png")
);

$file = $_FILES["file"];
$data=$this->securityUtil->verifyUploadFile($file, $config);
if($data['flag']!==true){
    return; //上传失败 
}
//生成新的文件名拼接$data['ext']上传到文件服务器
You can’t perform that action at this time.