我的编程空间,编程开发者的网络收藏夹
学习永远不晚

SQL注入的问题

短信预约 信息系统项目管理师 报名、考试、查分时间动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

SQL注入的问题

SQL注入的问题

首先,SQL语句应该考虑哪些安全性?

  第一,防止SQL注入,对特殊字符进行过滤、转义或者使用预编译的SQL语句绑定变量。

  第二,当SQL语句运行出错时,不要把数据库返回的错误信息全部显示给用户,以防止泄露服务器和数据库相关信息。

其次,什么叫做SQL注入呢,如何防止呢?

举个例子:

  你后台写的Java代码拼的SQL如下: 

1 //该ename为前台传过来的一个查询条件
2 public List getInfo(String ename){
3   StringBuffer buf = new StringBuffer();
4   buf.append("select empno,ename,deptno from emp where ename = "").append(ename).append("");
5   ...
6   ...          
7 }

  而前台页面有输入框如下:

  职员姓名:                  

  该文本域对应上面方法的ename参数。

  如果用户在查询时向职员姓名文本域中输入的是如下信息:

  "or"1"="1

  那么这时就会涉及到SQL注入这个概念了。

上面的字符串传到后台后,与其他select等字符串拼成了如下的语句:

  select empno,ename,deptno from emp where ename=" or "1"="1"

上面的where条件是永远成立的,如果你的表中有权限限制,比如只能查询本地市的信息,过滤条件中有地市过滤,不过因为输入"or"1"="1字符串后,条件永远成立,导致你能看到所有城市的职员信息,那就会产生权限问题了,用户能看到不该看到的信息。同理,如果是insert或者update等语句的话,通过SQL诸如会产生不可估量的问题。

 

这种不安全的情况是在SQL语句在拼接的情况下发生。

解决方法:

1、参数绑定。为了防范这样“SQL注入安全”可以用预编译(不要用拼接SQL字符串,可以用prepareStatement,参数用set方法进行填装)。

 1 String sql="insert into userlogin values(?,?)";
 2 try{
 3   PrepareStatement ps = conn.prepareStatement(sql);
 4     for(int i=1;i<100;i++){
 5         ps.setInt(1,i);
 6         ps.setInt(2,8888);
 7         ps.executeUpdate();
 8     } 
 9     ps.close();
10     conn.close();      
11 }catch(SQLException e){
12     e.printStackTrace();
13 }

 2、检查变量的数据类型和格式

  如果你的SQL语句市类似where id={$id}这种形式,数据库里所有的id都是数字,那么就应该在SQL被执行前,检查确保变量id是int类型;如果是接受邮箱,那就应该检查并严格确保变量一定是邮箱的格式,其他的类型比如日期、时间等也是一个道理。总结起来:只要是有固定格式的变量,在SQL语句执行前,应该严格固定格式去检查,确保变量是我们预想的格式,这样很大程度上可以避免SQL注入攻击。

  比如,我们前面接受username参数例子中,我们的产品设计应该是在用户注册的一开始,就有一个用户名的命名规则,比如5-20个字符,只能由大小写字母、数据以及一些安全的符号组成,不包含特殊字符。此时我们应该有一个check_username的函数来进行统一的检查。不过,仍然有很多例外情况并不能应用到这一准则,比如文章发布系统,评论系统等必须要允许客户提交任意字符串的场景,这就需要采用过滤等其他方案了。(使用正则表达式进行格式验证!)

3、所有的SQL语句都封装在存储过程中

  所有的SQL语句都封装在存储过程中,这样不但可以避免SQL注入,还能提高一些性能。

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

SQL注入的问题

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

SQL注入的问题

首先,SQL语句应该考虑哪些安全性?  第一,防止SQL注入,对特殊字符进行过滤、转义或者使用预编译的SQL语句绑定变量。  第二,当SQL语句运行出错时,不要把数据库返回的错误信息全部显示给用户,以防止泄露服务器和数据库相关信息。其次,什么叫做SQL注入呢,
SQL注入的问题
2016-02-07

一文搞懂Java JDBC中的SQL注入问题

在用户输入的数据中有SQL关键字或语法,并且关键字或语法参与了SQL语句的编译,导致SQL语句编译后的条件为true,一直得到正确的结果,这种现象就是SQL注入,这篇文章主要介绍了一文搞懂Java JDBC中的SQL注入问题,需要的朋友可以参考下
2022-11-13

mybatis使用${}时sql注入的问题怎么解决

这篇文章给大家介绍mybatis使用${}时sql注入的问题怎么解决,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。mybatis使用${}时sql注入的问题最近在上线项目的时候,代码审查没有通过,提示有sql注入的风险
2023-06-22

thinkPHP3.2.3中sql注入漏洞问题怎么解决

这篇文章主要介绍“thinkPHP3.2.3中sql注入漏洞问题怎么解决”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“thinkPHP3.2.3中sql注入漏洞问题怎么解决”文章能帮助大家解决问题。
2023-06-30

怎么使用prepared statement解决SQL注入问题

使用prepared statement可以有效地防止SQL注入问题。下面是使用prepared statement的一般步骤:1. 创建一个带有占位符的SQL语句。2. 使用数据库连接对象创建一个prepared statement对象,
2023-08-08

关于Mybatis的sql注释问题

Mybatis的sql注释//mapper下的sql注释package com.msb.mapper;import com.msb.pojo.Dept;import com.msb.pojo.Emp;import org.apac
2022-06-13

SpringBoot@Componet注解注入失败的问题

这篇文章主要介绍了SpringBoot@Componet注解注入失败的问题及解决,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
2023-03-06

Mybatis的sql注释问题怎么解决

这篇文章主要介绍“Mybatis的sql注释问题怎么解决”,在日常操作中,相信很多人在Mybatis的sql注释问题怎么解决问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Mybatis的sql注释问题怎么解决
2023-07-02

sql注入 --显错注入

前提知识数据库:就是将大量数据把保存起来,通过计算机加工而成的可以高效访问数据库的数据集合数据库结构:库:就是一堆表组成的数据集合表:类似 Excel,由行和列组成的二维表字段:表中的列称为字段记录:表中的行称为记录单元格:行和列相交的地方称为单元格在数据库里

	sql注入 --显错注入
2021-01-16
2024-04-02

jdbc-实现用户登录业务(解决sql注入问题)

package com.cqust;import java.sql.*;import java.util.HashMap;import java.util.Map;import java.util.Scanner;/**解决sql注入问题使用预编译在还没有拼接
jdbc-实现用户登录业务(解决sql注入问题)
2018-02-17

编程热搜

目录