关于网站SQL注入的问题,以及解决办法
2009-11-02 14:39
579 查看
最近发现我们公司的ASP.NET的代码有拼接SQL语句的习惯!这是非常危险的。以下我举例说明一下
例子1:
statement := "SELECT * FROM users WHERE name = '" + userName + "'; "
将用户名变量(即username)设置为:
a' or 't'='t,此时原始语句发生了变化:
SELECT * FROM users WHERE name = 'a' OR 't'='t';
如果这种代码被用于一个认证过程,那么这个例子就能够强迫选择一个合法的用户名,因为赋值't'='t永远是正确的。
例子2:
a'; DROP TABLE users; SELECT * FROM data WHERE name LIKE '%
这就将最终的SQL语句变成下面这个样子:
SELECT * FROM users WHERE name = 'a'; DROP TABLE users; SELECT * FROM DATA WHERE name LIKE '%';
将会造成数据库表被删除的严重后果。
所以强烈建议大家停止SQL语句拼接(特别是网站应用),采用带参数化存储过程。
对于已经完成的ASP.NET网站应用,设计修改代码太多的,可以考虑加入如下代码处理一下,避免被严重注入攻击。可以通过在Global.asax.cs文件中添加过滤关键字的方法来实现 防止 sql 注入攻击(sql injection),代码如下。
/// <summary>
/// 当有数据时交时,触发事件
/// </summary>
/// <param name="sender"> </param>
/// <param name="e"> </param>
protected void Application_BeginRequest(Object sender, EventArgs e)
{
//遍历Post参数,隐藏域除外
foreach (string i in this.Request.Form)
{
if (i == "__VIEWSTATE") continue;
this.goErr(this.Request.Form.ToString());
}
//遍历Get参数。
foreach (string i in this.Request.QueryString)
{
this.goErr(this.Request.QueryString.ToString());
}
}
///<summary>
///SQL注入过滤
/// </summary>
/// <param name="InText">要过滤的字符串 </param>
/// <returns>如果参数存在不安全字符,则返回true </returns>
public bool SqlFilter(string InText)
{
string word = "and |exec |insert |select |delete |update |chr |mid |master |or |truncate |char |declare |join |cmd | |' |--";//这里加要过滤的SQL字符
if (InText == null)
return false;
foreach (string i in word.Split(' |'))
{
if ((InText.ToLower().IndexOf(i + " ") > -1) | | (InText.ToLower().IndexOf(" " + i) > -1))
{
return true;
}
}
return false;
}
/// <summary>
/// 校验参数是否存在SQL字符
/// </summary>
/// <param name="tm"> </param>
private void goErr(string tm)
{
if (SqlFilter(tm))
{
Response.Write(" <script>window.alert('参数存在不安全字符');"+" </"+"script>");
}
}
例子1:
statement := "SELECT * FROM users WHERE name = '" + userName + "'; "
将用户名变量(即username)设置为:
a' or 't'='t,此时原始语句发生了变化:
SELECT * FROM users WHERE name = 'a' OR 't'='t';
如果这种代码被用于一个认证过程,那么这个例子就能够强迫选择一个合法的用户名,因为赋值't'='t永远是正确的。
例子2:
a'; DROP TABLE users; SELECT * FROM data WHERE name LIKE '%
这就将最终的SQL语句变成下面这个样子:
SELECT * FROM users WHERE name = 'a'; DROP TABLE users; SELECT * FROM DATA WHERE name LIKE '%';
将会造成数据库表被删除的严重后果。
所以强烈建议大家停止SQL语句拼接(特别是网站应用),采用带参数化存储过程。
对于已经完成的ASP.NET网站应用,设计修改代码太多的,可以考虑加入如下代码处理一下,避免被严重注入攻击。可以通过在Global.asax.cs文件中添加过滤关键字的方法来实现 防止 sql 注入攻击(sql injection),代码如下。
/// <summary>
/// 当有数据时交时,触发事件
/// </summary>
/// <param name="sender"> </param>
/// <param name="e"> </param>
protected void Application_BeginRequest(Object sender, EventArgs e)
{
//遍历Post参数,隐藏域除外
foreach (string i in this.Request.Form)
{
if (i == "__VIEWSTATE") continue;
this.goErr(this.Request.Form.ToString());
}
//遍历Get参数。
foreach (string i in this.Request.QueryString)
{
this.goErr(this.Request.QueryString.ToString());
}
}
///<summary>
///SQL注入过滤
/// </summary>
/// <param name="InText">要过滤的字符串 </param>
/// <returns>如果参数存在不安全字符,则返回true </returns>
public bool SqlFilter(string InText)
{
string word = "and |exec |insert |select |delete |update |chr |mid |master |or |truncate |char |declare |join |cmd | |' |--";//这里加要过滤的SQL字符
if (InText == null)
return false;
foreach (string i in word.Split(' |'))
{
if ((InText.ToLower().IndexOf(i + " ") > -1) | | (InText.ToLower().IndexOf(" " + i) > -1))
{
return true;
}
}
return false;
}
/// <summary>
/// 校验参数是否存在SQL字符
/// </summary>
/// <param name="tm"> </param>
private void goErr(string tm)
{
if (SqlFilter(tm))
{
Response.Write(" <script>window.alert('参数存在不安全字符');"+" </"+"script>");
}
}
相关文章推荐
- 关于网站SQL注入的问题,以及解决办法
- 最近网站改版关于IE8兼容的一些问题以及解决办法
- 关于GridValue的刷新,列顺序混乱问题解决以及关于显示和隐藏列的办法
- 在部署MVC4.0网站的过程中遇到的问题以及解决办法
- 关于qt5中“error c2001: 常量中有换行符”以及个别中文字乱码问题的解决办法
- 关于cdh安装过程中的遇见的一些问题以及解决办法的总结
- 关于压缩jar包时提示*.*没有这个文件或目录的问题以及解决办法:
- 关于禁用Cookie的问题以及解决办法
- 关于SQL注入问题-,于解决办法
- 关于通过http请求访问Linux下的ftp的问题以及解决办法
- 关于VS2008 中添加成员变量提示 此网站的某个加载项运行失败 请检查“Internet选项”中的安全设置是否存在潜在冲突 问题解决办法
- 关于今天做项目时遇到的问题 以及解决办法
- 关于plsql导入pde因为字符集设置问题报错,而研究oracle服务器字符集、客户端字符集过程中发现的问题看,以及亲测的解决办法
- 关于问题ld:library not found for -lXXX 和ld:warning:directory not found option 以及duplicate symbol的解决办法
- 个人关于hadoop使用LZO压缩主要步骤以及带来的后续问题和解决办法
- 打开网站php出现乱码问题的解决办法以及无法显示验证码
- 关于VS2008 中添加成员变量提示 此网站的某个加载项运行失败 请检查“Internet选项”中的安全设置是否存在潜在冲突 问题解决办法
- 关于linux下tomcat启动出现cannot find ./catalina.sh以及cannot find setclasspath问题的解决办法
- 关于火车票12306网站出现“此网站的安全证书存在问题”解决办法
- 关于iphone 6 ios8网站背景图片错乱的问题解决办法