防SQL注入和XSS攻击通用过滤

  1. 首先在 /app/library/ 目录下创建 Security.php 文件并添加以下代码:
<?php

/**
*
* 防SQL注入和XSS攻击通用过滤
*/
class Security
{ public static function filter(&$params)
{
if (!is_array($params)) {
return;
} $patterns = ['/([\x00-\x08,\x0b-\x0c,\x0e-\x19])/i', '/javascript/i', '/script/i', '/vbscript/i', '/expression/i', '/applet/i', '/meta/i', '/xml/i', '/blink/i', '/link/i', '/style/i', '/embed/i', '/object/i', '/frame/i', '/layer/i', '/title/i', '/bgsound/i', '/base/i', '/onload/i', '/onunload/i', '/onchange/i', '/onsubmit/i', '/onreset/i', '/onselect/i', '/onblur/i', '/onfocus/i', '/onabort/i', '/onkeydown/i', '/onkeypress/i', '/onkeyup/i', '/onclick/i', '/ondblclick/i', '/onmousedown/i', '/onmousemove/i', '/onmouseout/i', '/onmouseover/i', '/onmouseup/i', '/onunload/i']; foreach ($params as $key => $value) {
if (!is_array($value)) {
// 不对 magic_quotes_gpc 转义过的字符使用 addslashes(),避免双重转义。
if (!get_magic_quotes_gpc()) {
$value = addslashes($value); // 给单引号(')、双引号(")、反斜线(\)与 NUL(NULL 字符)加上反斜线转义
}
$value = preg_replace($patterns, '', $value); // 删除非打印字符,粗暴式过滤xss可疑字符串
$params[$key] = htmlentities(strip_tags($value)); //去除 HTML 和 PHP 标记并转换为 HTML 实体
} else {
self::filter($params[$key]);
}
}
}
}

此函数主要实现:

  1. 使用函数addslashes() 给单引号(')、双引号(")、反斜线(\)与 NUL(NULL 字符)加上反斜线转义, 防止SQL注入。
  2. 删除非打印字符,粗暴式过滤xss可疑字符串。由于此 Demo 项目,无需要用户输入脚本数据,所以,直接将一些非法的脚本字符串,直删除。
  3. 去除 HTML 和 PHP 标记并转换为 HTML 实体

  1. 在 BaseController 中,定义私有两个变量$_get_params 和 $_post_params, 用于存储过滤后。并添加初始化请求参数函数 initializeParams()
    /**
* 初始化请求参数 (防注入和XSS攻击通用过滤)
*/
private function initializeParams()
{
$this->_get_params = $this->request->getQuery();
Security::filter($this->_get_params); if ($this->request->isPost()) {
$this->_post_params = $this->request->getPost();
Security::filter($this->_post_params);
}
}

将过滤后的请求参数分别存入$_get_params 和 $_post_params

  1. 在 BaseController 中,initialize() 中调用 initializeParams()
        // 初始化请求参数 (防注入和XSS攻击通用过滤)
$this->initializeParams();
  1. 再在 BaseController 中,添加两个读取 GET 和 POST 参数的函数。
    /**
* 获取GET请求参数(已过滤)
* @param null $key 未指定参数名称,将以数组形式返回GET所有请求参数
* @return array|mixed|null
*/
public function get($key = null)
{
if ($key) {
return isset($this->_get_params[$key]) ? $this->_get_params[$key] : null;
}
return $this->_get_params;
} /**
* 获取请POST求参数(已过滤)
* @param null $key 未指定参数名称,将以数组形式返回所有POST请求参数
* @return array|mixed|null
*/
public function getPost($key = null)
{
if ($key) {
return isset($this->_post_params[$key]) ? $this->_post_params[$key] : null;
}
return $this->_post_params;
}

所有继承 BaseController 的控制器中,都可以使用 $this->get() 和 $this->getPost() 来读取安全的请求参数。

防止伪造会话

由于使用 Token 进行身份认证涉及到数据库部分,将在稍后的会员系统开发中讲解。

防止恶意访问

由于 transaction_id 涉及到缓存且防重复访问接口需求不是很大,所以暂时不讲解怎么实现。

示例代码下载

链接:https://pan.baidu.com/s/1d1mOFk 密码:uypl

作者:一念觀心
链接:https://www.jianshu.com/p/778ba15c786e
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

最新文章

  1. linux之PATH环境变量
  2. 十分钟搞定CSS选择器
  3. Asp.net EasyUI中的combogrid实现分页功能
  4. mysql 总结二(自定义函数)
  5. JS判断设备的类型
  6. 浅析LRU(K-V)缓存
  7. 每天一个linux命令(30):cal 命令
  8. LeetCode Contains Duplicate II (判断重复元素)
  9. RC522天线匹配参数【worldsing笔记】
  10. make makefile
  11. 【STL】【模拟】Codeforces 696A Lorenzo Von Matterhorn
  12. PHP简易计算器方法2
  13. 重定向输入输出流--freopen
  14. 如何检测被锁住的Oracle存储过程及处理办法汇总(转)
  15. PHP採集CSDN博客边栏的阅读排行
  16. VGG网路结构
  17. python之地基(三)
  18. 进程pid理解
  19. centos7下安装docker(17docker监控---docker自带监控命令)
  20. 秒懂AOP

热门文章

  1. vue 组件传参
  2. xmake v2.1.5版本新特性介绍
  3. node.js—创建、删除、追加文件等方法汇总
  4. HDFS-HA高可用工作机制
  5. 让网站动起来!12款优秀的 jQuery 动画
  6. PHP Web Server 实例
  7. Hadoop MapReduce实现人员二度关系运算
  8. ASE Alpha Sprint - backend scrum 8
  9. JSZip
  10. 阿里P7前端需要哪些技能