SQL预编译防注入小测试

个人对SQL预编译的认识:

1、效率提升,对SQL语句编译一次可多次使用.避免了硬解析和软解析等步骤,当执行的语句上规模的时候性能差异还是很明显的。
2、安全提升,预编译之后的SQL语句,语义不会发生变化,安全性有相当大的提升。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.SqlClient;
using System.Data;

namespace PreSql
{
    class Program
    {
        /*
         * create table test_table
(
a nvarchar(20)
)

insert into test_table(a) values(‘2‘);*/
        const string conStr = @"Password=1qaz!QAZ;Persist Security Info=True;User ID=sa;Initial Catalog=IBatisNet;Data Source=WANGN\CR";
        static void Main(string[] args)
        {

            Console.WriteLine("SqlJoin:");
            SqlJoin();
            Console.WriteLine();
            Console.WriteLine("PreSqlTest");
            PreSqlTest();

            Console.WriteLine("Completed");

            Console.Read();
        }

        static void SqlJoin()
        {
            string sql = "select count(*) from test_table where a=‘{0}‘";
            string tmpSql = string.Format(sql, "1‘ or  ‘1‘=‘1");
            string tmpSql2 = string.Format(sql, "1");

            using (SqlConnection conn = new SqlConnection(conStr))
            {
                if (conn.State != ConnectionState.Open)
                {
                    conn.Open();
                }
                SqlCommand com = new SqlCommand(tmpSql, conn);
                object obj = com.ExecuteScalar();
                Console.WriteLine("SQL注入成功:" + obj.ToString());

                SqlCommand com2 = new SqlCommand(tmpSql2, conn);
                object obj2 = com2.ExecuteNonQuery();
                Console.WriteLine("正常应返回-1:" + obj2);
            }
        }
        static void PreSqlTest()
        {
            string sql = "select count(*) from test_table where [email protected]";
            using (SqlConnection conn = new SqlConnection(conStr))
            {
                if (conn.State != ConnectionState.Open)
                {
                    conn.Open();
                }
                SqlCommand com = new SqlCommand(sql, conn);
                com.Parameters.Add(new SqlParameter
                {
                    DbType = DbType.String,
                    Size = 256,
                    ParameterName = "@id",
                    Value = "1 or 1=1"
                });
                object obj = com.ExecuteScalar();
                Console.WriteLine("SQL注入不成功:" + obj.ToString());

                SqlCommand com2 = new SqlCommand(sql, conn);
                com2.Parameters.Add(new SqlParameter
                {
                    DbType = DbType.String,
                    Size = 256,
                    ParameterName = "@id",
                    Value = "1"
                });
                object obj2 = com2.ExecuteNonQuery();
                Console.WriteLine("正常应返回-1:" + obj2);
            }
        }
    }
}

执行结果:

SqlJoin:
SQL注入成功:1
正常应返回-1:-1

PreSqlTest
SQL注入不成功:0
正常应返回-1:-1
Completed

时间: 2024-08-07 15:47:50

SQL预编译防注入小测试的相关文章

mybatis深入理解之 # 与 $ 区别以及 sql 预编译

mybatis 中使用 sqlMap 进行 sql 查询时,经常需要动态传递参数,例如我们需要根据用户的姓名来筛选用户时,sql 如下: select * from user where name = "ruhua"; 上述 sql 中,我们希望 name 后的参数 "ruhua" 是动态可变的,即不同的时刻根据不同的姓名来查询用户.在 sqlMap 的 xml 文件中使用如下的 sql 可以实现动态传递参数 name: select * from user whe

mybatis深入理解(一)之 # 与 $ 区别以及 sql 预编译

mybatis 中使用 sqlMap 进行 sql 查询时,经常需要动态传递参数,例如我们需要根据用户的姓名来筛选用户时,sql 如下: select * from user where name = "ruhua"; 上述 sql 中,我们希望 name 后的参数 "ruhua" 是动态可变的,即不同的时刻根据不同的姓名来查询用户.在 sqlMap 的 xml 文件中使用如下的 sql 可以实现动态传递参数 name: select * from user whe

从Mybatis中#和$的区别到SQL预编译

#和$的区别 Mybatis中参数传递可以通过#和$设置.它们的区别是什么呢? # Mybatis在解析SQL语句时,sql语句中的参数会被预编译为占位符问号? $ Mybatis在解析SQL语句时,SQL语句中的参数会被当做字符串拼接SQL. 使用#能够防止SQL注入攻击. 那么什么是预编译? 什么是预编译 通常,一条sql在db接收到最终执行完毕返回需要经历三个阶段: 词法和语义解析 优化sql语句,制定执行计划 执行并返回结果 但是如果同样一条SQL,如果只是参数值变了,不需要每次都语法语

mysql注入小测试

转自:http://www.jb51.net/article/46163.htm 在开发网站的时候,出于安全考虑,需要过滤从页面传递过来的字符.通常,用户可以通过以下接口调用数据库的内容:URL地址栏.登陆界面.留言板.搜索框等.这往往给骇客留下了可乘之机.轻则数据遭到泄露,重则服务器被拿下. 一.SQL注入的步骤 a)  寻找注入点(如:登录界面.留言板等) b)  用户自己构造SQL语句(如:' or 1=1#,后面会讲解) c)  将sql语句发送给数据库管理系统(DBMS) d)  DB

关于SQL预编译问题。

标准都是sql.add('insert a (b,c,d)values(:a,:b,:c)');params.parambyname('a').asstring:='';...

Java正则表达式防注入小例子

1 /** 2 * 第一行匹配特殊字符: 3 * 第二行匹配开头和结尾都有空格的: 4 * 第三行匹配结尾有空格的 5 * */ 6 private Boolean DetermineChar(String reqData, String respData) { 7 String reg = "@@|==|--|!|\\!|" 8 + "\\s(union|and|or|where|exec|like|from|trancate|char|substr|ascii|count

mybatis以及预编译如何防止SQL注入

SQL注入是一种代码注入技术,用于攻击数据驱动的应用,恶意的SQL语句被插入到执行的实体字段中(例如,为了转储数据库内容给攻击者).[摘自] SQL injection - Wikipedia SQL注入,大家都不陌生,是一种常见的攻击方式.攻击者在界面的表单信息或URL上输入一些奇怪的SQL片段(例如“or ‘1’=’1’”这样的语句),有可能入侵参数检验不足的应用程序.所以,在我们的应用中需要做一些工作,来防备这样的攻击方式.在一些安全性要求很高的应用中(比如银行软件),经常使用将SQL语句

JavaScript预编译流程详解

1-JavaScript运行三部曲 1.语法分析2.预编译3.解释执行 语法分析很简单,就是引擎检查你的代码有没有什么低级的语法错误: 解释执行顾名思义便是执行代码了: 预编译简单理解就是在内存中开辟一些空间,存放一些变量与函数 : 2-JS预编译什么时候发生 预编译到底什么时候发生? 误以为预编译仅仅发生在script内代码块执行前 这倒并没有错 预编译确确实实在script代码内执行前发生了 但是它大部分会发生在函数执行前 3-实例分析 先来区分理解一下这2个概念: 变量声明 var ...

PHP7预编译mysqli查询操作

//连接数据库 $mysqli = new mysqli("localhost", "root", "root", "mobilemoms"); !$mysqli->connect_error or die("CONNECT SQL ERROR".$mysqli->connect_error); $mysqli->query("set names utf8"); //s