动易CMS 2007新特性体验之旅——全面提高的安全性(4)_动易Cms教程

编辑Tag赚U币
教程Tag:暂无Tag,欢迎添加,赚取U币!

以下是引用片段:
4、注入漏洞攻击防范:
●使用类型安全的SQL参数化查询方式,从根本上解决SQL注入的问题
●对于不能使用参数化查询的部分(比如in、like语句),使用严格的过滤函数进行过滤
●限定URL的传递参数类型、数量、范围等来防止通过构造URL进行恶意攻击

  在ASP/PHP程序中,查询语句的生成一般是这样的代码方式:

Conn.Execute("SELECT Province FROM PE_Province WHERE Country='" & Country & "' ORDER BY ProvinceID")

  这样的方式,假如一不小心没有对要放入SQL查询语句中的Country变量进行防SQL注入过滤,就有可能产生注入问题。这方面的教程实在太多,大家有爱好可以到网上搜索一下。而由此带来的教训则是非常深刻。动易之前发现的一些注入漏洞问题,都是因为程序员不小心没有过滤有关变量造成的。而纵观网上许多程序,还有许多地方是根本就没有将提交过来的值进行过滤就放入查询语句中。如:
Sql = "SELECT Boardid, Boardtype, Boarduser FROM Board WHERE Boardid = " & Request("boardid")
Set Rs = Execute(Sql)
这样的程序的安全性可想而知。

  动易CMS2007中,所有的查询语句都是类似如下代码:

以下是代码片段:

/// <summary>
/// 更新作者
/// </summary>
/// <param name="authorInfo">作者实体</param>
/// <returns>更新成功返回true,否则返回false</returns>
public bool Update(AuthorInfo authorInfo)
{
Parameters parms = new Parameters();
parms.AddInParameter("@ID", DbType.Int32, authorInfo.Id);
parms.AddInParameter("@UserId", DbType.Int32, authorInfo.UserId);
parms.AddInParameter("@Name", DbType.String, authorInfo.Name);
parms.AddInParameter("@Type", DbType.String, authorInfo.Type);
………………
return DBHelper.ExecuteProc("PE_Accessories_Author_Update", parms);
}

注:这里的代码与实际程序有所区别。

  在这段程序中,我们至少使用了两种安全方式。一是用了存储过程,通过将参数传递给存储过程,杜绝了注入的可能。二是参数类型安全化,使用的参数都是强类型的。如这一行代码:parms.AddInParameter("@ID", DbType.Int32, authorInfo.Id);。限制了传过来的参数必须是整型的,假如从页面中传过来的参数不是整型(注入攻击时),就会直接抛出异常,中断执行。动易CMS2007的所有查询语句,都是采用这种方式。这样基本上就杜绝了SQL注入问题。

查看更多 动易Cms教程  动易Cms模板

来源:模板无忧//所属分类:动易Cms教程/更新时间:2007-08-20
相关动易Cms教程