❶ sql注入攻击怎么解决
网络:
SQL注入攻击是你需要担心的事情,不管你用什么web编程技术,再说所有的web框架都需要担心这个的。你需要遵循几条非常基本的规则:
1)在构造动态SQL语句时,一定要使用类安全(type-safe)的参数加码机制。大多数的数据API,包括ADO和ADO. NET,有这样的支持,允许你指定所提供的参数的确切类型(譬如,字符串,整数,日期等),可以保证这些参数被恰当地escaped/encoded了,来避免黑客利用它们。一定要从始到终地使用这些特性。
例如,在ADO. NET里对动态SQL,你可以象下面这样重写上述的语句,使之安全:
Dim SSN as String = Request.QueryString("SSN")
Dim cmd As new SqlCommand("SELECT au_lname,au_fname FROM authors WHERE au_id = @au_id")
Dim param = new SqlParameter("au_id",SqlDbType.VarChar)
param.Value = SSN
cmd.Parameters.Add(param)
这将防止有人试图偷偷注入另外的SQL表达式(因为ADO. NET知道对au_id的字符串值进行加码),以及避免其他数据问题(譬如不正确地转换数值类型等)。注意,VS 2005内置的TableAdapter/DataSet设计器自动使用这个机制,ASP. NET 2.0数据源控件也是如此。
一个常见的错误知觉(misperception)是,假如你使用了存储过程或ORM,你就完全不受SQL注入攻击之害了。这是不正确的,你还是需要确定在给存储过程传递数据时你很谨慎,或在用ORM来定制一个查询时,你的做法是安全的。
2) 在部署你的应用前,始终要做安全审评(security review)。建立一个正式的安全过程(formal security process),在每次你做更新时,对所有的编码做审评。后面一点特别重要。很多次我听说开发队伍在正式上线(going live)前会做很详细的安全审评,然后在几周或几个月之后他们做一些很小的更新时,他们会跳过安全审评这关,推说,“就是一个小小的更新,我们以后再做编码审评好了”。请始终坚持做安全审评。
3) 千万别把敏感性数据在数据库里以明文存放。我个人的意见是,密码应该总是在单向(one-way)hashed过后再存放,我甚至不喜欢将它们在加密后存放。在默认设置下,ASP. NET 2.0 Membership API 自动为你这么做,还同时实现了安全的SALT 随机化行为(SALT randomization behavior)。如果你决定建立自己的成员数据库,我建议你查看一下我们在这里发表的我们自己的Membership provider的源码。同时也确定对你的数据库里的信用卡和其他的私有数据进行了加密。这样即使你的数据库被人入侵(compromised)了的话,起码你的客户的私有数据不会被人利用。
4)确认你编写了自动化的单元测试,来特别校验你的数据访问层和应用程序不受SQL注入攻击。这么做是非常重要的,有助于捕捉住(catch)“就是一个小小的更新,所有不会有安全问题”的情形带来的疏忽,来提供额外的安全层以避免偶然地引进坏的安全缺陷到你的应用里去。
5)锁定你的数据库的安全,只给访问数据库的web应用功能所需的最低的权限。如果web应用不需要访问某些表,那么确认它没有访问这些表的权限。如果web应用只需要只读的权限从你的account payables表来生成报表,那么确认你禁止它对此表的 insert/update/delete 的权限。
6)很多新手从网上下载SQL通用防注入系统的程序,在需要防范注入的页面头部用 来防止别人进行手动注入测试(。
可是如果通过SQL注入分析器就可轻松跳过防注入系统并自动分析其注入点。然后只需要几分钟,你的管理员账号及密码就会被分析出来。
7)对于注入分析器的防范,笔者通过实验,发现了一种简单有效的防范方法。首先我们要知道SQL注入分析器是如何工作的。在操作过程中,发现软件并不是冲着“admin”管理员账号去的,而是冲着权限(如flag=1)去的。这样一来,无论你的管理员账号怎么变都无法逃过检测。
第三步:既然无法逃过检测,那我们就做两个账号,一个是普通的管理员账号,一个是防止注入的账号,为什么这么说呢?笔者想,如果找一个权限最大的账号制造假象,吸引软件的检测,而这个账号里的内容是大于千字以上的中文字符,就会迫使软件对这个账号进行分析的时候进入全负荷状态甚至资源耗尽而死机。下面我们就来修改数据库吧。
⒈对表结构进行修改。将管理员的账号字段的数据类型进行修改,文本型改成最大字段255(其实也够了,如果还想做得再大点,可以选择备注型),密码的字段也进行相同设置。
⒉对表进行修改。设置管理员权限的账号放在ID1,并输入大量中文字符(最好大于100个字)。
⒊把真正的管理员密码放在ID2后的任何一个位置(如放在ID549上)。
由于SQL注入攻击针对的是应用开发过程中的编程不严密,因而对于绝大多数防火墙来说,这种攻击是“合法”的。问题的解决只有依赖于完善编程。专门针对SQL注入攻击的工具较少,Wpoison对于用asp,php进行的开发有一定帮助...。
❷ 什么是sql注入如何防止sql注入
SQL注入是一种非常常见的数据库攻击手段,同时也是网络世界中最普遍的漏洞之一,简单理解就是恶意用户通过在表单中填写包含SQL关键字的数据来使数据库执行非常规代码的过程。
问题来源是,SQL数据库的操作是通过SQL语句来执行的,而无论是执行代码还是数据项都必须写在SQL语句中,也就导致如果我们在数据项中加入了某些SQL语句关键字,比如SELECT、DROP等,这些关键字就很有可能在数据库写入或读取数据时得到执行。
解决方案
方案一:
采用预编译技术
使用预编译的SQL语句,SQL语句的语义不会是不会发生改变的。预编译语句在创建的时候就已经将指定的SQL语句发送给了DBMS,完成了解析,检查,编译等工作,所以攻击者无法改变SQL语句的结构,只是把值赋给?,然后将?这个变量传给SQL语句。当然还有一些通过预编译绕过某些安全防护的操作,大家感兴趣可以去搜索一下。
方案二:
严格控制数据类型
在java、c等强类型语言中一般是不存在数字型注入的,因为在接受到用户输入id时,代码一般会做一个int id 的数据类型转换,假如我们输入的是字符串的话,那么这种情况下,程序就会报错。但是在PHP、ASP这些没有强调处理数据类型的语言,一般我们看到的接收id的代码都是如下等代码。
方案三:
对特殊的字符进行转义
数字型注入可以通过检查数据类型防止,但是字符型不可以,那么怎么办呢,最好的办法就是对特殊的字符进行转义了。比如在MySQL中我们可以对" '
"进行转义,这样就防止了一些恶意攻击者来闭合语句。当然我们也可以通过一些安全函数来转义特殊字符。如addslashes()等,但是这些函数并非一劳永逸,攻击者还可以通过一些特殊的方式绕过。
❸ 什么是SQL注入,如何防止SQL注入
所谓SQL注入,就是通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令。具体来说,它是利用现有应用程序,将(恶意)的SQL命令注入到后台数据库引擎执行的能力,它可以通过在Web表单中输入(恶意)SQL语句得到一个存在安全漏洞的网站上的数据库,而不是按照设计者意图去执行SQL语句。比如先前的很多影视网站泄露VIP会员密码大多就是通过WEB表单递交查询字符暴出的,这类表单特别容易受到SQL注入式攻击.x0dx0a防护x0dx0a归纳一下,主要有以下几点:x0dx0a1.永远不要信任用户的输入。对用户的输入进行校验,可以通过正则表达式,或限制长度;对单引号和x0dx0a双"-"进行转换等。x0dx0a2.永远不要使用动态拼装sql,可以使用参数化的sql或者直接使用存储过程进行数据查询存取。x0dx0a3.永远不要使用管理员权限的数据库连接,为每个应用使用单独的权限有限的数据库连接。x0dx0a4.不要把机密信息直接存放,加密或者hash掉密码和敏感的信息。x0dx0a5.应用的异常信息应该给出尽可能少的提示,最好使用自定义的错误信息对原始错误信息进行包装x0dx0a6.sql注入的检测方法一般采取辅助软件或网站平台来检测,软件一般采用sql注入检测工具jsky,网站平台就有亿思网站安全平台检测工具。MDCSOFT SCAN等。采用MDCSOFT-IPS可以有效的防御SQL注入,XSS攻击等。
❹ SQL注入攻击与防范
关于SQL注入攻击与防范
随着网络的普及,关系数据库的广泛应用,网络安全越来越重要。下面是我为大家搜索整理了关于SQL注入攻击与防范,欢迎参考阅读,希望对大家有所帮助。想了解更多相关信息请持续关注我们应届毕业生培训网!
一、 SQL注入攻击
简言之,SQL注入是应用程序开发人员未预期地把SQL代码传入到应用程序的过程。它由于应用程序的糟糕设计而成为可能,并且只有那些直接使用用户提供的值构建SQL语句的应用程序才会受影响。
例如:用户输入客户ID后,GridView显示客户的全部行记录。在一个更加真实的案例中,用户还要输入密码之类的验证信息,或者根据前面的登录页面得到用户ID,可能还会有一些用户输入关键信息的文本框,如订单的日期范围或产品名称。问题在于命令是如何被执行的。在这个示例中,SQL语句通过字符串构造技术动态创建。文本框txtID的值被直接复制到字符串中。下面是代码:
在这个示例中,攻击者可以篡改SQL语句。通常,攻击的第一个目标是得到错误信息。如果错误没有被恰当处理,底层的信息就会暴露给攻击者。这些信息可用于进一步攻击。
例如,想象一下在文本一下在文本框中输入下面的字符串会发生什么?
ALFKI'OR '1'='1
再看看因此生成的完整SQL语句:
这条语句将返回所有的订单记录,即便那些订单不是由ALFDI创建,因为对每一行而言而有信1=1总是true。这样产生的后果是没有显示当前用户特定信息,却向攻击者显示了全部资料,如果屏幕上显示的是敏感信息,如社会保险号,生日或信用卡资料,就会带来严重的问题。事实上,这些简单的SQL注入往往是困扰那些大型电子商务公司的麻烦。一般而言,攻击点不在于文本框而在于查询字符串(可被用于向数据库传送值,如列表页向详细信息页面传送唯一标识符)。
还可以进行更复杂的攻击。例如,攻击者可以使用两个连接号(--)注释掉SQL语句的剩余部分。这样的攻击只限于SQL Server,不过对于其他类型的数据库也有等效的办法,如MySql使用(#)号,Oracle使用(;)号。另外攻击者还可以执行含有任意SQL语句的批处理命令。对于SQL Server提供程序,攻击者只需在新命令前加上分号(;)。攻击者可以采用这样的方式删除其他表的内容,甚至调用SQL Server的系统存储过程xp_cmdshell在命令执行任意的程序。
下面是攻击者在文本框中输入的,它的攻击目标是删除Customers表的全部行。
LUNCHUN’;DELETE*FROM Customers--
二、防范
如何预防SQL注入攻击呢?需要记住几点。首先,使用TextBox.MaxLength属性防止用户输入过长的字符是一个好办法。因为它们不够长,也就减少了贴入大量脚本的可能性。其次,要使用ASP.NET验证控件锁定错误的数据(如文本、空格、数值中的特殊字符)。另外,要限制错误信息给出的提示。捕获到数据库异常时,只显示一些通用的信息(如“数据源错误”)而不是显示Exception.Message属性中的信息,它可能暴露了系统攻击点。
更为重要的是,一定要小心去除特殊字符。比如,可以将单引号替换为两个单引号,这样它们就不会和SQL语句的分隔符混淆:
string ID=txtID.Text().Replace(“’”,”’’”);
当然,如果文本确实需要包含单引号,这样做就引入了其他麻烦。另外,某些SQL注入攻击还是可行的。替换单引号可以防止用户提前结束一个字符串,然而,如果动态构建含有数值的SQL语句,SQL注入攻击又有发挥的空间了。这个漏洞常被(这是很危险的)忽视。更好的解决办法是使用参数化的命令或使用存储过程执行转义以防止SQL注入攻击。
另一个好建议是限制用于访问数据库的账号的权限。这样该账号将没有权限访问其他数据库或执行扩展的存储过程。不过这样并不能解决SQL脚本注入的问题,因为用于连接数据库的进程几乎总是需要比任意单个用户更大的权限。通过限制权限,可以预防删除表的攻击,但不能阻止攻击者偷看别人的.信息
三、POST注入攻击
精明的用户可能会知道还有另外一个Web控件攻击的潜在途径。虽然参数化的命令防止了SQL注入攻击,但它们不能阻止攻击者向回发到服务器的数据添加恶意的值。如果不检查这些值,就使得攻击者可以提交本来不可能存在的控件值。
例如,假设你有一个显示当前用户订单的列表。狡诈的攻击者可能保存该页面的一个本地副本,修改HTML内容向列表添加更多的项目,然后选择某个“假”的项目。如果攻击成功,攻击者就能够看到其他用户订单,这显然是一个问题。幸好,ASP.NET使用一个很少被提及的叫做“事件验证”的特性来防止这种攻击。事件验证检查回发到服务器的数据并验证其中值的合法性。例如,如果回发的数据表明用户选择了一个没有意义的数据(因为它在控件中并不存在),ASP.NET就产生一个错误并停止处理。可以在Page指令中设置EnableEventValidation特性为false来禁用事件验证。创建使用客户端脚本动态改变内容的页面时,需要执行这一步。不过,此时在使用这些值之前要注意检查潜在的POST注入攻击。
;❺ 投标系统上传文件提示疑似sql注入攻击怎么解决
投标系统上传文件提示疑似sql注入攻击可以用弱口令漏洞解决。根据相关公开信息查询键稿凯,使用至少6位的数字、字母及特殊字符组合作为密码。数据库不要存储明文密稿唤码,应存储加密后的密文敬缺。
❻ 什么是sql注入,怎么防止注入
sql注入其实就是在这些不安全控件内输入sql或其他数据库的一些语句,从而达到欺骗服务器执行恶意到吗影响到数据库的数据。防止sql注入,可以在接受不安全空间的内容时过滤掉接受字符串内的“'”,那么他不再是一条sql语句,而是一个类似sql语句的zifuc,执行后也不会对数据库有破坏。
如:
username = request("username") //获取用户名 这里是通过URL传值获取的。
password = request("password") //获取密码 也是通过URL传值获取的。
sql="select * from userlist where username = '" & username & "' and password = '" & password & "'"--------如果某个人知道某个用户名是admin,常常有人网站的管理员用户名就是admin,这是密码可以选用'or 1 or ',
那么sql="select * from userlist where username = 'admin' and password = '' or 1 or ''",显然1是恒真的,那么验证密码就通过了。
防止的方式比较多,比如可以限制username,password中出现"'"这些字符,一般网站都是只允许数字,字符,下划线的组合,这可以通过javascript验证。也可以采取用存储过程代替sql拼接,等等。
❼ 如何防止sql注入攻击
1,避免将用户提供的输入直接放入SQL语句中,最好使用准备好的语句和参数化查询,这样更加安全。
2,不要将敏感数据保存在纯文本中,加密存储在数据库中的私有或机密数据,这样可以提供另一级保护,以防止攻击者成功地排出敏感数据。
3,将数据库用户的功能设置为最低要求,这将限制攻击者在设法获取访问权限时可以执行的操作。
4,避免直接向用户显示数据库错误,攻击者可以使用这些错误消息来获取有关数据库的信息。
5,对访问数据库的Web应用程序使用防火墙,这样可以为面向Web的应用程序提供保护,可以帮助识别SQL注入尝试;根据设置,还可以帮助防止SQL注入尝试到达应用程序。
6,定期测试与数据库交互的Web应用程序,这样做可以帮助捕获可能允许SQL注入的新错误或回归。
7,将数据库更新为最新的可用修补程序,这可以防止攻击者利用旧版本中存在的已知弱点或错误。
❽ 如何修复SQL注入漏洞
以下是OMG我为大家收集整理的文章,希望对大家有所帮助。
SQL注入是通过把SQL命令插入到Web表单递交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令。其实就是就是提交精心构造的数据库语句,使其反馈一些有用的数据。说白了就是去欺骗数据库,假如只有web服务器的话,是没法进行SQL注入的。
网上常用的注入手法有两种,一种是猜测,让数据库暴出用户名、密码等信息;另一种直接绕过认证,取得权限。相对应,要想修复此类漏洞,就必须禁止特殊数据的提交或将特殊提交的数据修改。
下面是不同脚本语言下的防注入过滤代码,其实思想是一致的。
1、 PHP防注入过滤代码
php 代码复制内容到剪贴板
<!-- ?php
/*************************
说明: 判断传递的变量中是否含有非法字符 如$_POST、$_GET
功能: 防注入
使用方法: 将下列代码保存为ak,php,调用方式 在数据提交页加上include("ak.php");
**************************/
function dowith_sql($str)
//实现将特征码两边加.
{
$refuse_str="exec|and|or|select|update|from|where|order|by|*|delete||insert|into|values|create|table|
database|set|char|asc|cast|declare| </script|script|iframe|3bomb|c.js|;";>
//定义防注入的字符
$arr=explode("|",$refuse_str);
//将$refuse_str中的值单独取出
for($i=0;$i<count($arr);$i++) p=""> </count($arr);$i++)>
{
$replace="[".$arr[$i]."]";
$str=str_replace($arr[$i],$replace,$str);
//在变量$str中搜索字符串$arr[$i],并将其替换为字符串[$replace]
}
return $str;
}
foreach ($_GET as $key=>$value)
//遍历获GET方法获得的参数$_GET的值传给$key,并赋值给$value
{
$_GET[$key]=dowith_sql($value);
//将$value中的特征码处理传个$_GET[$key]
}
foreach ($_POST as $key=>$value)
{
$_POST[$key]=dowith_sql($value);
}
?>
上面的防注入的方法只是防了GET与POST方法提交的数据,但是,WEB服务器读取数据的顺序是,先取GET中的数据,没有再去POST中的数据,没有还会再去COOKIES中的数据,上面的代码还没有防cookies注入。防cookies注入就比较简单了,cookies的id值一般只为阿拉伯数字,但是cookies注入必须得在id中构造代码,只要在获得参数UID后,对其进行过滤就可以了,代码如下:
php 代码复制内容到剪贴板
<!-- ?php
if($_COOKIE[id]!=null) {
//判断cookies不为空
foreach ($_COOKIE[id] as $key=>$id){
//读取cookies中的值
if (is_numeric($id)<0){
echo " ";
}
}
}
?>
将上述代码保存为hk.php。
所以在平时应用时,在网页上加上include("ak.php");与include("hk.php");
2、 ASP防注入过滤代码
<%
--------说明------------------
使用方法: 在需要防注的页面头部用 SSI ʱ B>
包含就可以了
友情提示:把代码复制到CONN.asp(数据库连接文件) 那么,只要包含了CONN的所有文件都防注了
-------- ------------------------
Dim xf_Post,xf_Get,xf_In,xf_Inf,xf_Xh,xf_db,xf_dbstr
自定义需要过滤的字串,用 "|" 分隔
xf_In = "|;|and|exec|insert|select|delete|update|count|*|%|chr|mid|master|truncate|char|declare"
xf_Inf = split(xf_In,"|")
If Request.Form<>"" Then
For Each xf_Post In Request.Form
For xf_Xh=0 To Ubound(xf_Inf)
If Instr(LCase(Request.Form(xf_Post)),xf_Inf(xf_Xh))<>0 Then
Response.Write ""
Response.Write "非法操作!系统做了如下记录↓
"
Response.Write "操作IP:"&Request.ServerVariables("REMOTE_ADDR")&"
"
Response.Write "操作时间:"&Now&"
"
Response.Write "操作页面:"&Request.ServerVariables("URL")&"
"
Response.Write "提交方式:POST
"
Response.Write "提交参数:"&xf_Post&"
"
Response.Write "提交数据:"&Request.Form(xf_Post)
Response.End
End If
Next
Next
End If
If Request.QueryString<>"" Then
For Each xf_Get In Request.QueryString
For xf_Xh=0 To Ubound(xf_Inf)
If Instr(LCase(Request.QueryString(xf_Get)),xf_Inf(xf_Xh))<>0 Then
Response.Write ""
Response.Write "非法操作!系统已经给你做了如下记录↓
"
Response.Write "操作IP:"&Request.ServerVariables("REMOTE_ADDR")&"
"
Response.Write "操作时间:"&Now&"
"
Response.Write "操作页面:"&Request.ServerVariables("URL")&"
"
Response.Write "提交方式:GET
"
Response.Write "提交参数:"&xf_Get&"
"
Response.Write "提交数据:"&Request.QueryString(xf_Get)
Response.End
End If
Next
Next
End If
%>
同样,再将cookies防一下,代码加在数据提交页。
if(Request.Cookies["uid"]!=null)
{
uid=Request.Cookies["uid"].value;
isnumeric cooidesID = new isnumeric();
//这是一个类
if (cooidesID.reIsnumeric(ruid))
//如果是数字就运行下面的
{
string str="select * from userTable where id="+uid;
...
}
}
3、 JSP防注入过滤代码
❾ SQL注入步骤和常用函数以及中文处理方法
第一节 SQL注入的一般步骤 首先 判断环境 寻找注入点 判断数据库类型 这在入门篇已经讲过了 其次 根据注入参数类型 在脑海中重构SQL语句的原貌 按参数类型主要分为下面三种 (A)ID= 这类注入的参数是数字型 SQL语句原貌大致如下 Select * from 表名 where 字段= 注入的参数为ID= And [查询条件] 即是生成语句 Select * from 表名 where 字段= And [查询条件](B) Class=连续剧 这类注入的参数是字符型 SQL语句原貌大致概如下 Select * from 表名 where 字段= 连续剧 注入的参数为Class=连续剧 and [查询条件] and = 即是生成语句 Select * from 表名 where 字段= 连续剧 and [查询条件] and = (C) 搜索时没过滤参数的 如keyword=关键字 SQL语句原貌大致如下 Select * from 表名 where 字段like %关键字% 注入的参数为keyword= and [查询条件] and % = 即是生成语句 Select * from 表名 where字段like % and [查询条件] and % = % 接着 将查询条件替换成SQL语句 猜解表名 例如 ID= And (Select Count(*) from Admin)>= 如果页面就与ID= 的相同 说明附加条件成立 即表Admin存在 反之 即不存在(请牢记这种方法) 如此循环 直至猜到表名为止 表名猜出来后 将Count(*)替换成Count(字段名) 用同样的原理猜解字段名 有人会说 这里有一些偶然的成分 如果表名起得很复杂没规律的 那根本就没得玩下去了 说得很对 这世界根本就不存在 %成功的黑客技术 苍蝇不叮无缝的蛋 无论多技术多高深的黑客 都是因为别人的程序写得不严密或使用者保密意识不够 才有得下手 有点跑题了 话说回来 对于SQLServer的库 还是有办法让程序告诉我们表名及字段名的 我们在高级篇中会做介绍 最后 在表名和列名猜解成功后 再使用SQL语句 得出字段的值 下面介绍一种最常用的方法-Ascii逐字解码法 虽然这种方法速度很慢 但肯定是可行的方法 我们举个例子 已知表Admin中存在username字段 首先 我们取第一条记录 测试长度 ?id= and (select top len(username) from Admin)> 先说明原理 如果top 的username长度大于 则条件成立 接着就是> > > 这样测试下去 一直到条件不成立为止 比如> 成立 > 不成立 就是len(username)= 当然没人会笨得从 一个个测试 怎么样才比较快就看各自发挥了 在得到username的长度后 用mid(username N )截取第N位字符 再asc(mid(username N ))得到ASCII码 比如 id= and (select top asc(mid(username )) from Admin)> 同样也是用逐步缩小范围的方法得到第 位字符的ASCII码 注意的是英文和数字的ASCII码在 之间 可以用折半法加速猜解 如果写成程序测试 效率会有极大的提高 第二节 SQL注入常用函数 有SQL语言基础的人 在SQL注入的时候成功率比不熟悉的人高很多 我们有必要提高一下自己的SQL水平 特别是一些常用的函数及命令 Access asc(字符)SQLServer unicode(字符)作用 返回某字符的ASCII码Access chr(数字)SQLServer nchar(数字)作用 与asc相反 根据ASCII码返回字符Access mid(字符串 N L)SQLServer substring(字符串 N L)作用 返回字符串从N个字符起长度为L的子字符串 即N到N+L之间的字符串Access abc(数字)SQLServer abc (数字)作用 返回数字的绝对值(在猜解汉字的时候会用到)Access A beeen B And CSQLServer A beeen B And C作用 判断A是否界于B与C之间 第三节 中文处理方法 在注入中碰到中文字符是常有的事 有些人一碰到中文字符就想打退堂鼓了 其实只要对中文的编码有所了解 中文恐惧症 很快可以克服 先说一点常识 Access中 中文的ASCII码可能会出现负数 取出该负数后用abs()取绝对值 汉字字符不变 SQLServer中 中文的ASCII为正数 但由于是UNICODE的双位编码 不能用函数ascii()取得ASCII码 必须用函数unicode ()返回unicode值 再用nchar函数取得对应的中文字符 了解了上面的两点后 是不是觉得中文猜解其实也跟英文差不多呢?除了使用的函数要注意 猜解范围大一点外 方法是没什么两样的 lishixin/Article/program/SQLServer/201311/22039
❿ 如何解决报表的 SQL 植入风险
SQL 注入或者 SQL 植入是 WEB 应用程序与数据库交互过程中,由于对用户输入数据的合法性、规范性检测做的不严而导致的一种常见的漏洞,这种漏洞如果被攻击者加以利用,在查询语句的结尾添加非法的 SQL 语句,就能进行非法的查询,会导致数据泄露,风险很大
报表应用作为一个 WEB 应用,同样会面临这样的风险
为了解决普通参数查询不灵活,不自由的问题,很多报表工具开放了动态拼 SQL 的功能,允许 SQL 中进行子句替换,类似这样:
SELECT … FROM T WHERE ${w}
w 就是可以根据用户需求随意拼的,比如 data>… AND date<=… AND area=…
这样查询就灵活多了,但是风险也就来了,这个 w 就会有 SQL 注入的隐患,比如:
SELECT … FROM T WHERE 1=0 UNION SELECT … FROM user
这是一句可执行的合法 SQL,但 user 表中的信息就被泄露了
怎么样解决这个问题呢?
1 尽量使用普通的 SQL 参数,不要动态拼 SQL
这样做,虽然灵活度差一点,但安全
有些报表工具不支持普通 SQL 参数,只提供拼 SQL 的方案,方便是方便了,但就要小心了
2 需要通用查询时,写复杂一点的 SQL
比如:
SELECT … FROM T WHERE (${w})
SELECT … FROM T WHERE (${w}) OR ${w}
这样做有一定的效果,但是并不完美,有些时候也防不住,而且 SQL 复杂后,会影响执行效率
3 再检查关键字
通常通用查询的条件不会有这些 select,from 等关键字,所以可以通过过滤这些关键字来防范风险,不让参数中有这些关键字的 SQL 执行,虽然这样做有时候会失去一些灵活性,但是安全性却更高了
润乾报表把这些都做好了,直接用就可以了
我们就以润乾报表为例,来简单看一下实现步骤
部署润乾报表后,在应用目录下找到 **raqsoftConfig.xml ** 文件,配置敏感词列表
属性名:disallowedParamWordList,value 为禁用敏感词列表,多个之间用逗号分隔,英文字母不区分大小写
配置列表以后,如果访问的 URL 中再出现敏感词,就会提示出错了,减少风险的发生
http://localhost:6868/demo/reportJsp/showReport.jsp?rpx=a.rpx&arg2= 华北 union select * from users
是的就这么简单,在一个已经提供了防止 SQL 注入的工具中,就是这么轻松一步设置就可以规避风险了,所以选型的时候,多问问,看看各厂商是否能解决这问题,怎么解决的,否则就得自己去费劲去修补这个漏洞了
更详细的操作以及其他解决方式请参考: 报表的 SQL 植入风险及规避方法 - 乾学院