Sql注入.
简介.
我们很容易从网上查找到sql注入的定义: 就是通过把SQL命令插入到Web表单递交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令,很容易遭到SQL注入式攻击.
用户可以提交一段数据库的查代码,根据程序返回结果,获得一些敏感的信息或是控制整个服务器.sql注入就发生了.
当然我们要魔高一尺,道高一丈.
防止sql注入:
永远不要信任用户的输入,对用户的输入进行校验,可以通过正则表达式,或限制长度;对单引号和双 - - (在数据库中认为是数据库语句的连接)进行转换等.
永远不要动态拼接sql,可以使用参数化的sql或者直接使用存储过程来进行数据查询存取.
永远不要使用管理员权限的数据库的连接,为每个应用使用单独的权限书库连接.
不要把机密的信息直接存放,加密.
应用的异常信息应该处仅少量的提示,最好使用自定义的错误信息对原始的错误进行封装.
采用软件和有效的网站平台来检测sql注入.
实例.(用参数化的sql进行插入来防止Sql注入)
向数据库的新闻类别表(category)通过字符串拼接的方法插入一条语句。
插入函数的代码.
public bool Insert(string caName)
{
//标记位,并且赋初值.
bool flag = false;
string sql = "insert into category(name) values('" + caName + "')";
flag = sqlhelper.ExecuteNonQuery(sql);
return flag;
}
我们在调试中可以看到传入数据库中的sql语句。
Ctrl+F5我们不调试直接执行,或是我们把此sql语句复制在查询分析器中执行。界面中我们可以看到。
在增加一行的基础同时我们id为3的记录消失了,被删除了。
让我们对插入数据库的插入代码修改,用参数传递来代替数据库字符串的拼接。
在SQLHelper加上个ExecuteQuery(string sql ,sqlParam[] paras)的重载.
/// <summary>
///该方法是通过参数传递来执行相应的sql语句.
/// </summary>
/// <param name="sql"></param>
/// <param name="paras"></param>
/// <returns></returns>
public bool ExecuteNonquery(string sql, SqlParameter[] paras)
{
bool flag=false ;
using (cmd = new SqlCommand(sql, GetConn()))
{
//添加参数.
cmd.Parameters .Add (paras );
if (cmd.ExecuteNonQuery()>0)
{
flag =true;
}
}
return flag;
}
/// <summary>
/// 增加新闻类别功能方法.
/// </summary>
/// <param name="caName">新闻类别字符串测试一下</param>
/// <returns></returns>
public bool Insert(string caName)
{
//标记位,并且赋初值.
bool flag = false;
string sql = "insert into category(name) values(@caName)";
SqlParameter[] paras = new SqlParameter[] { new SqlParameter("@caName", caName) };
flag = sqlhelper.ExecuteNonQuery(sql);
return flag;
}
这次我们再进行插入,结果如下.