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

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

原文地址:https://www.cnblogs.com/yehuisir/p/12000288.html

时间: 2024-10-20 13:49:40

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

PHP开发APP接口(二)

这里将会调用前面博客的数据库连接单例.文件缓存类和开发APP接口(一) [php] view plain copy print? <?php // http://app.com/list.php?page-=1&pagesize=12 require_once('./response.php'); require_once('./file.php'); $file = new File(); $data = $file->cacheData('index_cron_cahce'); i

小蚂蚁学习APP接口开发(7)—— APP接口实例——读取缓存方式开发APP接口的代码案例

从数据库中直接读取数据,虽然时效性很强,但是对数据库造成很大压力,尤其是在高访问量的情况下.这时候可以通过缓存,来有效的缓解了这一压力,虽然时效性有些不足,但是服务器的抗压能力却达到了很大的提高. 读取缓存方式的中心思想: 当请求进来时,先查看是否有缓存,如果有并且缓存还在有效时间内,不再查询数据库,直接返回缓存即可:如果没有或者已经过了有效时间,查询数据库,返回数据,同时生成一份新的缓存,供以后使用. 代码案例,还是在前几天的代码基础上进行改造完善. File静态缓存类    (原来的代码请参

PHP开发APP接口(七)

APP接口实例 单例模式连接数据库首页接口的开发以及客户端app的演示APP版本升级接口APP错误日志的接口 单例模式连接数据库学习要点:掌握单例模式设计php连接数据库 单例模式:一个类只能拥有一个实例:<?php class Db{    puclic function __construct(){ }} $db=new Db();$db1=new Db();普通的类可以产生多个实例 单例模式三大原则:1.构造函数需要标记为非Public(防止外部使用new操作符创建对象),单例类不能在其他

PHP开发APP接口(八)

首页接口的开发以及客户端app的演示方案一:读取数据库方式开发首页接口从数据库获取信息 封装 生成接口数据应用场景:数据是时效性比较高的系统 方案二:读取缓存方式开发首页接口从数据库获取信息 封装写入缓存 设定缓存失效时间 返回数据在缓存时效内请求是从缓存里面获取数据:用途:减少数据库的压力,用途很广,搜狐视频,优酷首页 方案三:定时读取缓存方式开发首页接口定时生成缓存 应用端请求生存好的缓存 方案一:如何获取数据,如何将获取的数据快速生成接口数据 安装start bluestacks安卓模拟器

php开发app接口

用interface关键字定义,示例: interface video(){ public function getVideos(); public function getCount();//这都是虚拟的方法 } 接口的实现:[接口中给的所有方法都必须在示例中实现] class movie implements video{ public function getVideo(){ //do something } public function getCount(){ //do somethi

PHP 开发 APP 接口 学习笔记与总结 - APP 接口实例 [3] 首页 APP 接口开发方案 ② 读取缓存方式

以静态缓存为例. 修改 file.php line:11 去掉 path 参数(方便),加上缓存时间参数: public function cacheData($k,$v = '',$cacheTime = 0){ //文件名 $filename = $this->_dir.$k.'.'.self::EXT; ..... line:25 把缓存时间设置为 11 位的数字,如果不满 11 位,则在时间前面补 0.再把缓存时间和缓存内容进行拼接: $cacheTime = sprintf('%011

PHP 开发 APP 接口总结 - JSON 结合 XML 方式封装通信接口

要求: 1.在一个类中封装多种数据通信方法(JSON,XML),并且只通过一个入口选择需要的数据通信格式 2.客户端开发工程师可以自行选择数据传输格式(GET 方式) response.php <?php class Response{ const JSON = 'json'; //封装的综合方法,默认的数据类型为json public static function show($code,$message = '',$data,$type = self::JSON){ if(!is_numer

PHP 开发 APP 接口--错误日志接口

APP 上线以后可能遇到的问题: ① APP 强退 ② 数据加载失败 ③ APP 潜在问题 错误日志需要记录的内容 数据表 error_log 字段: id app_id:app 类别 id did:客户端设备号 version_id:版本号 version_mini:小版本号 error_log:错误信息(由 APP 返回,客户端开发工程师开发) error.php 处理 app 错误日志 <?php require_once('./common.php'); class ErrorLog e

PHP开发APP接口(一)

php以json或者xml 形式返回给app.明白这点就很好说了,就是把数据包装成json或者xml,返回给APP 定义抽象APP基类: <?php /** * 定义API抽象类 */ abstract class Api { const JSON = 'Json'; const XML = 'Xml'; const ARR = 'Array'; /** * 定义工厂方法 * param string $type 返回数据类型 */ public static function factory(