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.一般不要把整个语句传入,来获取数据,最好是只传参数.
2.代码要保密,人家知道了代码,也就知道了弱点在哪里.
3.采用过滤的方法,检查出用户输入的内容里的SQL命令,作相应的限制.
4.用字符实体替代用户输入内容里的敏感符号如单引号,使它在SQL里失效,但网页上看上去仍为字符.
5.能加密的,要加密.
6.建议去下载"动网论坛",研究它的代码,它里面有专门的过滤函数,用于防止SQL注入.
字符串是万能类型,将所有参数都变成字符串来存。对于不是 exec 这种动态执行的sql语句应该是 完美的防止。
但是却不支持 exec 这种动态执行sql。
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条,请问这个是什么地方没有稿好???
其次:就像楼上兄弟说的“但貌似也阻止了很多参数的传递了吧”。如果是用编程语言进行数据库操作,且该语言支持输入参数,那么就采用输入参数吧。没必要担心“如果语言本身有漏洞”如何如何的。对于那些从网站上,这里抄抄那里拷拷的二把刀就更应该小心了。说到这里,我想到了N年前关于“加密”的往事:很多人自己写一些所谓的加密方法(对某些算法一知半解的就牛XX的写代码实现),自己为如何如何的安全,其实在真正的安全专家和黑客眼中那是千疮百孔。其实“输入参数”的安全性也并非人们所鼓吹的那样,这还要取决于如何使用(通常情况下构造出的增删改查语句,直接交给command对象执行是没问题的)。比如蛋疼的写了这样的应用就不好讲了CREATE PROC Test ( @iSqlPre NVARCHAR(MAX) )
AS
BEGIN
EXEC (@iSqlPre + ' from xxx') ;
END
string strSql = "insert into tab_name(name,age) values(@name,@age)";