晚上下班回家翻阅到某老师的一篇《有关sql注入》仔细品位,稍有自己的一点想法,就此写出来给大家分享。
那么,文章中老师已经说得很清楚了,类型的转换是非常重要的。其实替换、过滤不安全的字符并不是最好的办法,我的系统一贯保持能让大家输入的内容原本呈现的原则,但是我的网站基本上很少出现安全问题。我就和大家分享下我的做法,希望各位多多指导。
我只坚持一条规则:对所有提交进来的数据都进行数据转换。在获取客户端发送的所有类型的数据的同时对数据进行转换,我相信有特定类型的数据是比较容易转换的,而相对的字符串要麻烦一些。例如数字型和日期型的数据,我们在获取客户端数据时完全可以编写个专门获取这种类型数据的方法来进行处理。例如获取数字的方法可以是 RequestInt(string key),而日期型可以是 RequestDate(string key)。
用 ASP.net 为例,举例以上两个方法(均为 POST 方式,GET 方式类似):
public int RequestInt(string key)
{
string val = HttpContext.Current.Request.Form[key];
int result = int.TryParse(val.ToString(), out result) ? result : 0;
return result;
}
public DateTime RequestDate(string key)
{
string val = HttpContext.Current.Request.Form[key];
DateTime result = DateTime.TryParse(val.ToString(), out result) ? result : DateTime.Now;
return result;
}
至于处理习惯,这个要看个人了。我的习惯是在处理途中如果有不合法的数据,则返回默认值,我认为这样可以获得一举两得的效果:用户输入正确,获取用户数据;如果输入错误,则获取该类型默认值。至于字符串,我是根据各个数据库对字符串的理解来处理的,也就是说,数据库的执行中,字符串对于 SQL 语句来说哪一部分算是正常的字符串值的理解来进行。这个就不详细透露了,处理方式类似以上的方法。
能使用 SQL 参数的语言,如 ASP.net,建议使用参数传值,这个在老师的文中也有介绍,就不多说了。
然後我在想如果轉換的時候丟失了源數據的一部份那要怎麼辦呢?比如說1.2變成了1.
那那個0.2怎麼辦?回复2010-1-26 16:47:59
为什么不增加一个专门获取浮点数的 RequestFloat 函数呢?呵呵。