当前位置: 首页 > news >正文

满洲里网站制作网站排名seo培训

满洲里网站制作,网站排名seo培训,教育app开发,c 网站购物车怎么做日常搬砖,总少不了需要获取分页数据和总行数。 一直以来的实践是编码两次sql请求,分别拉分页数据和totalCount。 最近我在思考: 常规实践为什么不是 在一次sql请求中中执行多次sql查询或多次更新,显而易见的优势: ① 能…

06822c1b706026f08a919abf1655d518.gif

日常搬砖,总少不了需要获取分页数据和总行数

一直以来的实践是编码两次sql请求,分别拉分页数据和totalCount。

最近我在思考:

常规实践为什么不是 在一次sql请求中中执行多次sql查询或多次更新,显而易见的优势:

① 能显著减低“客户端和服务器之间的网络往返次数”,提高吞吐量
② 简化客户端代码逻辑


1. mysql 默认单sql请求单语句

mysql客户端选项client_multi_statements默认为false:会禁止多条 SQL 语句的执行,这意味着在单个sql请求中只有第一条 SQL 语句会被执行,后续的 SQL 语句将被忽略。

这是一种提高数据库操作安全性的方法,可以有效防止 SQL 注入攻击和意外执行多条语句带来的风险。

MySQL客户端支持修改这样的设定 :client_multi_statements=true。

5b12b1fea06772519f8057bfb6eab25d.png

劣势:存在sql注入的风险, 错误处理比较复杂。

(1) go-sql-driver开启多语句支持: multiStatements=true

(2)

SELECT *  FROM `dict_plugin`  limit  20 ,10;
SELECT count(*) as  totalCount  from `dict_plugin`;

将会形成2个数据集,golang的实践如下:

results, err = p.Query(querystring)for results.Next() {err = results.Scan(&...)}if !results.NextResultSet() {log.ErrorF(ctx, "expected more result sets: %v", results.Err())}for results.Next() {err = results.Scan(&totalCount)}

既然提到了开启client_multi_statements 有sql注入的风险,我们就展开聊一聊。

2. sql注入

我们先看下sql注入的原理:

有这样的业务sql:

var input_name string
query: = "select  * from user where user_name='" + input_name+"'"
sql.Query(query)

如果从界面输入的input_name="janus';delete from user;  --",
会形成恶意sql:select * from user where user_name='janus';delete from user;  --' 。

这个时候,客户端的client_multi_statements默认值为false就能于水火之间挽救数据库:执行第一个sql之后,后面的恶意sql都不会执行。

由此可知,client_multi_statements=false,确实可以显著降低sql注入的风险,但是还是没有办法避免单sql注入, 比如从界面密码框注入' OR '1'='1 会绕过登录认证。

query:= "select * from user where user='" + input_name +"' and  pwd='" +input_pwd +"'" select * from user where user='xxx' and pwd='' OR '1'='1'  -- 会绕过认证逻辑。

3. 参数化查询防止sql注入

参数化查询可以防止sql注入风险[1]

// Correct format for executing an SQL statement with parameters.var queryStr = "SELECT * FROM `dict_plugin_Test` WHERE `plugin_name` = ?"
var args string = "55 union select * from `dict_plugin_Test`"rows, err := db.Query(queryStr, args)

sql查询内部会利用提供的参数1创建预编译语句, 在运行时,实际是执行带参的预编译后的语句。

在服务器收到的查询日志如下:

2024-08-13T08:07:18.922818Z   26 Connect root@localhost on tcinfra_janus_sharing using TCP/IP
2024-08-13T08:07:18.924525Z   26 Prepare SELECT * FROM `dict_plugin_Test` WHERE `plugin_name` = ?
2024-08-13T08:07:18.924671Z   26 Execute SELECT * FROM `dict_plugin_Test` WHERE `plugin_name` = '55 union select * from `dict_plugin_Test`'
2024-08-13T08:07:18.925273Z   26 Close stmt

判断mysql数据库开启了查询日志:show variables like '%general_log%';
打开sql查询日志的开关:set global general_log = on; 。

注意:参数占位符根据DBSM和驱动而有所不同,例如,Postgres 的pq驱动程序接受占位符形式是 $1而不是?。

3.1 预编译语句

数据库预编译后, SQL语义结构和数据分离,这样即使输入包含恶意代码,它也只会被当作数据处理,不会影响已经被解析固定的SQL语义结构。

预编译语句包含两次 sql交互:

①  预编译阶段(Prepare Phase):

  • 客户端向服务器发送一个包含 SQL 语句(带有参数占位符)的请求。

  • sql服务器对SQL 语句进行语法和语义检查,然后对其进行预编译,并为其分配一个标识符(Statement ID)。

  • 服务器返回一个确认响应,表示预编译语句已经成功准备好。

②  执行阶段(Execute Phase):

  • 客户端发送执行请求,包含预编译语句的标识符和实际参数值。

  • 服务器将参数值绑定到预编译语句的占位符上,然后执行该语句。

  • 服务器返回执行结果(如结果集或影响的行数)。

图示如下:

客户端                          服务器|                               ||----预编译语句(Prepare)------>||                               ||<-------确认响应(OK)----------||                               ||---执行语句(Execute) + 参数---->||                               ||<----------查询结果-------------|

我们了解到预编译语句,将SQL语义和数据分离,通过两次sql交互(在预编译阶段固定了sql语义结构), 有效防止了SQL注入攻击, 另一方面,预编译语句在重复执行某一sql语句时确实有加快查询结果的效果。

golang的预编译的写法与常规的sql查询类似:

stmt, err := p.Prepare("SELECT * FROM `dict_plugin_Test` WHERE `plugin_name` = ?")
var args string = "55 union select * from `dict_plugin_Test`"
results, err := stmt.Query(args)
if err != nil {fmt.Printf("query fail: %v", err)return err
}
defer stmt.Close()for results.Next() {err = results.Scan(.....)......
}

btw, C#  其实也支持预编译语句版本的sqlCommand:SqlCommand.Prepare()

总结

本文通过我们最初开始数据库编程时的一个实践, 提出在【一次sql请求中执行多次sql查询】的猜想;

了解到client_multi_statements= false 确实能避免一部分sql注入风险;

之后落地到sql注入的原理, 给出了参数化查询(预编译语句)能防止sql注入的核心机制。

参考资料

[1]

参数化查询可以防止sql注入风险: https://go.dev/doc/database/sql-injection

8d06b98bd82aa73ca9652fba819f28b0.gif

自古以来,同步/异步都是八股文第一章

async/await 贴脸输出,这次你总该明白了

流量调度、微服务可寻址性和注册中心

Go语言正/反向代理的姿势

两将军问题和TCP三次握手

"家长进校园"之《计算机和人工智能》

903d18c5a32d92d0ca579dc91845b98f.png

点“5188979d1bab0f1d4604485dca023c3b.gif戳“在看545b5850adc9ae8bc1ff113e573a0446.gif

http://www.mmbaike.com/news/84492.html

相关文章:

  • 无锡企业建站模板昨日凌晨北京突然宣布重大消息
  • 网站制作技术方案培训机构管理系统
  • php旅游网站cms台湾搜索引擎
  • 滨州的网站开发厦门人才网唯一官网
  • wordpress 宽版88个seo网站优化基础知识点
  • 注册企业注册公司重庆网站优化公司
  • 怎么做自适应的网站外贸网站优化
  • 聊城做网站的公司资讯重庆seo报价
  • 动态网站制作好了在哪里看简单网页制作模板
  • 农业推广调查报告连云港seo优化
  • 如何做wap网站代写1000字多少钱
  • 网站建设的七大优缺点百度关键词排名优化
  • 超便宜的网站万网域名查询
  • 金坛网站建设网站改版seo建议
  • 网站定制报价建网站找哪个公司
  • 租整套房做民宿的网站google下载安卓版下载
  • 淮南招聘网站建设精准推广引流5000客源
  • 网站各个级别建设费用企业营销策划有限公司
  • 专业上海网站建设怎么给公司做网站
  • 企业网站建站意义石嘴山网站seo
  • 个人主页网站申请批量查询指数
  • 中国建设银行建银购网站深圳搜索引擎优化收费
  • 做公司网站有什么需要注意的营销型网站开发公司
  • 工作一般做网站视频的工作叫做什么今天国内最新消息
  • 网上卖货哪个平台比较好武汉seo招聘信息
  • 广西网站建设网站seo策划
  • 宏升温岭网站建设今日新闻快讯10条
  • 电商网站建设源码友の 连接
  • 网站展示 包括什么建一个网站大概需要多少钱
  • 网站建设的主要流程百度广告投诉电话