IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 大数据 -> 漏洞修复方案 -> 正文阅读

[大数据]漏洞修复方案

基础的漏洞修复方案

学习目标:

在这里收集总结一下常见漏洞的修复方案吧,给自己三天时间收集整理,尽量详细。
下面都是从

  1. 是什么
  2. 为什么
  3. 怎么做
    来回答

SQL注入漏洞

预编译

  1. 什么是预编译
    数据库接收到sql语句之后,需要词法和语义解析,优化sql语句,制定执行计划。这需要花费一些时间。但是很多情况,我们的一条sql语句可能会反复执行。在某种情况下,多条SQL语句都只有某些关键字不同。所以为了优化SQL语句的执行效率,所有产生了SQL预编译,当然这也成为了防止SQL注入的最好方式。预编译就是将这类语句的值用占位符代替:如下面的问号。
//赋值语句用?代替
string sql = "select id from users where username = ? and password= ?";
ps = connection.preparestatement(sql);
//在给?赋值之前,预编译就会把上面的语句送入数据库进行解析,如果没有
//错的话就会返回

//给?赋值
ps.setstring(1,tom);
ps.setstring(2,passwd);
resultset=psmt.executeQuery();

预编译语句被DB的编译器编译后的执行代码被缓存下来,那么下次调用时只要是相同的预编译语句不需要编译,只要将参数直接传入编译过的语句执行代码中(相当于一个涵数)就会得到执行。
预编译是用过PreparedStatement和占位符来实现的。

  1. 为什么会防止SQL注入
    使用预编译,而其后注入的参数不会再进行SQL编译。也就是说其后注入进来的参数系统将不会认为它会是一条SQL语句,而默认其是一个参数,参数中的or或者and 等就不是SQL语法保留字了。
    这最主要是由于不带占位符的拼接必须要用单引号’来包裹SQL字符串,而占位符的填写无需单引号,即使填入的变量是String str = “‘admin’”,那么JDBC也会将其中的单引号’ '转化成纯字符单引号处理,而不会被当做SQL的特殊字符单引号’来处理

    总结
    SQL语句的执行过程:提交SQL语句 -> 数据库引擎对SQL语句进行编译得到数据库可执行的代码 -> 执行SQL代码

    SQL注入漏洞发生在数据库引擎对SQL语句编译的过程,而使用了preparestatement后 SQL语句在插入参数之前就已经完成了编译过程,在插入参数后会直接执行而不经过编译过程

  2. 怎么预防SQL注入
    不使用普通的statement直接执行,使用preparestatement预编译

贴一段代码,看过上面的解释后这个代码也能很轻松的理解

//使用了preparestatement预编译的样子
<pre>
	public void fix(HttpServletRequest request, Connection c, org.apache.log4j.Logger logger) {
		String text = request.getParameter("text");
		String sql = "select * from tableName where columnName = ?";
		try {
			PreparedStatement s = c.prepareStatement(sql);
			s.setString(1, text);
			s.executeQuery();
		} catch (SQLException e) {
			logger.warn("Exception", e);
		}
	}
</pre>
  大数据 最新文章
实现Kafka至少消费一次
亚马逊云科技:还在苦于ETL?Zero ETL的时代
初探MapReduce
【SpringBoot框架篇】32.基于注解+redis实现
Elasticsearch:如何减少 Elasticsearch 集
Go redis操作
Redis面试题
专题五 Redis高并发场景
基于GBase8s和Calcite的多数据源查询
Redis——底层数据结构原理
上一篇文章      下一篇文章      查看所有文章
加:2021-11-27 09:57:56  更:2021-11-27 09:59:03 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 8:04:06-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码