随笔-31  评论-14  文章-0  trackbacks-0

Sql注入.


简介.


我们很容易从网上查找到sql注入的定义: 就是通过把SQL命令插入到Web表单递交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令,很容易遭到SQL注入式攻击.

用户可以提交一段数据库的查代码,根据程序返回结果,获得一些敏感的信息或是控制整个服务器.sql注入就发生了.

当然我们要魔高一尺,道高一丈.


防止sql注入:


  永远不要信任用户的输入,对用户的输入进行校验,可以通过正则表达式,或限制长度;对单引号和双 - - (在数据库中认为是数据库语句的连接)进行转换等.

  永远不要动态拼接sql,可以使用参数化的sql或者直接使用存储过程来进行数据查询存取.

   永远不要使用管理员权限的数据库的连接,为每个应用使用单独的权限书库连接.

  不要把机密的信息直接存放,加密.

  应用的异常信息应该处仅少量的提示,最好使用自定义的错误信息对原始的错误进行封装.

  采用软件和有效的网站平台来检测sql注入.

 


实例.(用参数化的sql进行插入来防止Sql注入)

向数据库的新闻类别表(category)通过字符串拼接的方法插入一条语句。


插入函数的代码.

  1. <span style="font-size:16px;">public bool Insert(string caName)  
  2.         {  
  3.             //标记位,并且赋初值.  
  4.             bool flag = false;  
  5.             string sql = "insert into category(name) values('" + caName + "')";  
  6.             flag = sqlhelper.ExecuteNonQuery(sql);  
  7.    
  8.             return flag;  
  9.         }</span>  


我们的界面:



我们在调试中可以看到传入数据库中的sql语句。


Ctrl+F5我们不调试直接执行,或是我们把此sql语句复制在查询分析器中执行。界面中我们可以看到。

在增加一行的基础同时我们id3的记录消失了,被删除了。


让我们对插入数据库的插入代码修改,用参数传递来代替数据库字符串的拼接。

SQLHelper加上个ExecuteQuery(string sql ,sqlParam[] paras)的重载.

  1. <span style="font-size: 14pt; ">    </span><span style="font-size:16px;">    /// <summary>  
  2.         ///该方法是通过参数传递来执行相应的sql语句.  
  3.         /// </summary>  
  4.         /// <param name="sql"></param>  
  5.         /// <param name="paras"></param>  
  6.         /// <returns></returns>  
  7.         public bool ExecuteNonquery(string sql, SqlParameter[] paras)  
  8.         {  
  9.             bool flag=false ;  
  10.             using (cmd = new SqlCommand(sql, GetConn()))  
  11.             {  
  12.                 //添加参数.  
  13.                 cmd.Parameters .Add (paras );  
  14.                 if (cmd.ExecuteNonQuery()>0)  
  15.                    {  
  16.                        flag =true;  
  17.                    }  
  18.             }  
  19.    
  20.             return flag;  
  21.         }</span><span style="font-size: 14pt;">  
  22. </span>  

  1. <span style="font-size:16px;">/// <summary>  
  2.         /// 增加新闻类别功能方法.  
  3.         /// </summary>  
  4.         /// <param name="caName">新闻类别字符串测试一下</param>  
  5.         /// <returns></returns>  
  6.         public bool Insert(string caName)  
  7.         {  
  8.             //标记位,并且赋初值.  
  9.             bool flag = false;  
  10.             string sql = "insert into category(name) values(@caName)";  
  11.             SqlParameter[] paras = new SqlParameter[] { new SqlParameter("@caName", caName) };  
  12.             flag = sqlhelper.ExecuteNonQuery(sql);  
  13.    
  14.             return flag;  
  15.         }</span><span style="font-size: 14pt;">  
  16. </span>  
这次我们再进行插入,结果如下.



posted on 2012-07-09 23:13 zhanghu198901 阅读(779) 评论(0)  编辑  收藏

只有注册用户登录后才能发表评论。


网站导航: