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 小米 华为 单反 装机 图拉丁
 
   -> 大数据 -> SQL Injection 防御——预编译 -> 正文阅读

[大数据]SQL Injection 防御——预编译

目录

(一)Reference:

形成原因:

(二)什么是预处理

1、普通的SQL语句执行过程

2、预处理执行过程

2.1 把SQL语句分成两部分,命令部分和数据部分

2.2 先把命令部分发送给MySQL服务端,MySQL服务端进行SQL预编译(?占位符)

?2.3?然后把数据部分发送给MySQL服务端,MySQL服务端对SQL语句进行占位符替换

?2.4??MySQL服务端执行完整的SQL语句并将结果返回给客户端

总结:

?3、代码实现

1、数据库开启Log

2、服务端代码


?????????由于笔者个人水平有限,行文如有不当,还请各位师傅评论指正,非常感谢

(一)Reference


https://dev.mysql.com/doc/refman/5.7/en/sql-prepared-statements.html
https://cheatsheetseries.owasp.org/cheatsheets/SQL_Injection_Prevention_Cheat _Sheet.htm

????????本篇文章主要介绍预编译,首先 回顾 SQL 注入发生的原因

形成原因:

?用户输入的数据作为代码执行了

  1. 用户能控制传参
  2. SQL语句中拼接了用户传参的内容
  3. 拼接后的SQL语句必须能在数据库中执行
def bypass_from_param(string): 
sql_string = "select * from products where category = '{}' and released = 0".format(string) print(sql_string) 
if __name__ == '__main__': 
bypass_from_param("Gifts'")

(二)什么是预处理


1、普通的SQL语句执行过程


  1. 客户端对SQL语句进行占位符替换得到完整的SQL语句
  2. 客户端发送完整SQL语句到MySQL服务端
  3. MySQL服务端执行完整的SQL语句并将结果返回给客户端

总结:

???????? 一次编译,单次运行,此类普通语句被称作 Immediate Statements (即时 SQL)

2、预处理执行过程


2.1 把SQL语句分成两部分,命令部分和数据部分

2.2 先把命令部分发送给MySQL服务端,MySQL服务端进行SQL预编译(?占位符)

?2.3?然后把数据部分发送给MySQL服务端,MySQL服务端对SQL语句进行占位符替换

?2.4??MySQL服务端执行完整的SQL语句并将结果返回给客户端

????????处理后的数据就成这样:

总结:

???????? 所谓预编译语句就是将此类 SQL 语句中的值用占位符替代,可以视为将 SQL 语句模板化或者说参数化,一般称这类语句叫Prepared Statements

?3、代码实现


# 定义预处理语句 PREPARE stmt_name FROM preparable_stmt;
# 执行预处理语句 EXECUTE stmt_name [USING @var_name [, @var_name] ...]; 
# 删除(释放)定义 {DEALLOCATE | DROP} PREPARE stmt_name; 

# 验证 use sql_inject; 
prepare select_content from 'select id,name,content,
released from products where category = ? and released = ?'; 
set @a='Gifts' 
set @b=0 
execute select_content using @a,@b;

????????假如我们a输入的是Gifts'#,输出的数据是空,原因很简单SQL语句之前已经编译过了,现在传入的是参数,表里没有Gift'#的参数,所以返回的是空。

1、数据库开启Log

vim /etc/mysql/mysql.conf.d/mysqld.cnf 
general_log=on 
general_log_file=/tmp/mysql.log
 # 查看log tail -f /tmp/mysql.log

2、服务端代码

package api 
import ( 
    "log" 
    "net/http" 
    "sql_injection/model" 
    "github.com/gin-gonic/gin" 
)
func ProductsHandler(c *gin.Context) { 
    a := c.Query("category") 
    s := c.Query("released") 

    log.Println(a) 
    //sqlStr := fmt.Sprintf(`select id,name,content,released from products where category = '%s' and released = %s`, a, s) 
    // 预编译模板 
    sqlStr := "select id,name,content,released from products where category = ? and released = ? " 
    log.Println(sqlStr) 

    stmt, err2 := model.DB.Prepare(sqlStr) 
    if err2 != nil {
     c.JSON(http.StatusOK, gin.H{
     "code": 404, "err": 
     err2.Error(), 
    "msg": "error", 
   })
    return 
}
rows, err := stmt.Query(a, s) 
    if err != nil {
     c.JSON(http.StatusOK, 
        gin.H{ 
        "code": 404, 
        "err": err.Error(), 
        "msg": "error", })
        return }
    var r []model.Product
    for rows.Next() { 
        var p model.Product 
        if rowErr := rows.Scan(&p.Id, &p.Name, &p.Content, &p.Released); rowErr != nil 
{
     c.JSON(200, gin.H{
         "code": 404, 
         "err": rowErr.Error(), 
         "msg": "error", 
    }) 
   }r = append(r, p)

}
c.JSON(
    200, gin.H{ 
    "code": 0,
     "data": r, 
    "msg": "success", 
   }) 
}
预处理有什么好处:
  1. 优化MySQL服务器重复执行SQL的方法,可以提升服务器性能,提前让服务器编译,一次编译多次执行,节省后续编译的成本
  2. 避免SQL注入
  大数据 最新文章
实现Kafka至少消费一次
亚马逊云科技:还在苦于ETL?Zero ETL的时代
初探MapReduce
【SpringBoot框架篇】32.基于注解+redis实现
Elasticsearch:如何减少 Elasticsearch 集
Go redis操作
Redis面试题
专题五 Redis高并发场景
基于GBase8s和Calcite的多数据源查询
Redis——底层数据结构原理
上一篇文章      下一篇文章      查看所有文章
加:2022-09-21 00:35:41  更:2022-09-21 00:37:17 
 
开发: 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/23 10:31:27-

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