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

Posted 搬砖小伙子

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了「PHP开发APP接口实战009」日常安全防范之防SQL入和XSS攻击相关的知识,希望对你有一定的参考价值。

  1. 防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攻击的主要内容,如果未能解决你的问题,请参考以下文章

    安全之防sql注入,xss攻击,CSRF攻击

    php做APP接口开发,接口的安全性

    php开发api接口数据安全

    PHP实战002:CodeIgniter安装和入门使用

    PHP开发高可用高安全App后端

    SpringCloud微服务安全实战API安全 3-5 认证