防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
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

「PHP开发APP接口实战009」日常安全防范之防SQL入和XSS攻击的更多相关文章

  1. 《PHP开发APP接口》笔记

    PHP开发APP接口 [TOC] 课程地址 imooc PHP开发APP接口 学习要点 APP接口简介 封装通信接口方法 核心技术 APP接口实例 服务器端 -> 数据库|缓存 -> 调用 ...

  2. PHP开发APP接口(二)

    这里将会调用前面博客的数据库连接单例.文件缓存类和开发APP接口(一) <?php // http://app.com/list.php?page-=1&pagesize=12 requ ...

  3. PHP开发APP接口

    第1章 APP接口简介 - 课程简介 (:) - APP接口介绍 (:) - 客户端APP通信 (:) 最近学习 - 客户端APP通信格式区别 (:) - APP接口做的哪些事儿 (:) 第2章 封装 ...

  4. PHP开发APP接口学习笔记

    习要点概述1.APP接口简介 2.封装通信接口方法 3.核心技术 4.APP接口实例 服务器和客户端进行接口数据通信:服务器 -->数据库|缓存 -->调用接口 -->客户端 服务器 ...

  5. PHP开发APP接口实现--基本篇

    最近一段时间一直在做APP接口,总结一下APP接口开发以来的心得,与大家分享: 1. 客户端/服务器接口请求流程: 安卓/IOS客户端   –> PHP接口 –> 服务器端  –> ...

  6. 关于开发APP接口版本不兼容的问题

    关于 APP接口版本兼容的问题. iOS和android 要不断开发新版本,很多服务端开发都是在以前接口的逻辑上进行修改. 新的APP和接口开发后,接口如何兼容老的APP? 有的公司 每次发布完APP ...

  7. PHP开发APP接口之返回数据

    首先说明一下客户端APP通信的格式 1.xml:扩展标记语言(1.用来标记数据,定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言,xml格式统一,跨平台和语言,非常适合数据传输和通信,早已 ...

  8. php开发APP接口(总结一)

    一.什么是app接口:服务端与客户端的数据交互. 大部分APP接口是通过http协议通信的. http通信的三要素: URL:   通信的地址 Method:通信的方式(get | post | pu ...

  9. PHP 开发 APP 接口 学习笔记与总结 - APP 接口实例 [5] 版本设计分析及数据表设计

    APP 版本升级以及 APP 演示 ① 版本升级分析以及数据表设计 ② 版本升级接口开发以及 APP 演示 /** * version_upgrade 版本升级信息表 */ CREATE TABLE ...

随机推荐

  1. scrapy爬取booking酒店评论数据

    # scrapy爬取酒店评论数据 -- 代码 here:github地址:https://github.com/760730895/scrapy_Booking--  采用scrapy爬取酒店评论数据 ...

  2. 应用安全 - 代码审计 -Java

    Java %c0%ae 安全模式绕过漏洞 原理 在Java端"%c0%ae"解析为"\uC0AE",最后转义为ASCCII低字符-".".通 ...

  3. 对PInvoke函数函数调用导致堆栈不对称。原因可能是托管的 PInvoke 签名与非托管的目标签名不匹配。

    C#引入外部非托管类库时,有时候会出现“对PInvoke函数调用导致堆栈不对称.原因可能是托管的 PInvoke 签名与非托管的目标签名不匹配”的报错. 通常在DllImport标签内加入属性Call ...

  4. POJ-1064.Cablemaster.(二分法枚举值求最优值)

    题目链接 本题大意:给你n个长度为value[ i ]的长木板,让你切割成为等长的k份,问你切割的最大长度是多少. 本题思路:其实很容易可以想到先找到一个上界和一个下界,开始枚举里面的所有长度,取最长 ...

  5. Monitor HDU6514 二维差分入门学习

    Monitor HDU 6514 二维差分入门学习 题意 小腾有\(n*m\)的田地,但是有小偷来偷东西,在一片矩形区域上,有一部分区域是监控可以覆盖到的,这部分区域由一个或多个包含于该矩形区域的小矩 ...

  6. dp(电梯与楼梯)

    http://codeforces.com/problemset/problem/1249/E E. By Elevator or Stairs? time limit per test 2 seco ...

  7. RMQ 的入门 hdu1806

    RMQ(Range Minimum/Maximum Query),即区间最值查询,是指这样一个问题:对于长度为n的数列A,回答若干次询问RMQ(i,j),返回数列A中下标在区间[i,j]中的最小/大值 ...

  8. k8s结合helm部署

    一.安装Helm helm教程以及安装可以参考这篇文章 二.Heml说明 常见的helm模板如下 myapp - chart 包目录名 ├── charts - 依赖的子包目录,里面可以包含多个依赖的 ...

  9. vue css中scoped

    1.什么是scoped vue组件中,在style标签中有一个属性,叫做scoped.当此标签拥有scoped属性的时候,该组件下的css样式只适用于本组件,而不会影响全局组件.这其实也相当于样式的模 ...

  10. javaScript 例子

    1.a标签调用js的几种方法 a href="javascript:void(0);" onclick="js_method()" a href="# ...