「PHP开发APP接口实战009」日常安全防范之防SQL入和XSS攻击

接上一章,我们今天来讲讲过滤和转义请求参数中非法字符,以防止SQL入和XSS攻击。
「PHP开发APP接口实战008」日常安全防范之签名验证

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

  1. 首先在 /app/library/ 目录下创建 Security.php 文件并添加以下代码:
 $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

你可能感兴趣的:(「PHP开发APP接口实战009」日常安全防范之防SQL入和XSS攻击)