⑴ 面试的时候,问了一个问题,什么是 防止sql注入
我来给你解释下吧。后台是查询,方法是这样的,根据你的ID查询你自己的信息
public xxx getData(string id){
string sql='select xxx from user where id='+id;
这里执行sql,返回查询结果集
}
就以这个方法举例,你肯定是要传个id,不传方法会报错,如果你传个参数“1||1==1”,猜猜传这个进去会发生什么?没错 sql就变成了 select xxx from user where id=1||1==1,这样会造成什么结果呢,查询出了所有的信息,违背了这个方法本来的意愿,甚至于泄露了其他用户的信息,如密码和一些隐私吧。
这只是一例,sql注入用处太多了,不详谈
⑵ 什么是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注入
普通用户与系统管理员用户的权限要有严格的区分。
如果一个普通用户在使用查询语句中嵌入另一个Drop Table语句,那么是否允许执行呢?由于Drop语句关系到数据库的基本对象,故要操作这个语句用户必须有相关的权限。在权限设计中,对于终端用户,即应用软件的使用者,没有必要给他们数据库对象的建立、删除等权限。那么即使在他们使用SQL语句中带有嵌入式的恶意代码,由于其用户权限的限制,这些代码也将无法被执行。故应用程序在设计的时候,
强迫使用参数化语句。
如果在编写SQL语句的时候,用户输入的变量不是直接嵌入到SQL语句。而是通过参数来传递这个变量的话,那么就可以有效的防治SQL注入式攻击。也就是说,用户的输入绝对不能够直接被嵌入到SQL语句中。与此相反,用户的输入的内容必须进行过滤,或者使用参数化的语句来传递用户输入的变量。参数化的语句使用参数而不是将用户输入变量嵌入到SQL语句中。采用这种措施,可以杜绝大部分的SQL注入式攻击。不过可惜的是,现在支持参数化语句的数据库引擎并不多。不过数据库工程师在开发产品的时候要尽量采用参数化语句。
多多使用SQL Server数据库自带的安全参数。
为了减少注入式攻击对于SQL Server数据库的不良影响,在SQLServer数据库专门设计了相对安全的SQL参数。在数据库设计过程中,工程师要尽量采用这些参数来杜绝恶意的SQL注入式攻击。
如在SQL Server数据库中提供了Parameters集合。这个集合提供了类型检查和长度验证的功能。如果管理员采用了Parameters这个集合的话,则用户输入的内容将被视为字符值而不是可执行代码。即使用户输入的内容中含有可执行代码,则数据库也会过滤掉。因为此时数据库只把它当作普通的字符来处理。使用Parameters集合的另外一个优点是可以强制执行类型和长度检查,范围以外的值将触发异常。如果用户输入的值不符合指定的类型与长度约束,就会发生异常,并报告给管理员。如上面这个案例中,如果员工编号定义的数据类型为字符串型,长度为10个字符。而用户输入的内容虽然也是字符类型的数据,但是其长度达到了20个字符。则此时就会引发异常,因为用户输入的内容长度超过了数据库字段长度的限制。
加强对用户输入的验证。
总体来说,防治SQL注入式攻击可以采用两种方法,一是加强对用户输入内容的检查与验证;二是强迫使用参数化语句来传递用户输入的内容。在SQLServer数据库中,有比较多的用户输入内容验证工具,可以帮助管理员来对付SQL注入式攻击。测试字符串变量的内容,只接受所需的值。拒绝包含二进制数据、转义序列和注释字符的输入内容。这有助于防止脚本注入,防止某些缓冲区溢出攻击。测试用户输入内容的大小和数据类型,强制执行适当的限制与转换。这即有助于防止有意造成的缓冲区溢出,对于防治注入式攻击有比较明显的效果。
如可以使用存储过程来验证用户的输入。利用存储过程可以实现对用户输入变量的过滤,如拒绝一些特殊的符号。如以上那个恶意代码中,只要存储过程把那个分号过滤掉,那么这个恶意代码也就没有用武之地了。在执行SQL语句之前,可以通过数据库的存储过程,来拒绝接纳一些特殊的符号。在不影响数据库应用的前提下,应该让数据库拒绝包含以下字符的输入。如分号分隔符,它是SQL注入式攻击的主要帮凶。如注释分隔符。注释只有在数据设计的时候用的到。一般用户的查询语句中没有必要注释的内容,故可以直接把他拒绝掉,通常情况下这么做不会发生意外损失。把以上这些特殊符号拒绝掉,那么即使在SQL语句中嵌入了恶意代码,他们也将毫无作为。
故始终通过测试类型、长度、格式和范围来验证用户输入,过滤用户输入的内容。这是防止SQL注入式攻击的常见并且行之有效的措施。
多层环境如何防治SQL注入式攻击?
在多层应用环境中,用户输入的所有数据都应该在验证之后才能被允许进入到可信区域。未通过验证过程的数据应被数据库拒绝,并向上一层返回一个错误信息。实现多层验证。对无目的的恶意用户采取的预防措施,对坚定的攻击者可能无效。更好的做法是在用户界面和所有跨信任边界的后续点上验证输入。如在客户端应用程序中验证数据可以防止简单的脚本注入。但是,如果下一层认为其输入已通过验证,则任何可以绕过客户端的恶意用户就可以不受限制地访问系统。故对于多层应用环境,在防止注入式攻击的时候,需要各层一起努力,在客户端与数据库端都要采用相应的措施来防治SQL语句的注入式攻击。
⑷ 如何从根本上防止 SQL 注入
也许可以这样回答你,如果能保证应用不使用“用户输入的字符串”来拼接成为 “向SQL 服务器发送的SQL执行字符串” 的话,就可以从根本上防止SQL注入。
一、SQL语言的机理:
1、当前主流的几大数据库服务器的数据存、取、汇总控制,都使用一种文本语句“SQL”语句。
2、当客户端需要数据,或需要发送数据,或需要汇总数据时,都可以向数据库发送这种标准的描述性文本,比如向数据库发送 “select * from bas1.dbo.tab1”就是告诉数据库,我要取“数据库bas1”中的“tab1”表中的 所有字段(用“*”通配来代表)的所有记录(因为没有加限制条件)。
二、产生SQL注入的基础:
1、如果客户端设计者没有关注SQL注入方面的问题,就有可能在将用户输入进行拼接成SQL语句,并发送到服务器端时,产生恶意的SQL可执行语句。
2、举例说明:某个网页上有个修改用户密码口令的功能,正常情况下下,用户输入原口令,与将要改成的口令,然后对用户进行修改。用户正常情况下输入简单的字串作为口令,比如“abcdef”,最终,合成向服务器发送的语句可能为:
update UserTab set password = 'abcdef' where id=222
3、然而,有个人很淘气,它输入的字串为
abcdef' --
那么,合成的发送给服务器的语句就成了:
update UserTab set password = 'abcdef' --‘ where id=222
这条句语一但发向服务器,其结果是,所有的人的密码都将变成 abcdef。
4、当然了,上面只是举了一个例子,以便于你理解什么是SQL注入。
(绝大多数应用的口令字串都是要进行加密的,所以,这个例子起仅在:
初级用户写的,明文存密码,没有注意SQL注入。这些条件合适时才起作用。)
5、同理,你可以想出很多的相关的东西,比如在修改用户姓名的地方……
三、防止SQL注入的一些办法:
1、客户端接收到用户输入后,进行一次核查,不让用户输入能产生SQL歧义的字符。比如禁止使用任何英文符号作为密码、姓名等等。
2、尽可能减少用户的直接字符的输入,通配查询,等。
⑸ 如何防止sql注入
(1)对于动态构造SQL查询的场合,可以使用下面的技术:
第一:替换单引号,即把所有单独出现的单引号改成两个单引号,防止攻击者修改SQL命令的含义。再来看前面的例子,“SELECT * from Users WHERE login = ''' or ''1''=''1' AND password = ''' or ''1''=''1'”显然会得到与“SELECT * from Users WHERE login = '' or '1'='1' AND password = '' or '1'='1'”不同的结果。
第二:删除用户输入内容中的所有连字符,防止攻击者构造出类如“SELECT * from Users WHERE login = 'mas' -- AND password =''”之类的查询,因为这类查询的后半部分已经被注释掉,不再有效,攻击者只要知道一个合法的用户登录名称,根本不需要知道用户的密码就可以顺利获得访问权限。
第三:对于用来执行查询的数据库帐户,限制其权限。用不同的用户帐户执行查询、插入、更新、删除操作。由于隔离了不同帐户可执行的操作,因而也就防止了原本用于执行SELECT命令的地方却被用于执行INSERT、UPDATE或DELETE命令。
⑵ 用存储过程来执行所有的查询。SQL参数的传递方式将防止攻击者利用单引号和连字符实施攻击。此外,它还使得数据库权限可以限制到只允许特定的存储过程执行,所有的用户输入必须遵从被调用的存储过程的安全上下文,这样就很难再发生注入式攻击了。
⑶ 限制表单或查询字符串输入的长度。如果用户的登录名字最多只有10个字符,那么不要认可表单中输入的10个以上的字符,这将大大增加攻击者在SQL命令中插入有害代码的难度。
⑷ 检查用户输入的合法性,确信输入的内容只包含合法的数据。数据检查应当在客户端和服务器端都执行——之所以要执行服务器端验证,是为了弥补客户端验证机制脆弱的安全性。
在客户端,攻击者完全有可能获得网页的源代码,修改验证合法性的脚本(或者直接删除脚本),然后将非法内容通过修改后的表单提交给服务器。因此,要保证验证操作确实已经执行,唯一的办法就是在服务器端也执行验证。你可以使用许多内建的验证对象,例如RegularExpressionValidator,它们能够自动生成验证用的客户端脚本,当然你也可以插入服务器端的方法调用。如果找不到现成的验证对象,你可以通过CustomValidator自己创建一个。
⑸ 将用户登录名称、密码等数据加密保存。加密用户输入的数据,然后再将它与数据库中保存的数据比较,这相当于对用户输入的数据进行了“消毒”处理,用户输入的数据不再对数据库有任何特殊的意义,从而也就防止了攻击者注入SQL命令。System.Web.Security.FormsAuthentication类有一个,非常适合于对输入数据进行消毒处理。
⑹ 检查提取数据的查询所返回的记录数量。如果程序只要求返回一个记录,但实际返回的记录却超过一行,那就当作出错处理。
---------------------------------------------------------------------------------------------------------------------------
关键是明白原理,其实防范很简单的,
1.过滤SQL需要的参数中的敏感字符(注意加入忽略大小写)
2.禁用数据库服务器的xp_cmdshell存储过程,删除相应用到的dll
3.屏蔽服务器异常信息
⑹ 如何防止sql注入攻击
1,避免将用户提供的输入直接放入SQL语句中,最好使用准备好的语句和参数化查询,这样更加安全。
2,不要将敏感数据保存在纯文本中,加密存储在数据库中的私有或机密数据,这样可以提供另一级保护,以防止攻击者成功地排出敏感数据。
3,将数据库用户的功能设置为最低要求,这将限制攻击者在设法获取访问权限时可以执行的操作。
4,避免直接向用户显示数据库错误,攻击者可以使用这些错误消息来获取有关数据库的信息。
5,对访问数据库的Web应用程序使用防火墙,这样可以为面向Web的应用程序提供保护,可以帮助识别SQL注入尝试;根据设置,还可以帮助防止SQL注入尝试到达应用程序。
6,定期测试与数据库交互的Web应用程序,这样做可以帮助捕获可能允许SQL注入的新错误或回归。
7,将数据库更新为最新的可用修补程序,这可以防止攻击者利用旧版本中存在的已知弱点或错误。
⑺ 面试的时候,问了一个问题,什么是 防止SQL注入
情景模拟一下:
登录的时候,黑客输入:
账号:"1or1=1"
密码:"1or1=1"
这时候,你没有做sql注入.
黑客就直接进入了你的系统了.
防sql注入,就是对用户输入的账号和密码进行过滤.过滤掉那些会对数据库产生作用的命令关键字.
/**
* sql防注入
*/
public static boolean sqlEscape(String str) {
String inj_str = "':and:exec:insert:select:delete:update:count:drop:%:chr:mid:master:truncate:char:declare:;:or:+";
String inj_stra[] = inj_str.split(":");
for (int i = 0; i < inj_stra.length; i++) {
if (str.toLowerCase().indexOf(inj_stra[i]) != -1) {
return true;
}
}
return false;
}
⑻ SQL注入怎么防范
SQL注入攻击的危害很大,而且防火墙很难对攻击行为进行拦截,主要的SQL注入攻击防范方法,具体有以下几个方面:
1、分级管理
对用户进行分级管理,严格控制用户的权限,对于普通用户,禁止给予数据库建立、删除、修改等相关权限,只有系统管理员才具有增、删、改、查的权限。
2、参数传值
程序员在书写SQL语言时,禁止将变量直接写入到SQL语句,必须通过设置相应的参数来传递相关的变量。从而抑制SQL注入。数据输入不能直接嵌入到查询语句中。同时要过滤输入的内容,过滤掉不安全的输入数据。或者采用参数传值的方式传递输入变量,这样可以最大程度防范SQL注入攻击。
3、基础过滤与二次过滤
SQL注入攻击前,入侵者通过修改参数提交and等特殊字符,判断是否存在漏洞,然后通过select、update等各种字符编写SQL注入语句。因此防范SQL注入要对用户输入进行检查,确保数据输入的安全性,在具体检查输入或提交的变量时,对于单引号、双引号、冒号等字符进行转换或者过滤,从而有效防止SQL注入。
当然危险字符有很多,在获取用户输入提交参数时,首先要进行基础过滤,然后根据程序的功能及用户输入的可能性进行二次过滤,以确保系统的安全性。
4、使用安全参数
SQL数据库为了有效抑制SQL注入攻击的影响。在进行SQLServer数据库设计时设置了专门的SQL安全参数。在程序编写时应尽量使用安全参数来杜绝注入式攻击,从而确保系统的安全性。
5、漏洞扫描
为了更有效地防范SQL注入攻击,作为系统管理除了设置有效的防范措施,更应该及时发现系统存在SQL攻击安全漏洞。系统管理员可以采购一些SQL漏洞扫描工具,通过专业的扫描工具,可以及时的扫描到系统存在的相应漏洞。
6、多层验证
现在的网站系统功能越来越庞大复杂。为确保系统的安全,访问者的数据输入必须经过严格的验证才能进入系统,验证没通过的输入直接被拒绝访问数据库,并且向上层系统发出错误提示信息。同时在客户端访问程序中验证访问者的相关输入信息,从而更有效的防止简单的SQL注入。但是如果多层验证中的下层如果验证数据通过,那么绕过客户端的攻击者就能够随意访问系统。因此在进行多层验证时,要每个层次相互配合,只有在客户端和系统端都进行有效的验证防护,才能更好地防范SQL注入攻击。
7、数据库信息加密
传统的加解密方法大致分为三种:对称加密、非对称加密、不可逆加密。
⑼ 面试的时候,问了一个问题,什么是 防止SQL注入
简单回答:防止——利用即有的应用、功能,将(恶意)SQL命令发送到到后台数据库引擎。
----------详述,及关键要点,有耐心可以看一看--------
-------(下面的论述,要看懂需要有基本的SQL数据库编程和操作知识,本人实际经验,仅供参考)------
1、SQL语言在当前主要用于数据库管理系统软件中,进行数据查询、分析、汇总等等,但一些高级别的数据库管理系统还存在一些非常高级的能力,可以以向它发送SQL指令的方法让它干一些特别的事,甚至出格的事,比如起动某个应用程序等,具体的能力视“数据库管理系统”(也称“数据库引擎”)而定。一些通用的数据库指令有时也能干出一些出格的事,比如创建用户、修改用户(特别是管理员用户)基础信息(比如密码)等。
2、其实,一般而言,绝大多数没有学过电脑与数据库的人是不懂得SQL语言的。也就是说,一般的客户端使用者总是按设计者的预设以点击或输入常规信息的方法来与电脑进行交互,进而将数据传给客户端,客户端合成SQL指令后向“数据库引擎”获取或提交数据。
3、但是因为SQL指令是一种纯文本的字串,在某些特定情况下,操作者输入的字串经客户端合成后,会异化成能让“数据库引擎”误读的指令。
4、举个简单的例子进行说明吧:
----**********************-----
A、设计者预先的设计,用户输入条件,'其他费用'(或别的字串),就查出 ABA02字段 中值为‘其它费用’(或别的字串)的数据。预期合成后发向服务器的字串为:
SELECT*FROMABA1A
WHEREABA02='其他费用'
B、但是,输入者并不按预期的输入,而是输入可以合成恶意SQL语句的字串,那么,我们来看看会发生什么事。
合成SQL的代码一般是:
"SELECT*FROMABA1AWHEREABA02='"+用户输入字串+"'"
现在用户输入
"其他费用';DELETE[!AY_LS]WHERE'0'='0"
代入上一行,变成:
"SELECT*FROMABA1AWHEREABA02='"+"其他费用';DELETE[!AY_LS]WHERE'0'='0"+"'"
最终合成的SQL字串就是:
SELECT*FROMABA1AWHEREABA02
='其他费用';DELETE[LSTAB]WHERE'0'='0'
能看懂SQL的人就明白了,这个字串如果发向“数据库引擎”,结果是,查出数据之外,还将LSTAB这个数据表中所有的数据进行了删除,这根本不是设计者预先所需要的。
----**********************-----
5、更多的相关的发挥你可以自个去想,有的SQL语句利用“数据库引擎”的能力可以产生相当可怕的后果。产生这种“SQL注入”的可能,是因为设计者没有客户输入后,合成SQL语句时,可能有“SQL注入”进行猜测与预想。另一方面,“SQL注入”的实现往往需要客户对SQL数据库有相当的了解。
6、防止SQL注入最基本的要点就是,破坏用户的输入可能合成有效的SQL语句的可能。做法有很多,比如限制输入的长度,限制输入特定的字符,对用户输入的数据进行预检,不让用户自由输入,只能输入关键词并转码为特定数值,等等。
7、最常规的,违范的做法就是,不让用户自由输入条件字串,只能输入特定的条件,这是防SQL注入的最好办法。实在需要自由输入的情况下,一定要做预判,不让自由输入的字串能合成有效SQL语句。比如,最简单的禁止中存在“空格”这样,就无法合成有效的无错的SQL语句了,等等!
8、“SQL注入”不但在网页输入中可能存在,在其它的,只要涉及用户输入与“数据库引擎”的情况下,都可能存在!另外,网页提交中,有些非常规的方法可以绕过正常的方式输入,比如直接在浏览器网址处输入特定字串,以直接post数据等。
⑽ 怎样防止sql注入
可以使用变量绑定的方式就可以防止sql注入,如果是直接拼接的方式那么就非常容易被注入。比如:select * from tablename where user='admin' and pwd ='123' 假设说这个是一个登录的sql语句,admin是用户文本框输入的,pwd是密码框输入的。如果密码文本框如果输入:' or '1'='1 那么拼接起sql就是select * from tablename where user='admin' and pwd ='' or '1'='1' 那么就会跳过sql的条件就直接进入登录,但是如果是使用绑定变量的就不一样
如下:
select * from tablename where user=@user and pwd =@pwd
@user=admin
@pwd=123
这样的话不管user和pwd传入的是什么内容都被sql server识别成字符串而不是直接拼接在sql 语句上。