「PHP开发APP接口实战009」日常安全防范之防SQL入和XSS攻击
防SQL注入和XSS攻击通用过滤
- 首先在
/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]); } } } }
此函数主要实现:
- 使用函数
addslashes()
给单引号(')、双引号(")、反斜线(\)与 NUL(NULL 字符)加上反斜线转义, 防止SQL注入。 - 删除非打印字符,粗暴式过滤xss可疑字符串。由于此 Demo 项目,无需要用户输入脚本数据,所以,直接将一些非法的脚本字符串,直删除。
- 去除 HTML 和 PHP 标记并转换为 HTML 实体
- 在
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
。
- 在
BaseController
中,initialize()
中调用initializeParams()
// 初始化请求参数 (防注入和XSS攻击通用过滤) $this->initializeParams();
- 再在
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
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。