什么是sql注入,如何防止sql注入

作者&投稿:僪谈 (若有异议请与网页底部的电邮联系)
什么是SQL注入,如何防止SQL注入?~

所谓SQL注入,就是通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令。具体来说,它是利用现有应用程序,将(恶意)的SQL命令注入到后台数据库引擎执行的能力,它可以通过在Web表单中输入(恶意)SQL语句得到一个存在安全漏洞的网站上的数据库,而不是按照设计者意图去执行SQL语句。比如先前的很多影视网站泄露VIP会员密码大多就是通过WEB表单递交查询字符暴出的,这类表单特别容易受到SQL注入式攻击.
防护
归纳一下,主要有以下几点:
1.永远不要信任用户的输入。对用户的输入进行校验,可以通过正则表达式,或限制长度;对单引号和
双"-"进行转换等。
2.永远不要使用动态拼装sql,可以使用参数化的sql或者直接使用存储过程进行数据查询存取。
3.永远不要使用管理员权限的数据库连接,为每个应用使用单独的权限有限的数据库连接。
4.不要把机密信息直接存放,加密或者hash掉密码和敏感的信息。
5.应用的异常信息应该给出尽可能少的提示,最好使用自定义的错误信息对原始错误信息进行包装
6.sql注入的检测方法一般采取辅助软件或网站平台来检测,软件一般采用sql注入检测工具jsky,网站平台就有亿思网站安全平台检测工具。MDCSOFT SCAN等。采用MDCSOFT-IPS可以有效的防御SQL注入,XSS攻击等。

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注入,就是通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令。具体来说,它是利用现有应用程序,将(恶意)的SQL命令注入到后台数据库引擎执行的能力,它可以通过在Web表单中输入(恶意)SQL语句得到一个存在安全漏洞的网站上的数据库,而不是按照设计者意图去执行SQL语句。比如先前的很多影视网站泄露VIP会员密码大多就是通过WEB表单递交查询字符暴出的,这类表单特别容易受到SQL注入式攻击.


SQL注入攻击实例:


比如在一个登录界面,要求输入用户名和密码:

可以这样输入实现免帐号登录:

用户名: ‘or 1 = 1 –

密 码:

点登陆,如若没有做特殊处理,那么这个非法用户就很得意的登陆进去了.(当然现在的有些语言的数据库API已经处理了这些问题)

这是为什么呢? 下面我们分析一下:

从理论上说,后台认证程序中会有如下的SQL语句:

String sql = "select * from user_table where username=

' "+userName+" ' and password=' "+password+" '";

当输入了上面的用户名和密码,上面的SQL语句变成:

SELECT * FROM user_table WHERE username=

'’or 1 = 1 -- and password='’

分析SQL语句:

条件后面username=”or 1=1 用户名等于 ” 或1=1 那么这个条件一定会成功;

然后后面加两个-,这意味着注释,它将后面的语句注释,让他们不起作用,这样语句永远都能正确执行,用户轻易骗过系统,获取合法身份。

这还是比较温柔的,如果是执行

SELECT * FROM user_table WHERE

username='' ;DROP DATABASE (DB Name) --' and password=''

….其后果可想而知…

防SQL注入:

下面我针对JSP,说一下应对方法:

1.(简单又有效的方法)PreparedStatement

采用预编译语句集,它内置了处理SQL注入的能力,只要使用它的setXXX方法传值即可。

使用好处:

(1).代码的可读性和可维护性.

(2).PreparedStatement尽最大可能提高性能.

(3).最重要的一点是极大地提高了安全性.

原理:

sql注入只对sql语句的准备(编译)过程有破坏作用

而PreparedStatement已经准备好了,执行阶段只是把输入串作为数据处理,

而不再对sql语句进行解析,准备,因此也就避免了sql注入问题.

2.使用正则表达式过滤传入的参数

要引入的包:

import java.util.regex.*;

正则表达式:

private String CHECKSQL = “^(.+)\\sand\\s(.+)|(.+)\\sor(.+)\\s$”;

判断是否匹配:

Pattern.matches(CHECKSQL,targerStr);

下面是具体的正则表达式:

检测SQL meta-characters的正则表达式 :

/(\%27)|(\’)|(\-\-)|(\%23)|(#)/ix

修正检测SQL meta-characters的正则表达式 :/((\%3D)|(=))[^
]*((\%27)|(\’)|(\-\-)|(\%3B)|(:))/i

典型的SQL 注入攻击的正则表达式 :/\w*((\%27)|(\’))((\%6F)|o|(\%4F))((\%72)|r|(\%52))/ix

检测SQL注入,UNION查询关键字的正则表达式 :/((\%27)|(\’))union/ix(\%27)|(\’)

检测MS SQL Server SQL注入攻击的正则表达式:

/exec(\s|\+)+(s|x)p\w+/ix

等等…..

3.字符串过滤

比较通用的一个方法:

(||之间的参数可以根据自己程序的需要添加)

public static boolean sql_inj(String str)
{
String inj_str = "'|and|exec|insert|select|delete|update|
count|*|%|chr|mid|master|truncate|char|declare|;|or|-|+|,";
String inj_stra[] = split(inj_str,"|");
for (int i=0 ; i < inj_stra.length ; i++ )
{
if (str.indexOf(inj_stra[i])>=0)
{
return true;
}
}
return false;
}


SQL注入:利用现有应用程序,将(恶意)的SQL命令注入到后台数据库引擎执行的能力,这是SQL注入的标准释义。


什么是sql注入,怎么防止sql注入
原理 SQL注入攻击指的是通过构建特殊的输入作为参数传入Web应用程序,而这些输入大都是SQL语法里的一些组合,通过执行SQL语句进而执行攻击者所要的操作,其主要原因是程序没有细致地过滤用户输入的数据,致使非法数据侵入系统。根据相关技术原理,SQL注入可以分为平台层注入和代码层注入。前者由不安全的数据库...

什么是sql注入?如何注入的呢?
SQL注入一定意义上可能是目前互联网上存在的最丰富的编程缺陷,是未经授权的人可以访问各种关键和私人数据的漏洞。 SQL注入不是Web或数据库服务器中的缺陷,而是由于编程实践较差且缺乏经验而导致的。 它是从远程位置执行的最致命和最容易的攻击之一。from 树懒学堂 ...

什么是sql注入?sql注入有哪些方式?防止sql注入又有哪些方式(.Net下...
所谓SQL注入,其实是程序漏洞,没有什么技术,比如下面的语句就可能被注入 SQL="SELECT * FROM ADMIN WHERE USER='" &REQUEST("USER")& "' AND PASS ='" &REQUEST("PASS")& "'"别人可以精心设计一个PASS参数提交给你,使得你的SQL完成其它功能,例如PASS的值为:abc' OR USER='admin 这时候...

制作网站时,SQL注入是什么?怎么注入法?
第二步:对于注入分析器的防范,笔者通过实验,发现了一种简单有效的防范方法。首先我们要知道SQL注入分析器是如何工作的。在操作过程中,发现软件并不是冲着“admin”管理员账号去的,而是冲着权限(如flag=1)去的。这样一来,无论你的管理员账号怎么变都无法逃过检测。第三步:既然无法逃过检测,那...

什么是SQL注入
通俗的说,就是攻击者想不经过主人的同意,就获取你的数据库里面的数据,首先打开想要攻击的动态网页,在网页输入地址栏里面,直接输入SQL的命令,回车,就可以访问到数据库里的数据。这样SQL命令通过网页的地址栏,跟着网页地址一起被提交到表单,就叫SQL注入。

SQL注入是怎么回事
SQL注入攻击的步骤一、SQL注入漏洞的判断 一般来说,SQL注入一般存在于形如:http:\/\/xxx.xxx.xxx\/abc.asp?id=XX等带有参数的ASP动态网页中,有时一个动态网页中可能只有一个参数,有时可能有N个参数,有时是整型参数,有时是字符串型参数,不能一概而论。总之只要是带有参数的动态网页且此网页访问了数据库,那么就...

什么是sql 注入,如何实现注入?
当然,这只是传入参数是数字型的时候用的判断方法,实际应用的时候会有字符型和搜索型参数,我将在中级篇的“SQL注入一般步骤”再做分析。 第三节、判断数据库类型及注入方法 不同的数据库的函数、注入方法都是有差异的,所以在注入之前,我们还要判断一下数据库的类型。一般ASP最常搭配的数据库是Access和SQLServer,...

什么是SQL注入式攻击 如何防范
上面这条语句是很普通的一条SQL语句,他主要实现的功能就是让用户输入一个员工编号然后查询处这个员工的信息。但是若这条语句被不法攻击者改装过后,就可能成为破坏数据的黑手。如攻击者在输入变量的时候,输入以下内容SA001’;drop table c_order--。那么以上这条SQL语句在执行的时候就变为了SELECT * FROM Users WHE...

sql注入是什么
SQL注入攻击是通过操作输入来修改SQL语句,用以达到执行代码对WEB服务器进行攻击的方法。简单的说就是在post\/getweb表单、输入域名或页面请求的查询字符串中插入SQL命令,最终使web服务器执行恶意命令的过程。可以通过一个例子简单说明SQL注入攻击。假设某网站页面显示时URL为http:\/\/www.example.com?test=...

sql如何注入sql如何注入漏洞
教学用SQL注入 sql注入,简单来说就是网站在执行sql语句的时候,采用拼接sql的方法来执行sql语句。所有的变量值都是从前台传过来的,执行时直接拼接。比如用户输入账号密码,后台查询用户表,比较账号和密码是否正确。在java中,定义要执行的sql,如下所示:stringloginname=request.getparameter(名称 string...

南江县15269997639: 什么是sql注入,如何防止sql注入 -
费若山绿: sql注入其实就是在这些不安全控件内输入sql或其他数据库的一些语句,从而达到欺骗服务器执行恶意到吗影响到数据库的数据.防止sql注入,可以在接受不安全空间的内容时过滤掉接受字符串内的“'”,那么他不再是一条sql语句,而是一个类...

南江县15269997639: 什么是sql注入,怎么防止sql注入 -
费若山绿: 原理 SQL注入攻击指的是通过构建特殊的输入作为参数传入Web应用程序,而这些输入大都是SQL语法里的一些组合,通过执行SQL语句进而执行攻击者所要的操作,其主要原因是程序没有细致地过滤用户输入的数据,致使非法数据侵入系统...

南江县15269997639: 什么叫做SQL注入,如何防止 -
费若山绿: sql注入就是,通过语句的连接做一些不是你想要的操作.. 举个例子你就懂了 例如你要查询id=1的记录, 直接连接就是这样"select * from tableName where id=1" 别人可以写成"select * from tableName where id=1;delete from tableName" 这样就把你的表数据全部删除了.就是加个;继续写脚本, 当然,这只是个例子..还能做其他操作,比如获取你数据库的用户名,密码什么的,那就惨了,, 传参的方式可以防止注入"select * from tableName where id=@id" 然后给@id赋值,就ok啦

南江县15269997639: 防止sql注入有什么比较可靠的方法 -
费若山绿: 要防止SQL注入其实不难,你知道原理就可以了. 所有的SQL注入都是从用户的输入开始的.如果你对所有用户输入进行了判定和过滤,就可以防止SQL注入了.用户输入有好几种,我就说说常见的吧. 文本框、地址栏里***.asp?中?号后面...

南江县15269997639: 什么叫sql注入,如何防止sql注入 -
费若山绿: 可以使用变量绑定的方式就可以防止sql注入,如果是直接拼接的方式那么就非常容易被注入.比如:select * from tablename where user='admin' and pwd ='123' 假设说这个是一个登录的sql语句,admin是用户文本框输入的,pwd是密码框输入的...

南江县15269997639: 什么是sql注入?sql注入有哪些方式?防止sql注入又有哪些方式(.Net下) -
费若山绿: 所谓SQL注入,其实是程序漏洞,没有什么技术,比如下面的语句就可能被注入 SQL="SELECT * FROM ADMIN WHERE USER='" &REQUEST("USER")& "' AND PASS ='" &REQUEST("PASS")& "'"别人可以精心设计一个PASS...

南江县15269997639: 如何从根本上防止 SQL 注入 -
费若山绿: SQL注入并不是一个在SQL内不可解决的问题,这种攻击方式的存在也不能完全归咎于SQL这种语言,因为注入的问题而放弃SQL这种方式也是因噎废食.首先先说一个我在其他回答中也曾提到过的观点:没有(运行时)编译,就没有注入. ...

南江县15269997639: 什么是sql注入,怎么防止注入? -
费若山绿: 有人喜欢拼接sql字符串,通过向sql中填入“恒为真”的部分达到获取信息甚至破环的目的. 如: -----下面这一段是找的 username = request("username") //获取用户名 这里是通过URL传值获取的 password = request("password") //获取密码 ...

南江县15269997639: 如何防止SQL注入 -
费若山绿: 防止sql注入的方式是获取数据的时候尽可能使用参数化的查询或者是使用存储过程或者函数等 比如:select * from student where stuid=@stuid 参数化的查询需要后端的各语言如jsp.aps.net等的支持.存储过程或者函数在数据库端可以解决部分注入功能.

南江县15269997639: 面试的时候,问了一个问题,什么是 防止SQL注入 -
费若山绿:简单回答:防止——利用即有的应用、功能,将(恶意)SQL命令发送到到后台数据库引擎. ----------详述,及关键要点,有耐心可以看一看-------- -------(下面的论述,要看懂需要有基本的SQL数据库编程和操作知识,本人实际经验...

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网