精华内容
下载资源
问答
  • 1、什么是SQL注入 SQL注入是一种注入攻击,可以执行恶意SQL语句,它通过将任意SQL代码插入数据库查询,使攻击者能够完全控制WEB应用程序后面的数据库服务器,攻击者可以使用SQL注入漏洞绕过应用程序安全措施;可以绕...

    1、什么是SQL注入

    SQL注入是一种注入攻击,可以执行恶意SQL语句,它通过将任意SQL代码插入数据库查询,使攻击者能够完全控制WEB应用程序后面的数据库服务器,攻击者可以使用SQL注入漏洞绕过应用程序安全措施;可以绕过网页或WEB应用程序的身份验证和授权,并检索中整个SQL数据库的内容;还可以使用SQL注入来添加、修改和删除数据库中的记录。
    简单来说:SQL注入是一种将SQL代码添加到输入参数中,传递到SQL服务器解析并执行的一种攻击手法,输入参数未经过过滤,直接拼接到SQL语句中,解析执行,达到预想之外的行为。

    2、#{}如何防止SQL注入

    (1)parameterType: 在映射文件中通过parameterType指定输入参数的类型
    (2)resultType: 在映射文件中通过resultType指定输出结果的类型
    (3)${}和#{}

    1)#{}

    • #{}表示一个占位符。#{}接收输入参数,类型可以是简单类型、pojo、hashMap,如果接收简单类型,#{}中可以写成value或其他名称
    • 为什么用#{}而不用?代表占位符

    因为框架将SQL和程序代码分开,所以无法直接确认参数的含义

    • #{}接收pojo对象值,通过OGNL读取对象中的属性值,通过属性.属性.属性的方式获取对象属性值

    2)${}

    • ${}表示一个拼接符号,会引起SQL注入,所以不建议使用
    • ${}接收输入参数,类型可以是简单类型、pojo、hashmap,如果接收简单类型,${}中只能写成value
    • ${}接收pojo对象值,通过OGNL读取对象中的属性值,通过属性.属性.属性的方式获取对象属性值

    注意: 如果我们传递过来的参数只是一个简单类型(例如String、Integer等,并没有封装多个属性的叫做简单类型,而封装多个属性并且提供了setter和getter的叫做封装类型。Map是封装类型,取值可以根据key取值),并且有多个#{}(名称可以任取),那么这里所有#{}占位符的最终获取值都相同。
    一般${}用在我们能够确定值的地方,也就是我们程序员自己赋值的地方,而#{}一般用在用户输入值的地方

    • 默认情况下,使用#{}语法,Mybatis会产生PreparedStatement语句中,并且安全的设置PreparedStatement参数,这个过程中Mybatis会进行必要的安全检查和转义
    • #相当于对数据加上双引号,$相当于直接显示数据

    综上,${}方式会引发SQL注入的问题,同时也会影响SQL语句的预编译,所以从安全性和性能的角度出发,应尽量使用#{}
    ${}在什么情况下使用呢?

    • 有时候可能需要直接插入一个不做任何修改的字符到SQL语句中,这个时候可以使用${}

    【重要:】
    Mybatis框架作为一款半自动化的持久层框架,其SQL语句都要我们自己动手编写,这和个时候当然要防止SQL注入。其实,Mybatis的SQL是一个具有“输入+输出”的功能,类似于函数的结构。如下:

    <select id="getBlogById" resultType="Blog" parameterType="int">
    	select id,title,author,content
    	from blog
    	where id=#{id}
    </select>
    

    想防止SQL注入,理所当然的要在输入参数上下功夫,上面SQL传入参数后,打印出执行的SQL语句,会看到是这样的:

    select id,title,author,content from blog where id= ?
    

    不管输入什么参数,打印出的SQL都是这样的,因为Mybatis启用了预编译功能,在SQL执行前,会先将上面的SQL发送给数据库进行编译,执行时,直接使用编译好的SQL,替换占位符?就可以了,因为 SQL注入只能对编译过程起作用 ,所以这样的方式就能很好的避免SQL注入的问题。
    在Mybatis中,${}这样格式的参数会直接参与SQL编译,从而不能避免注入攻击 。但涉及到动态表名和列名时,只能使用${}这样的参数格式,所以这样的参数需要我们在代码中手工进行处理来防止注入。

    【底层实现原理】
    Mybatis是如何做到SQL预编译的呢?
    其实在框架底层,是JDBC中的PreparedStatement类在起作用,PreparedStatement是我们很熟悉的Statement的子类,他的对象包含了编译好的SQL语句,这种准备好的方式不仅能提高安全性,而且在多次执行同一个SQL时,能够提高效率。原因是SQL已编译好,再次执行时无需在编译。

    在这里插入图片描述

    展开全文
  • 如何防止sql注入

    2018-09-09 20:47:00
    SQL注入是比较常见的网络攻击方式之一,它不是利用操作系统的BUG来实现攻击,而是针对程序员编写时的...第一种采用预编译语句集,它内置了处理SQL注入的能力,只要使用它的setString方法传值即可: String sql= "...

      SQL注入是比较常见的网络攻击方式之一,它不是利用操作系统的BUG来实现攻击,而是针对程序员编写时的疏忽,通过SQL语句,实现无账号登录,甚至篡改数据库。

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

    String sql= "select * from users where username=? and password=?;
            PreparedStatement preState = conn.prepareStatement(sql);
            preState.setString(1, userName);
            preState.setString(2, password);
            ResultSet rs = preState.executeQuery();

      第二种是采用正则表达式将包含有 单引号('),分号(;) 和 注释符号(--)的语句给替换掉来防止SQL注入:

            public static String TransactSQLInjection(String str)
            {
                  return str.replaceAll(".*([';]+|(--)+).*", " ");
    
            }
    
            userName=TransactSQLInjection(userName);
            password=TransactSQLInjection(password);
    
            String sql="select * from users where username='"+userName+"' and password='"+password+"' "
            Statement sta = conn.createStatement();
            ResultSet rs = sta.executeQuery(sql);

      第三种 使用Hibernate框架的SQL注入防范 Hibernate是目前使用最多的ORM框架,在Java Web开发中,很多时候不直接使用JDBC,而使用Hibernate来提高开发效率。

      在Hibernate中,仍然不应该通过拼接HQL的方式,而应使用参数化的方式来防范SQL注入。有两种方式,一种仍然是使用JDBC一样的占位符“?”,但更好的方式是使用Hibernate的命名参数,例如检测用户名和密码是否正确,使用Hibernate可以写成:

    String queryStr = “from user where username=:username ”+”password=:password”;
        List result = session.createQuery(queryStr).setString("username", username).setString("password", password).list();

     

    转载于:https://my.oschina.net/9527k/blog/2032428

    展开全文
  • sql注入:利用现有应用程序,将(恶意)的SQL命令注入到后台数据库执行一些恶意的操作 防止策略: 1.严格限制Web应用的数据库的操作权限,给此用户提供仅仅能够满足其工作的最低权限,从而最大限度的减少注入攻击...

    sql注入:利用现有应用程序,将(恶意)的SQL命令注入到后台数据库执行一些恶意的操作

    止策略 

    1.严格限制Web应用的数据库的操作权限,给此用户提供仅仅能够满足其工作的最低权限,从而最大限度的减少注入攻击对数据库的危害; 
    2检查输入的数据是否具有所期望的数据格式,严格限制变量的类型 ;
    3.对进入数据库的特殊字符(’”\尖括号&*;等)进行转义处理,或编码转换。

    转载于:https://www.cnblogs.com/zlbk123/p/11162069.html

    展开全文
  • 主要原因是程序对用户输入数据的合法性没有判断和处理,导致攻击者可以在 Web 应用程序中事先定义好的 SQL 语句中添加额外的 SQL 语句,在管理员不知情的情况下实现非法操作,以此来实现欺骗数据库服务器执行非授权...

    SQL 注入(SQL Injection)是发生在 Web 程序中数据库层的安全漏洞,是网站存在最多也是最简单的漏洞。主要原因是程序对用户输入数据的合法性没有判断和处理,导致攻击者可以在 Web 应用程序中事先定义好的 SQL 语句中添加额外的 SQL 语句,在管理员不知情的情况下实现非法操作,以此来实现欺骗数据库服务器执行非授权的任意查询,从而进一步获取到数据信息。

    简而言之,SQL 注入就是在用户输入的字符串中加入 SQL 语句,如果在设计不良的程序中忽略了检查,那么这些注入进去的 SQL 语句就会被数据库服务器误认为是正常的 SQL 语句而运行,攻击者就可以执行计划外的命令或访问未被授权的数据。
    SQL 注入已经成为互联网世界 Web 应用程序的最大风险,我们有必要从开发、测试、上线等各个环节对其进行防范。下面介绍 SQL 注入的原理及避免 SQL 注入的一些方法。

    SQL注入的原理

    SQL 注入的原理主要有以下 4 点:

    1)恶意拼接查询

    我们知道,SQL 语句可以查询、插入、更新和删除数据,且使用分号来分隔不同的命令。例如:

    SELECT * FROM users WHERE user_id = $user_id
    

    其中,user_id 是传入的参数,如果传入的参数值为“1234; DELETE FROM users”,那么最终的查询语句会变为:

    SELECT * FROM users WHERE user_id = 1234; DELETE FROM users
    

    如果以上语句执行,则会删除 users 表中的所有数据。

    2)利用注释执行非法命令。

    SQL 语句中可以插入注释。例如:

    SELECT COUNT(*) AS 'num' FROM game_score WHERE game_id=24411 AND version=$version
    

    如果 version 包含了恶意的字符串’-1’ OR 3 AND SLEEP(500)–,那么最终查询语句会变为:

    SELECT COUNT(*) AS 'num' FROM game_score WHERE game_id=24411 AND version='-1' OR 3 AND SLEEP(500)--
    

    以上恶意查询只是想耗尽系统资源,SLEEP(500) 将导致 SQL 语句一直运行。如果其中添加了修改、删除数据的恶意指令,那么将会造成更大的破坏。

    3)传入非法参数

    SQL 语句中传入的字符串参数是用单引号引起来的,如果字符串本身包含单引号而没有被处理,那么可能会篡改原本 SQL 语句的作用。 例如:

    SELECT * FROM user_name WHERE user_name = $user_name
    

    如果 user_name 传入参数值为 G’chen,那么最终的查询语句会变为:

    SELECT * FROM user_name WHERE user_name ='G'chen'
    

    一般情况下,以上语句会执行出错,这样的语句风险比较小。虽然没有语法错误,但可能会恶意产生 SQL 语句,并且以一种你不期望的方式运行。

    4)添加额外条件

    在 SQL 语句中添加一些额外条件,以此来改变执行行为。条件一般为真值表达式。例如:

    UPDATE users SET userpass='$userpass' WHERE user_id=$user_id;
    

    如果 user_id 被传入恶意的字符串“1234 OR TRUE”,那么最终的 SQL 语句会变为:

    UPDATE users SET userpass= '123456' WHERE user_id=1234 OR TRUE;
    

    这将更改所有用户的密码。

    避免SQL注入

    对于 SQL 注入,我们可以采取适当的预防措施来保护数据安全。下面是避免 SQL 注入的一些方法。

    1. 过滤输入内容,校验字符串

    过滤输入内容就是在数据提交到数据库之前,就把用户输入中的不合法字符剔除掉。可以使用编程语言提供的处理函数或自己的处理函数来进行过滤,还可以使用正则表达式匹配安全的字符串。

    如果值属于特定的类型或有具体的格式,那么在拼接 SQL 语句之前就要进行校验,验证其有效性。比如对于某个传入的值,如果可以确定是整型,则要判断它是否为整型,在浏览器端(客户端)和服务器端都需要进行验证。

    2. 参数化查询

    参数化查询目前被视作是预防 SQL 注入攻击最有效的方法。参数化查询是指在设计与数据库连接并访问数据时,在需要填入数值或数据的地方,使用参数(Parameter)来给值。

    MySQL 的参数格式是以“?”字符加上参数名称而成,如下所示:

    UPDATE myTable SET c1 = ?c1, c2 = ?c2, c3 = ?c3 WHERE c4 = ?c4
    

    在使用参数化查询的情况下,数据库服务器不会将参数的内容视为 SQL 语句的一部分来进行处理,而是在数据库完成 SQL 语句的编译之后,才套用参数运行。因此就算参数中含有破坏性的指令,也不会被数据库所运行。

    3. 安全测试、安全审计

    除了开发规范,还需要合适的工具来确保代码的安全。我们应该在开发过程中应对代码进行审查,在测试环节使用工具进行扫描,上线后定期扫描安全漏洞。通过多个环节的检查,一般是可以避免 SQL 注入的。

    有些人认为存储过程可以避免 SQL 注入,存储过程在传统行业里用得比较多,对于权限的控制是有一定用处的,但如果存储过程用到了动态查询,拼接 SQL,一样会存在安全隐患。

    下面是在开发过程中可以避免 SQL 注入的一些方法。

    1. 避免使用动态SQL
    避免将用户的输入数据直接放入 SQL 语句中,最好使用准备好的语句和参数化查询,这样更安全。

    2. 不要将敏感数据保留在纯文本中
    加密存储在数据库中的私有/机密数据,这样可以提供了另一级保护,以防攻击者成功地排出敏感数据。

    3. 限制数据库权限和特权
    将数据库用户的功能设置为最低要求;这将限制攻击者在设法获取访问权限时可以执行的操作。

    4. 避免直接向用户显示数据库错误
    攻击者可以使用这些错误消息来获取有关数据库的信息。

    一些编程框架对于写出更安全的代码也有一定的帮助,因为它提供了一些处理字符串的函数和使用查询参数的方法。但同样,你仍然可以编写出不安全的 SQL 语句。所以归根到底,我们需要有良好的编码规范,并能充分利用参数化查询、字符串处理和参数校验等多种办法来保护数据库和程序的安全。

    说明:SQL 注入技术不是单凭一篇文章就可以讲完的,这里只带领大家掌握 SQL 注入的原理及常见的几种防止 SQL 注入的方法。

    展开全文
  • MyBatis如何SQL注入

    2019-08-15 15:49:10
    MyBatis如何SQL注入: 这一节来讲下MyBatis的防SQL注入SQL注入大多数也会比较清楚,就是SQL参数对应的字段值时插入混合SQL,如 ** username = or 1= 1** 这种,如果有更恶劣的,带上drop database 这种都是有...
  • 如何防止SQL注入

    2018-03-21 14:39:42
    对于很多网站都有用户提交表单的端口,提交的数据插入MySQL数据库中,就有可能发生SQL注入安全问题,那么,如何防止SQL注入呢?针对SQL注入安全问题的预防,需时刻认定用户输入的数据是不安全的,并对用户输入的数据...
  • 如何防止SQL注入

    千次阅读 2017-11-09 16:43:21
    SQL注入攻击的危害这么大,那么该如何来防治呢?下面这些建议或许对防治SQL注入有一定的帮助。 严格限制Web应用的数据库的操作权限,给此用户提供仅仅能够满足其工作的最低权限,从而最大限度的减少注入攻击对...
  • 所谓SQL注入,就是通过把SQL命令插入到Web表单递交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令。 我们永远不要信任用户的输入,我们必须认定用户输入的数据都是不安全的,我们都...
  • SQL注入最简单也是最常见的例子就是用户登陆这一模块,如果用户对SQL有一定的了解,同时系统并没有做防止SQL注入处理,用户可以在输入的时候加上’两个冒号作为特殊字符,这样的话会让计算机认为他输入的是SQL语句的...
  • ${}这种则不会预编译,直接当成字符串拼成SQL,会被注入 预编译功能依赖具体DB实现,有些没有实现这个功能 预编译的目的: 1. 提高性能 2. 避免注入 如何提高性能? 在使用PreparedStatement执行SQL命令时,命令会...
  • //php防注入和XSS攻击通用过滤.  //by qq:831937 $_GET &amp;&amp; SafeFilter($_GET); $_POST &amp;&amp; SafeFilter($_POST); $_COOKIE &amp;&amp; SafeFilter($_COOKIE);   ...
  • MyBatis如何防止SQL注入

    2017-09-25 15:21:00
    SQL注入是一种常见的攻击方式,攻击者或者误操作者通过表单信息或者URL输入一些异常的参数,传入服务端进行SQL处理,可能会出现这样的情况delete from app_poi where poi_id = (输入参数): 输入参数:10 or 1 = 1 ...
  • python如何防止sql注入

    2019-08-07 21:32:19
    漏洞产生的原因最常见的就是字符串拼接了,当然,sql注入并不只是拼接一种情况,还有像宽字节注入,特殊字符转义等等很多种,这里就说说最常见的字符串拼接,这也是初级程序员最容易犯的错误。 首先咱们定义一个类...
  • 如何预防SQL注入***?

    2018-03-21 14:44:53
    对于很多网站都有用户提交表单的端口,提交的数据插入MySQL数据库中,就有可能发生SQL注入安全问题,那么,如何防止SQL注入呢?针对SQL注入安全问题的预防,需时刻认定用户输入的数据是不安全的,并对用户输入的数据...
  • SQL注入最简单也是最常见的例子就是用户登陆这一模块,如果用户对SQL有一定的了解,同时系统并没有做防止SQL注入处理,用户可以在输入的时候加上’两个冒号作为特殊字符,这样的话会让计算机认为他输入的是SQL语句的...
  • 如何预防SQL注入

    2009-04-13 15:50:00
    以前我出去面试时,人家问我什么叫SQL注入,我很迷芒的告诉人家:我不知道,因为我从来没有遇到过这类情况。后来随着SQL注入渐入流行,我才发现,其实SQL注入是因为程序员写程序时的不良习惯导致的一类漏洞的总称。...
  • 总结:总的来说,防范一般的SQL注入只要在代码规范上下点功夫就能预防 1.使用预编译绑定变量的SQL语句 2.严格加密处理用户的机密信息 3.不要随意开启生产环境中Webserver的错误显示 4.使用正则表达式过滤传入的参数 5...
  • 2. 请谈如何防止SQL注入防止SQL注入,我们需要注意以下几个要点: 请说一下你开发中如何防止SQL注入? 3. java如何防止后台的SQL注入 请写出以下注解及相关属性的作用,写到笔记上 @Repository @Service @...
  • JDBC的SQL注入攻击

    2020-06-05 14:51:57
    SQL注入问题1、SQL注入原理1.1 SQL注入攻击:1.2 SQL注入案例1.3 SQL注入分析2、如何处理SQL注入问题2.1 PreparedStatement预编译的机制2.2 PreparedStatement的优点2.3 PerparedStatement的使用3、SQL防注入案例 ...
  • java如何防止sql注入

    千次阅读 2010-11-14 22:45:00
    <br />采用预编译语句集,它内置了处理SQL注入的能力,只要使用它的setString方法传值即可:  String sql= "select * from users where username=? and password=?;  PreparedStatement preState ...
  • 对于很多网站都有用户提交表单的端口,提交的数据插入MySQL数据库中,就有可能发生SQL注入安全问题,那么,如何防止SQL注入呢?针对SQL注入安全问题的预防,需时刻认定用户输入的数据是不安全的,并对用户输入的数据...
  • 1. 绪言 想要学习mybatis的相关知识...操作数据库实现增删改查:获取statement,执行SQL语句,处理执行结果 简单的连接和查询示例如下: import java.sql.*; public class Test { private static final String DR
  • SQL注入最简单也是最常见的例子就是用户登陆这一模块,如果用户对SQL有一定的了解,同时系统并没有做防止SQL注入处理,用户可以在输入的时候加上’两个冒号作为特殊字符,这样的话会让计算机认为他输入的是SQL语句的...
  • mybatis模糊查询如何防止sql注入

    千次阅读 2014-03-21 11:12:25
    在mybatis中,”${xxx}”这样格式的参数会直接参与sql编译,从而不能避免注入攻击。但涉及到动态表名和列名时,只能使用“${xxx}”...若不得不使用“${xxx}”这样的参数,要手工地做好过滤工作,来防止sql注入攻击。
  • SQL注入简介 SQL注入是由于程序员对用户输入的参数没有做好校验,让不法分子钻了SQL的空子, 比如:我们一个登录界面,要求用户输入用户名和密码: 用户名: ' or 1=1-- 密码: 点击登录之后,如果后台只有一条简单...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 433
精华内容 173
关键字:

如何处理sql注入