关于网友提出的“防SQL注入 sql 注入”问题疑问,本网通过在网上对“防SQL注入 sql 注入”有关的相关答案进行了整理,供用户进行参考,详细问题解答如下:
问题:防SQL注入 sql 注入描述:
三、 SQL注入防护
系统在防SQL注入方面,设置了四道安全防护:
第一、 系统级SQL防注入检测,系统会遍历检测所有用GET、POST、COOKIES提交到服务器上的数据,如发现有可能用于构造可注入SQL的异常代码,系统将终止程序运行,并记录日志。这一道安全防护加在连接数据库之前,能在连接数据库前挡处几乎所有的SQL注入和危害网站安全的数据提交。
第二、 程序级安全仿SQL注入系统,在应用程序中,在构建SQL查询语句前,系统将对由外部获取数据,并带入组装为SQL的变量进行安全性合法性验证,过滤可能构成注入的字符。
第三、 禁止外部提交表单,系统禁止从本域名之外的其它域名提交表单,防止从外部跳转传输攻击性代码。
第四、数据库操作使用存储过程 系统所有的重要数据操作,均使用存储过程作参数查询,避免组装SQL字符串,令即使通过了层层SQL注入过滤的攻击性字符仍然无法发挥作用。
我之前的注入判断一般都是直接用一个过滤字符串的方法,但是将很多字符都过滤啦。
internal static string SqlFilter(this string source)
{
if (!string.IsNullOrEmpty(source))
{
source = source.Trim();
//单引号替换成两个单引号
source = source.Replace("'", "''");
source = source.Replace("--", "——");
//半角封号替换为全角封号,防止多语句执行
source = source.Replace(";", ";");
//半角括号替换为全角括号
source = source.Replace("(", "(");
source = source.Replace(")", ")");
///////////////要用正则表达式替换,防止字母大小写得情况////////////////////
//去除执行存储过程的命令关键字
source = source.Replace("Exec", "");
source = source.Replace("Execute", "");
//去除系统存储过程或扩展存储过程关键字
source = source.Replace("xp_", "x p_");
source = source.Replace("sp_", "s p_");
//防止16进制注入
source = source.Replace("0x", "0 x");
}
return source;
}
Execute,Exec都过滤的话就讲不过去了,而且之前将 select ,delete==都过滤的。
第一二步应该是 同样的方法,就是一个放到 Global.asax 一个放到逻辑层而已。
第三四步就是自己写sql操作的注意情况啦。
我想各位说说 防止 sql注入的方法。最好提供一个公用的函数,谢谢
解决方案1:
我也对楼主的结贴率感兴趣 mark
解决方案2:+1
收藏 解决方案3:
楼主的结贴率。。。。。!!!!!!!!
解决方案4:藏起来
解决方案5: 对于 sql 注入,好好像只做了两点:
1:参数化查询
2:自定义错误页面(避免让用户直接看到错误详细信息)
+1 解决方案7:
使用参数化。或存储过程
解决方案8:23的东西不错
解决方案9:解决方案11:
public class SqlCheck
{
public SqlCheck()
{
//
// TODO: 在此处添加构造函数逻辑
//
}
public SqlConnection oconn()
{
SqlConnection conn = new SqlConnection();
conn.ConnectionString = ConfigurationManager.ConnectionStrings["StudyConnectionString"].ToString();
//第1种调用的方法 JK1986_CheckSql();
JK1986_CheckSql();
if ( conn.State == ConnectionState.Closed )
{
conn.Open();
}
return conn;
}
public DataTable getsource(string getds)
{
SqlConnection conn = oconn();
SqlDataAdapter da = new SqlDataAdapter(getds, conn);
DataSet ds = new DataSet();
da.Fill(ds,"news" );
return ds.Tables["news"];
}
public static void JK1986_CheckSql()
{
string jk1986_sql = "exec↓select↓drop↓alter↓exists↓union↓and↓or↓xor↓order↓mid↓asc↓execute↓xp_cmdshell↓insert↓update↓delete↓join↓declare↓char↓sp_oacreate↓wscript.shell↓xp_regwrite↓'↓;↓--";
string[] jk_sql = jk1986_sql.Split('↓');
foreach (string jk in jk_sql)
{
// -----------------------防 Post 注入-----------------------
if ( System.Web.HttpContext.Current.Request.Form != null)
{
for (int k = 0; k < System.Web.HttpContext.Current.Request.Form.Count; k++)
{
string getsqlkey = System.Web.HttpContext.Current.Request.Form.Keys[k];
string getip;
if (System.Web.HttpContext.Current.Request.Form[getsqlkey].ToLower().Contains(jk) == true)
{
System.Web.HttpContext.Current.Response.Write("
希望这个对你有用
解决方案12:++++++++ 解决方案13:
之前我发布贴子,跟楼主类似
防SQL注入,讨论有效方法
web.config中添加
放在Global.asax中
解决方案16:解决方案17:
private bool ProcessSqlStr(string Str)
{
bool ReturnValue = true;
try
{
if (Str != "")
{
string SqlStr = "select*|and'|or'|insertinto|deletefrom|altertable|update|createtable|createview|dropview|createindex|dropindex|createprocedure|dropprocedure|createtrigger|droptrigger|createschema|dropschema|createdomain|alterdomain|dropdomain|);|select@|declare@|print@|char(|select";
string[] anySqlStr = SqlStr.Split('|');
foreach (string ss in anySqlStr)
{
if (Str.IndexOf(ss) >= 0)
{
ReturnValue = false;
}
}
}
}
catch
{
ReturnValue = false;
}
return ReturnValue;
}
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[i].ToString());
//}
////遍历Get参数。
//foreach (string i in this.Request.QueryString)
//{
// this.goErr(this.Request.QueryString[i].ToString());
//}
try
{
string getkeys = "";
string sqlErrorPage = System.Configuration.ConfigurationSettings.AppSettings["customerErrorPage"].ToString();
if (System.Web.HttpContext.Current.Request.QueryString != null)
{
for (int i = 0; i < System.Web.HttpContext.Current.Request.QueryString.Count; i++)
{
getkeys = System.Web.HttpContext.Current.Request.QueryString.Keys[i];
if (!ProcessSqlStr(System.Web.HttpContext.Current.Request.QueryString[getkeys]))
{
System.Web.HttpContext.Current.Response.Redirect(sqlErrorPage + "?errmsg=sqlserver&sqlprocess=true");
System.Web.HttpContext.Current.Response.End();
}
}
}
if (System.Web.HttpContext.Current.Request.Form != null)
{
for (int i = 0; i < System.Web.HttpContext.Current.Request.Form.Count; i++)
{
getkeys = System.Web.HttpContext.Current.Request.Form.Keys[i];
if (!ProcessSqlStr(System.Web.HttpContext.Current.Request.Form[getkeys]))
{
System.Web.HttpContext.Current.Response.Redirect(sqlErrorPage + "?errmsg=sqlserver&sqlprocess=true");
System.Web.HttpContext.Current.Response.End();
}
}
}
}
catch
{
// 错误处理: 处理用户提交信息!
}
}
收藏,,,,,
解决方案18: http://topic.csdn.net/u/20100819/22/61138979-9cc2-47f1-911b-396cda9e828f.html
注入的形式主要有以下几种:
1.通过URL参数(GET方式)
2.通过表单参数(POST方式)
3.通过COOKIE
比较合理的方式应该是验证每一个客户端提交的参数
1.如果程序需要参数A一定是数字的话,那么就检测该参数是否是数字
2.如果程序需要参数A是某个有规律的字符串的话,那么就用正则式去检查
3.如果程序需要参数A是无规律字符串,那么就要考虑一下,这个无规律的字符串一般是用来干什么的?如果这个字符串最终是需要对数据库进行添加或修改操作,那么用存储过程吧。如果是Access数据库用SqlParameter传递你的参数
SQL语句如下:
string sqlString= "insert into mytable ([列1], [列2])values (@val, @val2)";
SqlCommand myCom = new SqlCommand(sqlString, Conn);
myCom.Parameters.Add(new SqlParameter("@val", SqlDbType.VarChar,50));
myCom.Parameters["@val"].Value = "XXX";
myCom.Parameters.Add(new SqlParameter("@val2", SqlDbType.VarChar,50));
myCom.Parameters["@val2"].Value = "XXX";
...
如果是用于查询的,显然,你并不需要用户提交一个长长的字符串(比如让用户输入上千个字符进行查询),那么,你可以考虑截断这个字符串,然后再进行一些字符处理,尽可能的规避风险即可
参数化最简单吧
解决方案20:
create trigger tr_table_insertupdate
on tablename
for insert,update
as
if exists (
select 1 from inserted
where data like '%%'
)
begin
RAISERROR ('不能修改或者添加',16,1);
ROLLBACK TRANSACTION
end
go
创建一个触发器,只要有 就不给插入,不过对性能会有点影响 解决方案21:
SQL注入被那些菜鸟级别的所谓黑客高手玩出了滋味,发现现在大部分黑客入侵都是基于SQL注入实现的,哎,谁让这个入门容易呢,好了,不说废话了,现在我开始说如果编写通用的SQL防注入程序一般的http请求不外乎get 和 post,所以只要我们在文件中过滤所有post或者get请求中的参数信息中非法字符即可,所以我们实现http 请求信息过滤就可以判断是是否受到SQL注入攻击。 IIS传递给asp.dll的get 请求是是以字符串的形式,,当 传递给Request.QueryString数据后,asp解析器会分析Request.QueryString的信息,,然后根据"&",分出各个数组内的数据所以get的拦截如下: 首先我们定义请求中不能包含如下字符:以下为引用的内容:
'|and|exec|insert|select|delete|update|count|*|%|chr|mid|master|truncate|char|declare
各个字符用"|"隔开,,然后我们判断的得到的Request.QueryString,具体代码如下 :以下为引用的内容:
dim sql_injdata
SQL_injdata = "'|and|exec|insert|select|delete|update|count|*|%|chr|mid|master|truncate|char|declare"
SQL_inj = split(SQL_Injdata,"|")
If Request.QueryString<>"" Then
For Each SQL_Get In Request.QueryString
For SQL_Data=0 To Ubound(SQL_inj)
if instr(Request.QueryString(SQL_Get),Sql_Inj(Sql_DATA))>0 Then
Response.Write "<Script Language=****>alert('天下电影联盟SQL通用防注入系统提示↓nn请不要在参数中包含非法字符尝试注入!');history.back(-1)</Script>"
Response.end
end if
next
Next
End If
这样我们就实现了get请求的注入的拦截,但是我们还要过滤post请求,所以我们还得继续考虑request.form,这个也是以数组形式存在的,我们只需要再进一次循环判断即可。代码如下:以下为引用的内容:
If Request.Form<>"" Then
For Each Sql_Post In Request.Form
For SQL_Data=0 To Ubound(SQL_inj)
if instr(Request.Form(Sql_Post),Sql_Inj(Sql_DATA))>0 Then
Response.Write "<Script Language=****>alert('天下电影联盟SQL通用防注入系统提示↓nn请不要在参数中包含非法字符尝试注入!nnHTTP://www.521movie.com ');history.back(-1)</Script>"
Response.end
end if
next
next
end if
好了大功告成!!!
我这里有一份软件代码安全编写指南,如果你需要可以把邮箱给我 我给你发一份。
解决方案23: 一个传统的防止 SQL 注入攻击的方法是针对输入进行验证,要么只接受白名单
中的安全字符,要么鉴别和排除黑名单中的恶意字符。白名单是一种非常有效的
方法,虽然它需要执行严格的输入验证规则,但可以减少对参数化SQL 语句的
维护,并能够提供更高的安全保证。在大多数情况下,黑名单是充满漏洞的,并
不能有效地预防SQL 注入攻击。举个例子,攻击者可以:
1)把没有被黑名单引用的对象作为目标;
2)找到方法绕过需要排除的特殊字符;
3)利用存储程序存储过程隐藏注入的特殊字符;
手动排除输入到 SQL 查询中的字符是有用的,但它并不能保证你的应用程序不
受SQL 注入攻击。
另一个被提出的对付 SQL 注入攻击的常见方法是使用存储程序过程。尽管存储
程序过程能够防止一些类型的SQL 注入攻击,但仍有很多它不能预防。存储程
序过程通常通过限制作为参数的语句的类型来防止SQL 注入攻击。然而,有很
多方法可以绕过该限制,很多有意思的语句仍然能够传递给存储程序存储过程。
与黑名单一样,存储程序过程能够防止一些攻击,但它并不能保证你的应用程序
不受SQL 注入攻击。
如果一定要拼接sql语句,那么只要不让用户的输入闭合掉你的sql语句就可以了,这个本没有通用的代码,做通用的过滤就是一条错误的路线,对每个拼合的sql语句处理才行,你可以写几个通用的函数,在不同的拼接的地方使用,但想做一个总过滤,不管具体拼接代码,这样是行不通的。
分几种情况处理
输入的是数值型,那么转换为数值型后替换。例如Id等
"... where Id=" + Int32.Parse(request.querystring("Id"))
输入的是字符串,那么替换字符串单引号为连续的两个单引号。
"... where Category='" + request.querystring("Id").replace("'","''") + "'"
如果是某些数据库的#闭合的日期类型,那么也是放在它闭合
"... where CreateTime=#" + request.querystring("CreateTime").replace("#","") + "#"
如果是in类型的有括号语句,那么也是一样防止闭合括号
"... where Id in (" + request.querystring("id").replace(")","") + ")"
反正就是如果是数值型等没有界定符的,就转换类型,字符串型有界定符的就不让输入的闭合。这样就全解决了
你这种过滤的方法是不正确的,加入真正的文章内容内有这些字符的话就不对了
解决方案26: 还是参数化最好,该怎么转义转换都让系统去做吧...
过滤或者禁用很么词的做法不是很**么,如果那些词必须被过滤,它们是怎么被发上论坛的?
解决方案28:
SQL注入是从正常的WWW端口访问,而且表面看起来跟一般的Web页面访问没什么区别, 所以目前市面的防火墙都不会对SQL注入发出警报,如果管理员没查看IIS日志的习惯,可能被入侵很长时间都不会发觉。
随着B/S模式应用开发的发展,使用这种模式编写应用程序的程序员也越来越多。但是由于这个行业的入门门槛不高,程序员的水平及经验也参差不齐,相当大一部分程序员在编写代码的时候,没有对用户输入数据的合法性进行判断,使应用程序存在安全隐患。用户可以提交一段数据库查询代码,根据程序返回的结果,获得某些他想得知的数据,这就是所谓的SQL Injection,即SQL注入。
SQL注入是从正常的WWW端口访问,而且表面看起来跟一般的Web页面访问没什么区别,所以目前市面的防火墙都不会对SQL注入发出警报,如果管理员没查看IIS日志的习惯,可能被入侵很长时间都不会发觉。
但是,SQL注入的手法相当灵活,在注入的时候会碰到很多意外的情况。能不能根据具体情况进行分析,构造巧妙的SQL语句,从而成功获取想要的数据,是高手与“菜鸟”的根本区别。
SQL注入漏洞全接触--入门篇
SQL注入是从正常的WWW端口访问,而且表面看起来跟一般的Web页面访问没什么区别,所以目前市面的防火墙都不会对SQL注入发出警报,如果管理员没查看IIS日志的习惯,可能被入侵很长时间都不会发觉。
详细内容>>
http://blog.csdn.net/wufeng4552/archive/2008/12/05/3449834.aspx
SQL注入漏洞全接触--进阶篇
SQL注入的一般步骤,首先,判断环境,寻找注入点,判断数据库类型,其次,根据注入参数类型,在脑海中重构SQL语句的原貌。
详细内容>>
http://blog.csdn.net/wufeng4552/archive/2008/12/05/3449870.aspx
SQL注入漏洞全接触--高级篇
看完入门篇和进阶篇后,稍加练习,破解一般的网站是没问题了。但如果碰到表名列名猜不到,或程序作者过滤了一些特殊字符,怎么提高注入的成功率?怎么样提高猜解效率?
详细内容>>
http://blog.csdn.net/wufeng4552/archive/2008/12/05/3449883.aspx
SQL注入法攻击一日通
SQL注入的简单原理和攻击一般步骤,文章作者想让人一天学会SQL注入攻击。
详细内容>>
http://blog.csdn.net/wufeng4552/archive/2008/12/05/3449901.aspx
SQL Server应用程序中的高级SQL注入
这份文档是详细讨论SQL注入技术,它适应于比较流行的IIS+ASP+SQLSERVER平台。它讨论了哪些SQL语句能通过各种各样的方法注入到应用程序中,并且记录与攻击相关的数据确认和数据库锁定。
详细内容>>
http://blog.csdn.net/wufeng4552/archive/2008/12/05/3449913.aspx
编写通用的ASP防SQL注入攻击程序
如果编写通用的SQL防注入程序一般的http请求不外乎get 和 post,所以只要我们在文件中过滤所有post或者get请求中的参数信息中非法字符即可,所以我们实现http 请求信息过滤就可以判断是是否受到SQL注入攻击。
详细内容>>
http://blog.csdn.net/wufeng4552/archive/2008/12/05/3449925.aspx
利用instr()函数防止SQL注入攻击
学asp也有一段时间了,这几天一直在写自己的程序,也遇到了好多问题,我就不得不得考虑到一些现在的漏洞,比如,‘ 或 and 1=1等等的一些漏洞!别的先不管,今天我就来说说如何堵这个漏洞!详细内容>>
http://blog.csdn.net/wufeng4552/archive/2008/12/05/3449932.aspx
SQL注入攻击的原理及其防范措施
ASP编程门槛很低,新手很容易上路。在一段不长的时间里,新手往往就已经能够编出看来比较完美的动态网站,在功能上,老手能做到的,新手也能够做到。
详细内容>>
http://blog.csdn.net/wufeng4552/archive/2008/12/05/3449940.aspx
跨站式SQL注入技巧
学习如何从数据库中获取想要获得的内容。
详细内容>>
http://blog.csdn.net/wufeng4552/archive/2008/12/05/3449948.aspx
防范Sql注入式攻击
Sql注入式攻击是指利用设计上的漏洞,在目标服务器上运行Sql 命令以及进行其他方式的攻击 动态生成Sql命令时没有对用户输入的数据进行验证是Sql注入攻击得逞的主要原因。
详细内容>>
http://blog.csdn.net/wufeng4552/archive/2008/12/05/3449951.aspx
Dreamweaver中sql注入式攻击的防范
在安全性方面,新手最容易忽略的问题就是SQL注入漏洞的问题。用NBSI 2.0对网上的一些ASP网站稍加扫描,就能发现许多ASP网站存在SQL注入漏洞。详细内容>>
http://blog.csdn.net/wufeng4552/archive/2008/12/05/3449953.aspx
PHP与SQL注入攻击
SQL注入攻击是黑客攻击网站最常用的手段。如果你的站点没有使用严格的用户输入检验,那么常容易遭到SQL注入攻击。SQL注入攻击通常通过给站点数据库提交不良的数据或查询语句来实现,很可能使数据库中的纪录遭到暴露,更改或被删除。下面来谈谈SQL注入攻击是如何实现的,又如何防范。
详细内容>>
http://blog.csdn.net/wufeng4552/archive/2008/12/05/3449956.aspx
SQL注入攻击零距离
一次次的SQL注射入侵,一次次的网站被黑,总是那句话,漏洞在所难免,难道一点办法都没吗?这篇文章就是为大家解析下SQL注 射的原理,以及给出一些预防方法。
详细内容>>
http://blog.csdn.net/wufeng4552/archive/2008/12/05/3449959.aspx
SQL注入技术和跨站脚本攻击的检测
在最近两年中,安全专家应该对网络应用层的攻击更加重视。因为无论你有多强壮的防火墙规则设置或者非常勤于补漏的修补机制,如果你的网络应用程序开发者没有遵循 安全代码进行开发,攻击者将通过80端口进入你的系统。
详细内容>>
http://blog.csdn.net/wufeng4552/archive/2008/12/05/3449961.aspx
菜鸟入门级:SQL注入攻击
一般国内的小一点的新闻站点程序 都有 ""&request 这种漏洞,下面我讲解攻击方法。
详细内容>>
http://blog.csdn.net/wufeng4552/archive/2008/12/05/3449963.aspx
三步堵死SQL注入漏洞
防御SQL注入有妙法,第一步:很多新手从网上下载SQL通用防注入系统的程序,在需要防范注入的页面头部用 来防止别人进行手动注入测试.
详细内容>>
http://blog.csdn.net/wufeng4552/archive/2008/12/05/3449965.aspx
SQL注入实战---利用“dbo”获得SQL管理权限和系统权限
如果显示“dbo” 转换数据类型为 int 的列时发生语法错误 那么就可以用我下面介绍的方法来获得系统管理权限,如果是“abc” 转换数据类型为 int 的列时发生语法错误 那么就用不能用我下面的介绍来获得系统权限了.
详细内容>>
http://blog.csdn.net/wufeng4552/archive/2008/12/05/3449967.aspx
两个防SQL注入过滤代码
SQL注入防护的一种简单方法,在网页中嵌入过滤代码,基于认为的安全防护措施.
详细内容>>
http://blog.csdn.net/wufeng4552/archive/2008/12/05/3449969.aspx
蓝雨设计整站SQL注入漏洞
以下文章中就会出现NOWA修改系统漏洞当中从未有的SQL注入漏洞!只怪蓝雨修改程序的时候没有做好注入问题了!这个可不能怪我!谁叫人家程序设计员不会注意安全死角阿?
详细内容>>
http://blog.csdn.net/wufeng4552/archive/2008/12/05/3449972.aspx
SQL注入渗透某网络安全公司的网站全过程
写这篇文章不是为了告诉大家如何去做入侵,而是希望提醒大家:“入侵是偶然的,但安全并不是必然的”,不要疏忽运作上的一些小细节。
详细内容>>
http://blog.csdn.net/wufeng4552/archive/2008/12/05/3449973.aspx
sql注入防御
SQL注入通过网页对网站数据库进行修改。它能够直接在数据库中添加具有管理员权限的用户,从而最终获得系统管理员权限。黑客可以利用获得的管理员权限任意获得网站上的文件或者在网页上加挂木马和各种恶意程序,对网站和访问该网站的网友都带来巨大危害.详细内容>>
http://blog.csdn.net/wufeng4552/archive/2008/12/05/3449976.aspx
终极防范SQL注入漏洞
其实SQL注入漏洞并不可怕,知道原理 + 耐心仔细,就可以彻底防范!下面给出4个函数,足够你抵挡一切SQL注入漏洞!读懂代码,你就能融会贯通.详细内容>>
http://blog.csdn.net/wufeng4552/archive/2008/12/05/3449979.aspx
SQL注入与ASP木马上传
SQL注入后,如何上传木马,一直是比较头疼的事,我这里提供上传木马的一种另一种方法。
1、SQL注入的时候,用xp_cmdshell 向服务器上写入一个能写文件的asp文件.
详细内容>>
http://blog.csdn.net/wufeng4552/archive/2008/12/05/3449983.aspx
如何在SQL注入时保护数据库
SQL注入是防止数据库攻击的一个有效策略。攻击者将注入一个SQL语句到另外一个语句中,这个通常会损坏你的数据库。有数据库接口的Web站点通常在SQL注入的时候容易受到攻击,因为它们是基于动态的SQL.
详细内容>>
http://blog.csdn.net/wufeng4552/archive/2008/12/05/3449986.aspx
天晨设计整站SQL注入漏洞
作者从一个安全工作员的角度,对天晨设计整站SQL注入漏洞做出了详细的测试.
详细内容>>
http://blog.csdn.net/wufeng4552/archive/2008/12/05/3449988.aspx
浅谈sql注入式(SQL injection)攻击与防范
没有系统的学习过asp或者php编程,也没有系统的学习过access、sqlserver、mysql等数据库,所以我不是一个程序员,虽然经常干一些类似程序员的事情.
详细内容>>
http://blog.csdn.net/wufeng4552/archive/2008/12/05/3449991.aspx
用vbs来写sql注入等80端口的攻击脚本
昨天晚上在机器里乱翻时无意打开一个vbs脚本,突然发现一个以前没有见过的对象Test.SendRequest("http://" & g_sServer & "/testfiles/browser.asp"),虽然对象没有见过,但是意思很明显:发送http请求.
详细内容>>
http://blog.csdn.net/wufeng4552/archive/2008/12/05/3449992.aspx
C# 检查字符串,防SQL注入攻击
这些天,CSDN上讨论SQL注入攻击似乎是如火如荼啊...我也来参合一下..如下,CheckParams函数,接收参数任意,如参数中有字符串,则对字符串进行检查,如参数中有集合(如Array之类,总之是实现了ICollection的),则对集合中的字符串元素进行检查.
详细内容>>
http://blog.csdn.net/wufeng4552/archive/2008/12/05/3449994.aspx
关于对SQL注入80004005 及其它错误消息分析
本文详细讲述了 Microsoft 数据访问组件 (MDAC) 收到 0x800040005 错误的一些常见原因,MDAC 包括 ActiveX 数据对象、OLE DB 和远程数据服务 (RDS)。同时,本文还讨论了其它一些错误消息,包括 80040e21、80040e14 和80040e10.
详细内容>>
http://blog.csdn.net/wufeng4552/archive/2008/12/05/3449996.aspx
SQL注入入侵动网SQL版论坛
现在动网最新版本是7.0+SP2。应该说安全性已经是很高的了。所以从脚本本身的问题去突破它难度不小。但是我们可以从外部的一些途径间接“搞定”动网.现在IIS+ASP+SQL2000的组合是比较常见的。而一个网站运用大量的ASP脚本程序,难免不出纰漏。如果一台主机上存在某个SQL注入点,而这台主机又安装有动网SQL版的话,基本上可以得出结论:这个动网就是你的了。下面来看一下实例.详细内容>>
http://blog.csdn.net/wufeng4552/archive/2008/12/05/3450001.aspx
利用SQL注入2分钟入侵网站全程实录
说起流光、溯雪、乱刀,可以说是大名鼎鼎无人不知无人不晓,这些都是小榕哥的作品。每次一提起小榕哥来,我的崇拜景仰就如滔滔江水,连绵不绝~~~~(又来了!) 让我们崇拜的小榕哥最新又发布了SQL注入工具,这回喜欢利用SQL注入入侵网站的黑友们有福了。小榕哥的工具就是强!偶用它来搞定我们本地的信息港,从寻找注入漏洞到注入攻击成功,通过准确计时,总共只用了3分还差40秒,呵呵,王者风范,就是强啊!不信吗?看看我的入侵过程吧.
详细内容>>
http://blog.csdn.net/wufeng4552/archive/2008/12/05/3450005.aspx
的确需要多方面共同协作才能保障安全性
好帖,收藏了先!
http://topic.csdn.net/u/20090708/17/462f299b-1b63-4c16-b845-df8b1a1a23bf.html
http://topic.csdn.net/u/20090708/09/b78444ee-9081-4ff7-8aa5-ba6f9b1d9fdc.html
http://topic.csdn.net/u/20081205/09/3DD06076-BCBE-45D4-998C-8999FDBE6FAE.html
看完这三个就知道如何解决了
存储过程存储过程!
解决方案31:参考2
解决方案32:总结防注入
解决方案33:http://ety001.blog.163.com/blog/static/51750480201011131945886/
解决方案34: SQL注入攻击的危害性很大。在讲解其防止办法之前,数据库管理员有必要先了解一下其攻击的原理。这有利于管理员采取有针对性的防治措施。
一、 SQL注入攻击的简单示例。
statement := "SELECT * FROM Users WHERE Value= " + a_variable + "
上面这条语句是很普通的一条SQL语句,他主要实现的功能就是让用户输入一个员工编号然后查询处这个员工的信息。但是若这条语句被不法攻击者改装过后,就可能成为破坏数据的黑手。如攻击者在输入变量的时候,输入以下内容SA001’;drop table c_order--。那么以上这条SQL语句在执行的时候就变为了SELECT * FROM Users WHERE Value= ‘SA001’;drop table c_order--。
这条语句是什么意思呢?‘SA001’后面的分号表示一个查询的结束和另一条语句的开始。c_order后面的双连字符 指示当前行余下的部分只是一个注释,应该忽略。如果修改后的代码语法正确,则服务器将执行该代码。系统在处理这条语句时,将首先执行查询语句,查到用户编号为SA001 的用户信息。然后,数据将删除表C_ORDER(如果没有其他主键等相关约束,则删除操作就会成功)。只要注入的SQL代码语法正确,便无法采用编程方式来检测篡改。因此,必须验证所有用户输入,并仔细检查在您所用的服务器中执行构造 SQL命令的代码。
二、 SQL注入攻击原理。
可见SQL注入攻击的危害性很大。在讲解其防止办法之前,数据库管理员有必要先了解一下其攻击的原理。这有利于管理员采取有针对性的防治措施。
SQL注入是目前比较常见的针对数据库的一种攻击方式。在这种攻击方式中,攻击者会将一些恶意代码插入到字符串中。然后会通过各种手段将该字符串传递到SQLServer数据库的实例中进行分析和执行。只要这个恶意代码符合SQL语句的规则,则在代码编译与执行的时候,就不会被系统所发现。
SQL注入式攻击的主要形式有两种。一是直接将代码插入到与SQL命令串联在一起并使得其以执行的用户输入变量。上面笔者举的例子就是采用了这种方法。由于其直接与SQL语句捆绑,故也被称为直接注入式攻击法。二是一种间接的攻击方法,它将恶意代码注入要在表中存储或者作为原书据存储的字符串。在存储的字符串中会连接到一个动态的SQL命令中,以执行一些恶意的SQL代码。
注入过程的工作方式是提前终止文本字符串,然后追加一个新的命令。如以直接注入式攻击为例。就是在用户输入变量的时候,先用一个分号结束当前的语句。然后再插入一个恶意SQL语句即可。由于插入的命令可能在执行前追加其他字符串,因此攻击者常常用注释标记“—”来终止注入的字符串。执行时,系统会认为此后语句位注释,故后续的文本将被忽略,不背编译与执行。
三、 SQL注入式攻击的防治。
既然SQL注入式攻击的危害这么大,那么该如何来防治呢?下面这些建议或许对数据库管理员防治SQL注入式攻击有一定的帮助。
1、 普通用户与系统管理员用户的权限要有严格的区分。
如果一个普通用户在使用查询语句中嵌入另一个Drop Table语句,那么是否允许执行呢?由于Drop语句关系到数据库的基本对象,故要操作这个语句用户必须有相关的权限。在权限设计中,对于终端用户,即应用软件的使用者,没有必要给他们数据库对象的建立、删除等权限。那么即使在他们使用SQL语句中带有嵌入式的恶意代码,由于其用户权限的限制,这些代码也将无法被执行。故应用程序在设计的时候,最好把系统管理员的用户与普通用户区分开来。如此可以最大限度的减少注入式攻击对数据库带来的危害。
2、 强迫使用参数化语句。
如果在编写SQL语句的时候,用户输入的变量不是直接嵌入到SQL语句。而是通过参数来传递这个变量的话,那么就可以有效的防治SQL注入式攻击。也就是说,用户的输入绝对不能够直接被嵌入到SQL语句中。与此相反,用户的输入的内容必须进行过滤,或者使用参数化的语句来传递用户输入的变量。参数化的语句使用参数而不是将用户输入变量嵌入到SQL语句中。采用这种措施,可以杜绝大部分的SQL注入式攻击。不过可惜的是,现在支持参数化语句的数据库引擎并不多。不过数据库工程师在开发产品的时候要尽量采用参数化语句。
3、 加强对用户输入的验证。
总体来说,防治SQL注入式攻击可以采用两种方法,一是加强对用户输入内容的检查与验证;二是强迫使用参数化语句来传递用户输入的内容。在SQLServer数据库中,有比较多的用户输入内容验证工具,可以帮助管理员来对付SQL注入式攻击。测试字符串变量的内容,只接受所需的值。拒绝包含二进制数据、转义序列和注释字符的输入内容。这有助于防止脚本注入,防止某些缓冲区溢出攻击。测试用户输入内容的大小和数据类型,强制执行适当的限制与转换。这即有助于防止有意造成的缓冲区溢出,对于防治注入式攻击有比较明显的效果。
如可以使用存储过程来验证用户的输入。利用存储过程可以实现对用户输入变量的过滤,如拒绝一些特殊的符号。如以上那个恶意代码中,只要存储过程把那个分号过滤掉,那么这个恶意代码也就没有用武之地了。在执行SQL语句之前,可以通过数据库的存储过程,来拒绝接纳一些特殊的符号。在不影响数据库应用的前提下,应该让数据库拒绝包含以下字符的输入。如分号分隔符,它是SQL注入式攻击的主要帮凶。如注释分隔符。注释只有在数据设计的时候用的到。一般用户的查询语句中没有必要注释的内容,故可以直接把他拒绝掉,通常情况下这么做不会发生意外损失。把以上这些特殊符号拒绝掉,那么即使在SQL语句中嵌入了恶意代码,他们也将毫无作为。
故始终通过测试类型、长度、格式和范围来验证用户输入,过滤用户输入的内容。这是防止SQL注入式攻击的常见并且行之有效的措施。
4、 多多使用SQL Server数据库自带的安全参数。
为了减少注入式攻击对于SQL Server数据库的不良影响,在SQLServer数据库专门设计了相对安全的SQL参数。在数据库设计过程中,工程师要尽量采用这些参数来杜绝恶意的SQL注入式攻击。
如在SQL Server数据库中提供了Parameters集合。这个集合提供了类型检查和长度验证的功能。如果管理员采用了Parameters这个集合的话,则用户输入的内容将被视为字符值而不是可执行代码。即使用户输入的内容中含有可执行代码,则数据库也会过滤掉。因为此时数据库只把它当作普通的字符来处理。使用Parameters集合的另外一个优点是可以强制执行类型和长度检查,范围以外的值将触发异常。如果用户输入的值不符合指定的类型与长度约束,就会发生异常,并报告给管理员。如上面这个案例中,如果员工编号定义的数据类型为字符串型,长度为10个字符。而用户输入的内容虽然也是字符类型的数据,但是其长度达到了20个字符。则此时就会引发异常,因为用户输入的内容长度超过了数据库字段长度的限制。
5、 多层环境如何防治SQL注入式攻击?
在多层应用环境中,用户输入的所有数据都应该在验证之后才能被允许进入到可信区域。未通过验证过程的数据应被数据库拒绝,并向上一层返回一个错误信息。实现多层验证。对无目的的恶意用户采取的预防措施,对坚定的攻击者可能无效。更好的做法是在用户界面和所有跨信任边界的后续点上验证输入。如在客户端应用程序中验证数据可以防止简单的脚本注入。但是,如果下一层认为其输入已通过验证,则任何可以绕过客户端的恶意用户就可以不受限制地访问系统。故对于多层应用环境,在防止注入式攻击的时候,需要各层一起努力,在客户端与数据库端都要采用相应的措施来防治SQL语句的注入式攻击。
6、 必要的情况下使用专业的漏洞扫描工具来寻找可能被攻击的点。
使用专业的漏洞扫描工具,可以帮助管理员来寻找可能被SQL注入式攻击的点。不过漏洞扫描工具只能发现攻击点,而不能够主动起到防御SQL注入攻击的作用。当然这个工具也经常被攻击者拿来使用。如攻击者可以利用这个工具自动搜索攻击目标并实施攻击。为此在必要的情况下,企业应当投资于一些专业的漏洞扫描工具。一个完善的漏洞扫描程序不同于网络扫描程序,它专门查找数据库中的SQL注入式漏洞。最新的漏洞扫描程序可以查找最新发现的漏洞。所以凭借专业的工具,可以帮助管理员发现SQL注入式漏洞,并提醒管理员采取积极的措施来预防SQL注入式攻击。如果攻击者能够发现的SQL注入式漏洞数据库管理员都发现了并采取了积极的措施堵住漏洞,那么攻击者也就无从下手了。