关于我们

Website:https://security.immomo.com
WeChat:

成员介绍

项目简介

本项目包含两部分: 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

目录

一、 安装 二、 调用说明 2.1 CSRF 2.2 XSS 2.3 URL Redirect 2.4 SQL Injection 2.5 SSRF 2.6 AES 2.7 RSA 2.8 上传文件安全校验

一、 安装

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 SecuritySQLSecurityMysql; //引入需要的类 /** * 数据库连接配置信息 */ $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']上传到文件服务器

版权声明:

1、该文章(资料)来源于互联网公开信息,我方只是对该内容做点评,所分享的下载地址为原作者公开地址。
2、网站不提供资料下载,如需下载请到原作者页面进行下载。
3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考学习用!
4、如文档内容存在违规,或者侵犯商业秘密、侵犯著作权等,请点击“违规举报”。