热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

开发笔记:关于CIxss进攻和sql注入的防范问题

 防SQL注入防SQL注入的原理主要是过滤判断条件(WHERE或LIKE)中字段的特殊字符(‘,\,%,_..等),在特殊字段前加上转义字

 


防SQL注入

防SQL注入的原理主要是过滤判断条件(WHERE或LIKE)中字段的特殊字符(‘,\,%,_.....等),在特殊字段前加上转义字符等操作,使数据库能正常执行SQL,不会发生DatabaseError的问题

1、数字类型数组可以通过判断是否是数字和位数进行筛选,避免执行到数据库那里遇到问题

2、如果是纯字符串不需要特殊字符插库的话,可以判断如果有特殊字符的话就不继续执行,避免执行到数据库那里遇到问题

3、如果执行到数据库这里,需要对判断条件的字段进行过滤转义

 

这里说一下CI框架中转义的方式:

1、直接使用CI的AR(Active Record)的数据库CURD方式去处理

     (1)、插入:$this->db->insert("tableName",$insertArray);

     (2)、删除:$this->db->where("id",$id)->delete("tableName");

     (3)、更新:$this->db->where("id",$id)->update("tableName",$updateArray);

     (4)、查询:$this->db->where("id",$id)->select("id,name,age")->get("tableName");

     *这里有个细节需要get一下,where里面写sql自定义字符串时(下面的第4种方式),如where("id = ‘{$id}‘"),where这一块并不算是AR类的操作,换言之也就是不会自动进行过滤转义的

     *下面的4方式,自定义字符串方式虽然不是AR类写法,不支持自动过滤转义,但是可以支持where中写or的写法,相对灵活,如果遇到有or的情况,需要在那之前把判断的字段先转义

       过来,不管是用CI自己的方式(详见最下方的转义查询),还是自己封好的demo函数都可以



  1. 简单的 key/value 方式:





    $this->db->where(‘name‘, $name); // Produces: WHERE name = ‘Joe‘


    注意自动为你加上了等号。

    如果你多次调用该方法,那么多个 WHERE 条件将会使用 AND 连接起来:



    $this->db->where(‘name‘, $name);
    $this->db->where(‘title‘, $title);
    $this->db->where(‘status‘, $status);
    // WHERE name = ‘Joe‘ AND title = ‘boss‘ AND status = ‘active‘






  2. 自定义 key/value 方式:



    为了控制比较,你可以在第一个参数中包含一个比较运算符:



    $this->db->where(‘name !=‘, $name);
    $this->db->where(‘id <‘, $id); // Produces: WHERE name != ‘Joe‘ AND id <45






  3. 关联数组方式:





    $array = array(‘name‘ => $name, ‘title‘ => $title, ‘status‘ => $status);
    $this->db->where($array);
    // Produces: WHERE name = ‘Joe‘ AND title = ‘boss‘ AND status = ‘active‘


    你也可以在这个方法里包含你自己的比较运算符:



    $array = array(‘name !=‘ => $name, ‘id <‘ => $id, ‘date >‘ => $date);
    $this->db->where($array);






  4. 自定义字符串:



    你可以完全手工编写 WHERE 子句:



    $where = "name=‘Joe‘ AND status=‘boss‘ OR status=‘active‘";
    $this->db->where($where);







 


转义查询

在提交数据到你的数据库之前,确保先对其进行转义是个非常不错的做法。 CodeIgniter 有三个方法来帮你做到这一点:



  1. $this->db->escape() 这个函数会检测数据类型,仅转义字符串类型的数据。 它会自动用单引号将你的数据括起来,你不用手动添加:



    $sql = "INSERT INTO table (title) VALUES(".$this->db->escape($title).")";




  2. $this->db->escape_str() 这个函数忽略数据类型,对传入的数据进行转义, 这个方法并不常用,一般情况都是使用上面的那个方法。方法的使用代码如下:



    $sql = "INSERT INTO table (title) VALUES(‘".$this->db->escape_str($title)."‘)";




  3. $this->db->escape_like_str() 这个函数用于处理 LIKE 语句中的字符串,

    这样,LIKE 通配符(‘%‘, ‘_‘)可以被正确的转义。





      $search = ‘20% raise‘;
      $sql = "SELECT id FROM table WHERE column LIKE ‘%" .
    $this->db->escape_like_str($search)."%‘ ESCAPE ‘!‘";


        *转义这里有一点需要get下,$this->db->escape()在使用这个函数之后,变量会自动在两侧加上单引号‘‘,同时也会在里面进行自动的过滤

        *比如会把abc变成‘abc‘ , 也会把a‘bc变成‘a\‘bc‘的,所以在写进where的sql自定义字符串中时,就不要再加单引号了,那样就会有两个单引号在变量外边(‘‘abc‘‘)

 


推荐阅读
  • MyBatis多表查询与动态SQL使用
    本文介绍了MyBatis多表查询与动态SQL的使用方法,包括一对一查询和一对多查询。同时还介绍了动态SQL的使用,包括if标签、trim标签、where标签、set标签和foreach标签的用法。文章还提供了相关的配置信息和示例代码。 ... [详细]
  • Python SQLAlchemy库的使用方法详解
    本文详细介绍了Python中使用SQLAlchemy库的方法。首先对SQLAlchemy进行了简介,包括其定义、适用的数据库类型等。然后讨论了SQLAlchemy提供的两种主要使用模式,即SQL表达式语言和ORM。针对不同的需求,给出了选择哪种模式的建议。最后,介绍了连接数据库的方法,包括创建SQLAlchemy引擎和执行SQL语句的接口。 ... [详细]
  • WhenIusepythontoapplythepymysqlmoduletoaddafieldtoatableinthemysqldatabase,itdo ... [详细]
  • PDO MySQL
    PDOMySQL如果文章有成千上万篇,该怎样保存?数据保存有多种方式,比如单机文件、单机数据库(SQLite)、网络数据库(MySQL、MariaDB)等等。根据项目来选择,做We ... [详细]
  • 本文主要复习了数据库的一些知识点,包括环境变量设置、表之间的引用关系等。同时介绍了一些常用的数据库命令及其使用方法,如创建数据库、查看已存在的数据库、切换数据库、创建表等操作。通过本文的学习,可以加深对数据库的理解和应用能力。 ... [详细]
  • 在Oracle11g以前版本中的的DataGuard物理备用数据库,可以以只读的方式打开数据库,但此时MediaRecovery利用日志进行数据同步的过 ... [详细]
  • MySQL中的MVVC多版本并发控制机制的应用及实现
    本文介绍了MySQL中MVCC的应用及实现机制。MVCC是一种提高并发性能的技术,通过对事务内读取的内存进行处理,避免写操作堵塞读操作的并发问题。与其他数据库系统的MVCC实现机制不尽相同,MySQL的MVCC是在undolog中实现的。通过undolog可以找回数据的历史版本,提供给用户读取或在回滚时覆盖数据页上的数据。MySQL的大多数事务型存储引擎都实现了MVCC,但各自的实现机制有所不同。 ... [详细]
  • 合并列值-合并为一列问题需求:createtabletab(Aint,Bint,Cint)inserttabselect1,2,3unionallsel ... [详细]
  • 本文介绍了在使用Laravel和sqlsrv连接到SQL Server 2016时,如何在插入查询中使用输出子句,并返回所需的值。同时讨论了使用CreatedOn字段返回最近创建的行的解决方法以及使用Eloquent模型创建后,值正确插入数据库但没有返回uniqueidentifier字段的问题。最后给出了一个示例代码。 ... [详细]
  • MySQL插入数据的四种方式及安全性分析
    本文介绍了MySQL插入数据的四种方式:插入完整的行、插入行的一部分、插入多行和插入查询结果,并对其安全性进行了分析。在插入行时,应注意字段的定义和赋值,以提高安全性。同时指出了使用insert语句的不安全性,应尽量避免使用。建议在表中定义相关字段,并根据定义的字段赋予相应的值,以增加插入操作的安全性。 ... [详细]
  • 上图是InnoDB存储引擎的结构。1、缓冲池InnoDB存储引擎是基于磁盘存储的,并将其中的记录按照页的方式进行管理。因此可以看作是基于磁盘的数据库系统。在数据库系统中,由于CPU速度 ... [详细]
  • 本文详细介绍了SQL日志收缩的方法,包括截断日志和删除不需要的旧日志记录。通过备份日志和使用DBCC SHRINKFILE命令可以实现日志的收缩。同时,还介绍了截断日志的原理和注意事项,包括不能截断事务日志的活动部分和MinLSN的确定方法。通过本文的方法,可以有效减小逻辑日志的大小,提高数据库的性能。 ... [详细]
  • 本文介绍了在开发Android新闻App时,搭建本地服务器的步骤。通过使用XAMPP软件,可以一键式搭建起开发环境,包括Apache、MySQL、PHP、PERL。在本地服务器上新建数据库和表,并设置相应的属性。最后,给出了创建new表的SQL语句。这个教程适合初学者参考。 ... [详细]
  • 本文由编程笔记小编整理,介绍了PHP中的MySQL函数库及其常用函数,包括mysql_connect、mysql_error、mysql_select_db、mysql_query、mysql_affected_row、mysql_close等。希望对读者有一定的参考价值。 ... [详细]
  • ALTERTABLE通过更改、添加、除去列和约束,或者通过启用或禁用约束和触发器来更改表的定义。语法ALTERTABLEtable{[ALTERCOLUMNcolu ... [详细]
author-avatar
asd54w464wq_212
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有