public static string FormatDBParam(object param)
        {
            if (param is int || param is Int16 || param is Int64)
                return param.ToString();
            if (param is bool)
                return ((bool)param? 1 : 0).ToString() ;
            if (param is DateTime && param!=null)
                return "'"+((DateTime)param).ToString("yyyy-MM-dd HH:mm:ss.fff")+"'";            return (param == null ? "null" : "'" + param.ToString().Replace("'", "''") + "'");
        }过程大概是这样。
是整型 就 先返回整型;是布尔型就返回 1 或者 0;是时间类型 就返回相应的时间字符串。
return (param == null ? "null" : "'" + param.ToString().Replace("'", "''") + "'");
我要讨论的是这句。 当传递的参数里 ' 都 替换为 '',然后前后再加上 ',这种目的就是为了让 系统知道 是一个字符串。
而我的sql语句是:传入的参数:'select * from OUUserInfo-- 
select * from OUUserInfo
where UserID = '''select * from OUUserInfo--'
好像的确起到过滤的作用。
请问,上面那个方法是不是起到防止注入的 可能

解决方案 »

  1.   

    如果是 exec 这种情况 应该是直接就报错的吧。。
      

  2.   

    防SQL注入不是你这样弄法的.
    你的语句并没什么,但关键是如何防止用户输入的东西成为一条新的语句.
    1.一般不要把整个语句传入,来获取数据,最好是只传参数.
    2.代码要保密,人家知道了代码,也就知道了弱点在哪里.
    3.采用过滤的方法,检查出用户输入的内容里的SQL命令,作相应的限制.
    4.用字符实体替代用户输入内容里的敏感符号如单引号,使它在SQL里失效,但网页上看上去仍为字符.
    5.能加密的,要加密.
    6.建议去下载"动网论坛",研究它的代码,它里面有专门的过滤函数,用于防止SQL注入.
      

  3.   

    那可以说说我的做法 是哪里出问题啦?
    字符串是万能类型,将所有参数都变成字符串来存。对于不是 exec 这种动态执行的sql语句应该是 完美的防止。
    但是却不支持 exec 这种动态执行sql。
      

  4.   

    DAL.Game game1 = new DAL.Game();
                PagedDataSource ps = new PagedDataSource();            ps.DataSource = game1.GameListByClassId(ClassId).Tables[0].DefaultView;
                ps.AllowPaging = true;
                ps.CurrentPageIndex = Convert.ToInt16(Page);
                ps.PageSize = 54;
    //现在分页的功能是OK的,,主要问题是,当记录数小于54时,,,页面显示的数据就只有几条,如,数据应该为: 50条的话,应该一下子显示50条,结果确只有3条,请问这个是什么地方没有稿好???
      

  5.   

    首先:SQL注入不仅仅是你看到的这种最简单的直接构造注入,还有好多种。
    其次:就像楼上兄弟说的“但貌似也阻止了很多参数的传递了吧”。如果是用编程语言进行数据库操作,且该语言支持输入参数,那么就采用输入参数吧。没必要担心“如果语言本身有漏洞”如何如何的。对于那些从网站上,这里抄抄那里拷拷的二把刀就更应该小心了。说到这里,我想到了N年前关于“加密”的往事:很多人自己写一些所谓的加密方法(对某些算法一知半解的就牛XX的写代码实现),自己为如何如何的安全,其实在真正的安全专家和黑客眼中那是千疮百孔。其实“输入参数”的安全性也并非人们所鼓吹的那样,这还要取决于如何使用(通常情况下构造出的增删改查语句,直接交给command对象执行是没问题的)。比如蛋疼的写了这样的应用就不好讲了CREATE PROC Test ( @iSqlPre NVARCHAR(MAX) )
    AS 
        BEGIN
            EXEC (@iSqlPre + ' from xxx') ;
        END
      

  6.   

    应该说web没有绝对的安全吧!!!一般“参数化”sql语句就可以了
      

  7.   


    string strSql = "insert into tab_name(name,age) values(@name,@age)";
      

  8.   

    在global.asax文件里 begin_request事件把url用正则过滤