golang防止MySQL注入_mysql – 如何最大限度地降低golang服务中下游服务中SQL注入的风险?...

在过去的工作中,我为我们的服务维护了一个允许临时查询的工具.它允许管理员在不必等待数周的代码部署的情况下请求报告(在部署需要数周的古怪时期).

我们不支持临时报表查询,方法是让服务接受任意字符串作为输入,并将它们作为SQL执行.这是非常不安全的,因为我相信你知道.

它的工作方式是报告查询存储在数据库中,以及所需的查询参数数量.

CREATE TABLE ManagerQueries (

id INT PRIMARY KEY,

query TEXT NOT NULL,

description TEXT NOT NULL,

num_params TINYINT UNSIGNED NOT NULL DEFAULT 0

);

INSERT INTO ManagerQueries

SET query = 'SELECT COUNT(*) FROM logins WHERE user_id = {0} AND created_at > {1}',

description = 'Count a given user logins since a date',

num_params = 2;

管理器前端可以通过其主键请求查询,而不是通过在Web请求中指定任意SQL字符串.

只有DBA以及可能知道如何编写安全查询的其他开发人员或经理才允许向此存储库添加新查询,因此可以确保查询经过测试和审查.

通过UI请求报表查询时,它强制用户提供查询参数的值.在我们的例子中,它从数据库中读取SQL,执行prepare()然后绑定execute()的值.所以SQL注入防御很满意.

在您的情况下,您的代码可能无法直接访问旧服务的数据库,因此您无法执行准备/执行并使用绑定参数.您必须提交具有集成值的静态查询.

在其他语言中,您可以通过转义使任何字符串值安全插入到SQL查询中.请参阅MySQL C API函数mysql_real_escape_string().

数字值更容易.你不必逃避任何事情,你只需要确保数值是真正的数字.将动态值转换为数字后,可以安全地插入到任何SQL字符串中.

不幸的是,我不认为golang SQL包支持任何转义函数.这已被要求作为一项功能,但据我所知,目前还没有支持的实现.见这里的讨论:https://github.com/golang/go/issues/18478

请注意,它比使用正则表达式替换有点棘手,因为您需要考虑多字节字符集.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/304143.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

.NET Core dump 分析

服务 CPU 或 内存偶尔飙高是部署环境中经常遇到的问题,一般会采用记录日志的方式来诊断,不过有些情况靠日志可能并不能分析出个所以然,面对实在无头绪的问题也只能暂时使用重启大法先恢复。为了尽可能精准的定位问题,掌握通过 dum…

外国人最常说的100个“中国词”出炉,第一个你绝对想不到…

近几年,“汉语热”在全球兴起,外国人说的念的中国词儿变多了!那外国人最常说的、最热的“中国词”到底是啥呢?2月17日,中国外文局首次发布《中国话语海外认知度调研报告》。报告显示,近两年中国话语以汉语拼…

new start

下个月就要正式工作了。以后会常来这里。写下自己的收获。转载于:https://blog.51cto.com/daiyanfei/324858

python 什么可以作为变量名_为什么强烈禁止开发人员使用isSuccess作为变量名

在日常开发中,我们会经常要在类中定义布尔类型的变量,比如在给外部系统提供一个RPC接口的时候,我们一般会定义一个字段表示本次请求是否成功的。关于这个”本次请求是否成功”的字段的定义,其实是有很多种讲究和坑的,稍…

自建Git服务器系列——Gitea(Gogs的孪生兄弟)

概述该项目的目标是提供一种最简单,最快,最轻松的方式来建立自托管的Git服务。使用Go,可以在Go支持的所有平台上进行独立的二进制分发 ,包括x86,amd64,ARM和PowerPC体系结构上的Linux,macOS和Wi…

干货|吴恩达Coursera课程教你学习神经网络!

吴恩达Coursera机器学习课程系列笔记讲解课程笔记|吴恩达Coursera机器学习 Week1 笔记-机器学习基础干货|机器学习零基础?不要怕,吴恩达机器学习课程笔记2-多元线性回归干货|机器学习零基础?不要怕,吴恩达课程笔记第三周&#xff…

笔记本内置扬声器三强PK

内置扬声器PK要点外观设计差异。外表是否美观直接影响使用者的心情,扬声器的结构设计直接影响放音效果。实际听音较量。利用真实的人耳感受则是最能体现扬声器实际效果的。奥特蓝星:音质纯净,低音欠佳代表机型:惠普,华…

mysql内连接查询原理_MySQL全面瓦解12:连接查询的原理和应用

概述MySQL最强大的功能之一就是能在数据检索的执行中连接(join)表。大部分的单表数据查询并不能满足我们的需求,这时候我们就需要连接一个或者多个表,并通过一些条件过滤筛选出我们需要的数据。了解MySQL连接查询之前我们先来理解下笛卡尔积的原理。数据…

如何在 .NET 中使用 Kafka

Kafka 是一个开源的,分布式的,可扩展的,高性能的发布订阅模式的消息中间件,如果你要构建一个处理海量数据的系统,那么 Kafka 将会是一个非常好的选择,这篇文章我们将会讨论如何基于 Kakfa 构建一个发布订阅…

学日语小技巧 让Office Word效劳

最近因工作需要开始学习日语。因一点基础都没有,且完全自学,再加上时间有限,感觉还是挺有难度的。有时候,刚刚背的假名,不一会就忘记该怎么写了;见到很多汉字也不知道该如何读,为此甚为苦恼。最…

傅里叶变换和拉普拉斯变换的物理解释及区别

傅里叶变换在物理学、数论、组合数学、信号处理、概率论、统计学、密码学、声学、光学、海洋学、结构动力学等领域都有着广泛的应用(例如在信号处理中,傅里叶变换的典型用途是将信号分解成幅值分量和频率分量)。傅里叶变换能将满足一定条件的…

Teleport 开源堡垒机的使用

公司的服务器可能会存在这样一种情况,具体的应用是部署在一个或多个内网服务器上,然后由一台外网服务器通过代理的方式对外提供服务,例如下图:我们如果需要进入到内网服务器进行操作就必须先要进入外网服务器,然后再远…

python拼图游戏_乐趣无穷的Python课堂

Python world/特慧编/你所认为的.........pythonpython&枯燥、无趣boring“安全”提示走进特慧编走进“python编程课”让我们进入真正的编程世界,培养逻辑数理思维,学习掌握python特色,让你的学习过程不再枯燥、不再无趣~~~下面跟着我的脚…

安装配置libmemcached

1、下载libmemcached http://tangent.org/552/libmemcached.html 到这个地址下载libmemcached-0.38.tar.gz tar -xzvf libmemcached-0.38.tar.gz cd libmemcached-0.38 ./configure --disable-64bit CFLAGS"-O3 -marchi686" && make && make install…

让 Python 更加充分的使用 Sqlite3

我最近在涉及大量数据处理的项目中频繁使用 sqlite3。我最初的尝试根本不涉及任何数据库,所有的数据都将保存在内存中,包括字典查找、迭代和条件等查询。这很好,但可以放入内存的只有那么多,并且将数据从磁盘重新生成或加载到内存…

techempower之Plaintext上7百万RPS

在Plaintext这项测试中第一阶梯的分隔线基本算是7百万RPS,Beetlex并没有到到这一阶梯停留在69X万RPS处,虽然只差那数万但在排名上让人感觉不爽。Beetlex在很多项测都微微领先aspcore,但在最基础项落下一点点的确让我感觉到不太满意,更希望Bee…

mysql 大小写 if_【已解决】Windows下 MySQL大小写敏感 解决方案及分析

Windows下 MySQL大小写敏感配置zoerywzhou163.com作者:Zhouwan2017-3-27最近在window系统下 操作Linux系统下创建的数据库,发现有些不对劲,比较了半天才发现是大小写敏感的问题造成的。网上搜索了一下,解决了这个问题,…

我对CTO的理解 CTO要有技术魅力[转载]

编者按:关于CTO这个热门职业的理解总会引发热议,下面这篇博文出自资深从业人员,观点来自实践,很尖锐也很有见地。 1)错误都是自上而下 当事情出现混乱的时候,人们总是寻求寄托于Process的制定,很多的管理者…

详解全排列算法

简介给定 {1, 2, 3, , , n},其全排列为 n! 个,这是最基础的高中组合数学知识。我们以 n4 为例,其全部排列如下图(以字典序树形式来呈现):我们很容易想到用递归来求出它的所有全排列。仔细观察上图&#xff…

VS2019 调试技巧之附加进程

C# 创建服务并附加到进程进行调试步骤一:在任务栏右键-》》点击任务管理器-》》选择服务,找到启动的进程PID或者WINR 进入cmd命令 输入 netstat -ano | find "进程端口" 找端口步骤二:VS中找到“调试”菜单,选择“…