防SQL注入:生成参数化的通用分页查询语句

SQL语句的拼接,SQL语句拼凑

 1 StringBuilder sql = new StringBuilder("SELECT * FROM t_customer WHERE 1=1");
 2             /*
 3              * 2. 判断条件,完成向sql中追加where子句
 4              */
 5             /*
 6              * 3. 创建一个ArrayList,用来装载参数值
 7              */
 8             List<Object> params = new ArrayList<Object>();
 9             String cname = criteria.getCname();
10             if(cname != null && !cname.trim().isEmpty()) {
11                 sql.append(" and cname like ?");
12                 params.add("%" + cname + "%");
13             }
14 
15             String gender = criteria.getGender();
16             if(gender != null && !gender.trim().isEmpty()) {
17                 sql.append(" and gender=?");
18                 params.add(gender);
19             }
20 
21             String cellphone = criteria.getCellphone();
22             if(cellphone != null && !cellphone.trim().isEmpty()) {
23                 sql.append(" and cellphone like ?");
24                 params.add("%" + cellphone + "%");
25             }
26 
27             String email = criteria.getEmail();
28             if(email != null && !email.trim().isEmpty()) {
29                 sql.append(" and email like ?");
30                 params.add("%" + email + "%");
31             }

 

1 StringBuilder sql =
new StringBuilder(“SELECT * FROM t_customer WHERE 1=1” ); 2 /* 3 *

  1. 看清标准,完结向sql中加进where子句 4 *…

参照链接:

http://www.cnblogs.com/yubinfeng/archive/2010/11/02/1867386.html
http://www.w3school.com.cn/sql/sql\_intro.asp
http://wiki.jikexueyuan.com/project/sql/databases.html

  SQL语句

    
前一个月看了玉开兄的“如此高效通用的分页存款和储蓄进度是包含sql注入漏洞的”这篇文章,才幡然想起有个别项目也是使用了累似的通用分页存款和储蓄进程。使用这种通用的存放进度进展分页查询,想要防SQL注入,只可以对输入的参数进行过滤,譬喻将一个单引号“’”调换到三个单引号“””,但这种做法是不安全的,厉害的红客能够透过编码的章程绕过单引号的过滤,要想有效防SQL注入,唯有参数化查询才是终极的缓和方案。但难题就出在这种通用分页存款和储蓄进度是在存款和储蓄进程里面进行SQL语句拼接,根本无法修改为参数化的询问语句,由此这种通用分页存款和储蓄进程是不可取的。不过若是不用通用的分页存款和储蓄进程,则表示必须为各种具体的分页查询写一个分页存款和储蓄进程,那会大增比较多的专业量。

    一、SQL中非常重要的口舌

  • CREATE DATABASE – 创制新数据库
  • ALTERAV4 DATABASE – 修改数据库
  • CREATE TABLE – 创设新表
  • 澳门新萄京,ALTE宝马7系 TABLE – 改变(改动)数据库表
  • DROP TABLE – 删除表
  • CREATE INDEX – 创立索引(寻觅键)
  • DROP INDEX – 删除索引

  sql语句是用来与数据库实行交换的言语;sql不区分轻重缓急写,sql的显要字不区分轻重缓急写;然而sql中的字符串照旧分别轻重缓急写的。

     
经过几天的年月思考未来,想到了一个用代码来扭转参数化的通用分页查询语句的缓和方案。代码如下:

   二、SQL语句的表征正是以重要字早先,上面是常用的SQL语句中的关键字的意思

  • SELECT – 从数据库表中获取数据
  • UPDATE – 更新数据库表中的多少
  • DELETE – 从数据库表中删除数据
  • INSERT INTO – 向数据库表中插入数据

  在查询深入分析器中推行SQL语句:若是大家选中了一条sql语句,点击“执行”的话,就能够进行那条sql语句。不选中哪一条sql语句的话,会推行全部的sql语句。

澳门新萄京 1澳门新萄京 2Code
    public class PagerQuery
    {
        private int _pageIndex;
        private int _pageSize = 20;
        private string _pk;
        private string _fromClause;
        private string _groupClause;
        private string _selectClause;
        private string _sortClause;
        private StringBuilder _whereClause;
        public DateTime DateFilter = DateTime.MinValue;

三、SQL语句语法(注意:SQL语句不区分轻重缓急写,可是一般为了标准一些尽量的把语句都写成统一的风骨,要么都大写、要么都小写)

1、CREATE
(1)、语法

INSERT INTO 表名称 VALUES (值1, 值2,....)

(2)、能够钦点索要插入数据的列

INSERT INTO table_name (列1, 列2,...) VALUES (值1, 值2,....)

2、UPDATE
语法

UPDATE 表名称 SET 列名称 = 新值 WHERE 列名称 = 某值

3、DELETE
(1) 、 语法

DELETE FROM 表名称 WHERE 列名称 = 值

(2)、删除全体行

DELETE FROM table_name

4、SELECT
(1)、语法

SELECT 列名称 FROM 表名称

 

        protected QueryBase()
        {
            _whereClause = new StringBuilder();
        }

1. insert  向数据库中添扩张少

        /**//// <summary>
        /// 主键
        /// </summary>
        public string PK
        {
            get { return _pk; }
            set { _pk = value; }
        }

  insert into T1(name,age)
values(‘aaa’,30)  value中的顺序要和表名后的次第一致。

        public string SelectClause
        {
            get { return _selectClause; }
            set { _selectClause = value; }
        }

2.
delete  向数据库中剔除数据

        public string FromClause
        {
            get { return _fromClause; }
            set { _fromClause = value; }
        }

  delete from T1 where
Name=’yjk’  从T1表中除去Name字段等于yjk的数据

        public StringBuilder WhereClause
        {
            get { return _whereClause; }
            set { _whereClause = value; }
        }

   delete from T1  删除全体数据

        public string GroupClause
        {
            get { return _groupClause; }
            set { _groupClause = value; }
        }

3.
update  向数据库中更新数据
  

        public string SortClause
        {
            get { return _sortClause; }
            set { _sortClause = value; }
        }

  update T1 set Age=Age+1

        /**//// <summary>
        /// 当前页数
        /// </summary>
        public int PageIndex
        {
            get { return _pageIndex; }
            set { _pageIndex = value; }
        }

   update T2 set Height=180 where
AiHao=’散步’

        /**//// <summary>
        /// 分页大小
        /// </summary>
        public int PageSize
        {
            get { return _pageSize; }
            set { _pageSize = value; }
        }

4.
select  在向数据库中询问数据

        /**//// <summary>
        /// 生成缓存Key
        /// </summary>
        /// <returns></returns>
        public override string GetCacheKey()
        {
            const string keyFormat = “Pager-SC:{0}-FC:{1}-WC:{2}-GC:{3}-SC:{4}”;
            return string.Format(keyFormat, SelectClause, FromClause, WhereClause, GroupClause, SortClause);
        }

  select
* from T3

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图