什么是sql注入?
我理解的sql注入就是一些人可以通过恶意的参数输入,让后台执行这段SQL,然后达到获取数据或者破坏数据库的目的!
举个简单的查询例子,后台sql是拼接的:select * from Test where name='+参数传递+';前台页面要求输入name,那么黑客可以输入: ';DROP TABLE Test;-- 不要小瞧这一段SQL代码:
select * from Test where name=' ';DROP TABLE Test;--';在SQL中是正确的,可执行的,但是执行后整个Test表都删除了,网站崩溃!
最好的解决方法
最好的办法就是不写拼接SQL,改用参数化SQL,推荐新项目使用。这里不做介绍,感兴趣的朋友可以自行搜索一下,本文介绍的方法适合老项目,就是没有使用参数化SQL开发的程序。
使用过滤函数来过滤
NetShop软件特点介绍: 1、使用ASP.Net(c#)2.0、多层结构开发 2、前台设计不采用任何.NET内置控件读取数据,完全标签化模板处理,加快读取速度3、安全的数据添加删除读取操作,利用存储过程模式彻底防制SQL注入式攻击4、前台架构DIV+CSS兼容IE6,IE7,FF等,有利于搜索引挚收录5、后台内置强大的功能,整合多家网店系统的功能,加以优化。6、支持三种类型的数据库:Acces
0
将SQL一些危险的关键字,还有注释百分号以及分号这些根本在我们正常写代码的时候根本不会出现的字符都过滤掉,这样能最大限度的保证SQL执行是安全的,代码如下:
public class SqlFilter
{
public static void Filter()
{
string fileter_sql = "execute,exec,select,insert,update,delete,create,drop,alter,exists,table,sysobjects,truncate,union,and,order,xor,or,mid,cast,where,asc,desc,xp_cmdshell,join,declare,nvarchar,varchar,char,sp_oacreate,wscript.shell,xp_regwrite,',%,;,--";
try
{
// -----------------------防 Post 注入-----------------------
if (HttpContext.Current.Request.Form != null)
{
PropertyInfo isreadonly = typeof(System.Collections.Specialized.NameValueCollection).GetProperty("IsReadOnly", BindingFlags.Instance | BindingFlags.NonPublic);
//把 Form 属性改为可读写
isreadonly.SetValue(HttpContext.Current.Request.Form, false, null);
for (int k = 0; k < System.Web.HttpContext.Current.Request.Form.Count; k++)
{
string getsqlkey = HttpContext.Current.Request.Form.Keys[k];
string sqlstr = HttpContext.Current.Request.Form[getsqlkey];
string[] replace_sqls = fileter_sql.Split(',');
foreach (string replace_sql in replace_sqls)
{
sqlstr = Regex.Replace(sqlstr, replace_sql, "", RegexOptions.IgnoreCase);
}
HttpContext.Current.Request.Form[getsqlkey] = sqlstr;
}
}
// -----------------------防 GET 注入-----------------------
if (HttpContext.Current.Request.QueryString != null)
{
PropertyInfo isreadonly = typeof(System.Collections.Specialized.NameValueCollection).GetProperty("IsReadOnly", BindingFlags.Instance | BindingFlags.NonPublic);
//把 QueryString 属性改为可读写
isreadonly.SetValue(HttpContext.Current.Request.QueryString, false, null);
for (int k = 0; k < System.Web.HttpContext.Current.Request.QueryString.Count; k++)
{
string getsqlkey = HttpContext.Current.Request.QueryString.Keys[k];
string sqlstr = HttpContext.Current.Request.QueryString[getsqlkey];
string[] replace_sqls = fileter_sql.Split(',');
foreach (string replace_sql in replace_sqls)
{
sqlstr = Regex.Replace(sqlstr, replace_sql, "", RegexOptions.IgnoreCase);
}
HttpContext.Current.Request.QueryString[getsqlkey] = sqlstr;
}
}
// -----------------------防 Cookies 注入-----------------------
if (HttpContext.Current.Request.Cookies != null)
{
PropertyInfo isreadonly = typeof(System.Collections.Specialized.NameValueCollection).GetProperty("IsReadOnly", BindingFlags.Instance | BindingFlags.NonPublic);
//把 Cookies 属性改为可读写
isreadonly.SetValue(HttpContext.Current.Request.Cookies, false, null);
for (int k = 0; k < System.Web.HttpContext.Current.Request.Cookies.Count; k++)
{
string getsqlkey = HttpContext.Current.Request.Cookies.Keys[k];
string sqlstr = HttpContext.Current.Request.Cookies[getsqlkey].Value;
string[] replace_sqls = fileter_sql.Split(',');
foreach (string replace_sql in replace_sqls)
{
sqlstr = Regex.Replace(sqlstr, replace_sql, "", RegexOptions.IgnoreCase);
}
HttpContext.Current.Request.Cookies[getsqlkey].Value = sqlstr;
}
}
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
}
}更多ASP.NET过滤类SqlFilter,防止SQL注入 相关文章请关注PHP中文网!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
C++高性能并发应用_C++如何开发性能关键应用
Java AI集成Deep Java Library_Java怎么集成AI模型部署
Golang后端API开发_Golang如何高效开发后端和API
Python异步并发改进_Python异步编程有哪些新改进
C++系统编程内存管理_C++系统编程怎么与Rust竞争内存安全
Java GraalVM原生镜像构建_Java怎么用GraalVM构建高效原生镜像
Python FastAPI异步API开发_Python怎么用FastAPI构建异步API
C++现代C++20/23/26特性_现代C++有哪些新标准特性如modules和coroutines
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号