又见sql注入
提到sql注入,绝大多数程序员多不陌生,但是,很少有人会想到,微软在asp.net的默认配置中,已经对敏感字符做了初步过滤。 前天学校使用考试系统进行vb考试,其中某些学生抽到的填空题的答案中包含有:a<b这种格式,之前在测试的时候,只是随便的输入了一些答案,没有发现问题,可是在学生交卷的时候就出现了下面的界面:当时出现这个问题后,让学生进行了二次登陆,然后再提交,这样交卷的问题就临时解决了。考试完毕后查看了一下出现问题的考生,发现在二次登陆的时候,系统自动将a<b的答案清除了。也就是说,在微软默认的情况下,它会自动清除敏感字符。 但是这个问题怎么解决呢?
分析问题的原因是微软默认的配置中,安全系数比较高,针对a<b这样包含有<的表单内容,会自动发出警报。但是正确的答案就是包含有这些字符,怎么办呢?
可以降低安全级别,让这样的输入通过验证。具体做法如下:
1、修改web.config中httpRuntime配置节属性,在其后添加requestValidationMode="2.0"
<span style="font-size:18px;"><httpRuntime executionTimeout="3600" maxRequestLength="1048576" requestValidationMode="2.0" /></span>
<span style="font-size:18px;"><httpRuntime executionTimeout="3600" maxRequestLength="1048576" requestValidationMode="2.0" /></span>
2、在pages配置节中添加validateRequest="false"属性。 (针对所有的页面生效)
<span style="font-size:18px;"> <pages controlRenderingCompatibilityVersion="3.5" clientIDMode="AutoID" validateRequest="false"/></span>
<span style="font-size:18px;"> <pages controlRenderingCompatibilityVersion="3.5" clientIDMode="AutoID" validateRequest="false"/></span>
3、在相应的asp.net页面的源中添加ValidateRequest="false" (针对某个页面生效)
<span style="font-size:18px;"><%@ Page Language="C#" AutoEventWireup="true" CodeBehind="ExatManOnLineExam.aspx.cs"
Inherits="tgb.CollegeSystem.ExamOnline.ExaminationSystem.ExatManOnLineExam" ValidateRequest="false" %></span>
<span style="font-size:18px;"><%@ Page Language="C#" AutoEventWireup="true" CodeBehind="ExatManOnLineExam.aspx.cs"
Inherits="tgb.CollegeSystem.ExamOnline.ExaminationSystem.ExatManOnLineExam" ValidateRequest="false" %></span>
问题是解决了,但是通过这个问题,再一次拓宽了我们的思路。Sql注入,程序员必须学会的一招。可是在出现问题前,或者说在设计程序之初,很少会意识到编译器已经有了初步的过滤。
另外,我总结了一些防止sql注入的方法,贴出来,供大家分享。
1、 使用参数化查询
我们都知道要尽量避免字符串的拼接,但是很多人不明白为什么参数化查询就可以避免这个问题?
这是因为使用参数化查询,编译器会自动过滤掉一些敏感字符。比如如果拼接字符串时用到的是一个英文单引号,但是经过参数化查询后就会转变成一个中文状态下的,单纯的字符,不会与前面的字符构成一个不完整的sql语句。
2、 使用parameter集合
其实是用集合参数的有点与参数化查询类似,通过集合参数对象可以自动过滤出一些敏感字符。也就是说微软已经替我们考虑到了这一点,我们并不需要知道太多的原理,只是尽可能的是用微软推荐的做法就行。
3、 使用存储过程
现在一些公司统一采用存储过程,这样不仅可以避免一些sql注入,还可以提高性能。但是这样做的一个弊端是,维护人员的需要对后台数据库熟悉。
4、 用户输入过滤
最简单的过滤是合法性的输入,如果一些正常的输入根本用不到特殊的字符,那么干脆我们就将用户的输入限定在最小的输入范围内或者将特殊的字符过滤。
<span style="font-size:18px;">public static string ConvertSql(string str)
{
#region
str = str.Trim();
str = str.Replace("'", "''");
str = str.Replace(";--", "");
str = str.Replace("=", "");
str = str.Replace(" or ", "");
str = str.Replace(" and ", "");
return str;
#endregion
}</span>
<span style="font-size:18px;">public static string ConvertSql(string str)
{
#region
str = str.Trim();
str = str.Replace("'", "''");
str = str.Replace(";--", "");
str = str.Replace("=", "");
str = str.Replace(" or ", "");
str = str.Replace(" and ", "");
return str;
#endregion
}</span>
www.zzzyk.com
在很多情况下,我们无法避免用户对一些特殊字符的输入。这时候就需要我们用程序针对用户输入做详细验证。
<span style="font-size:18px;"> </span><span style="font-size:18px;">public static string CleanString(string inputString)
{
StringBuilder retVal = new StringBuilder();
if ((inputString != null) && (inputString != String.Empty))
{
inputString = inputString.Trim();
for (int i = 0; i < inputString.Length; i++)
{
switch (inputString[i])
{
case '"
补充:综合编程 , 安全编程 ,