加强Web应用程序安全:防止SQL注入
数据库在Web应用程序中存储和组织数据时起着至关重要的作用,它是存储用户信息、内容和其他应用程序数据的中央存储库。而数据库实现了高效的数据检索、操作和管理,使Web应用程序能够向用户提供动态和个性化的内容。然而,数据库和网络应用程序之间的通信不畅可能会导致敏感数据泄露、用户不信任、法律后果和利润损失。本文将探讨导致此类灾难的后端错误配置,并了解如何确保应用程序的安全。
一、什么是SQL注入?
SQL注入(SQLi)是一个漏洞,它允许网络攻击者篡改Web应用程序发送给数据库的查询。当应用程序误解了用户的输入并将其视为SQL代码而不是字符串时,就会发生注入。因此,恶意用户可以更改预期的查询流,破坏应用程序的逻辑,并获得对其资源的未经授权的访问。
在大多数情况下,当开发人员需要使用依赖于用户输入的参数化查询时,就会出现SQLi。如果开发人员在将用户输入插入模板之前忘记对其进行适当的清理,就会引入SQL注入漏洞。一个经典的SQL注入示例是使用纯字符串插值或连接来创建动态查询,如下图所示。网络攻击者可以通过用SQL代码替换分页参数中的数字来注入任意SQL语句。
(动态查询精心制作的字符串插值)
二、什么是ORM注入?
现在,开发人员很少使用原始SQL语句,而是使用称为ORM的特殊框架。对象关系映射(ORM)是一种用作两种不同范例之间的适配器的技术:关系(将数据存储在表中)和面向对象(将数据存储在对象中)。ORM所做的事情之一是在底层生成SQL代码。开发人员所要做的就是告诉ORM如何去做。
显然,自动生成意味着自动转义用户提供的数据。ORM确保每个动态参数都像普通字符串一样被处理,除非开发人员特别禁用清理功能。然而,恶意代码的注入仍然是可能的。ORM注入是一个漏洞,它允许密切协作攻击者强制ORM生成对他们有利的SQL。
考虑下面的例子。这里有一个函数,它应该接受带有多个参数的对象过滤器,例如:
{"email":, ""name": "user"}
(ORM注入)
但是,开发人员忘记检查过滤器是否确实是一个对象,以及它是否只包含安全的过滤参数。这样的错误使攻击者能够注入可用于恢复用户密码的恶意过滤器,例如:
"password LIKE '%a%'"
三、SQL注入真的很危险吗?
通常,SQL注入可以被认为是一个严重的漏洞。在大多数情况下,对网站任何部分的单个SQL注入最终都可以扩展到在数据库上运行任何查询,提取和操作其数据。由于数据库通常保存着系统中最敏感的信息,因此允许网络攻击者访问这些信息是毁灭性的。
以下是SQL注入如何被利用的简短列表:
- 远程代码执行(通常通过特殊功能)
- 读写主机上的文件。
- 颠覆Web应用程序的逻辑
- 提取敏感数据
- 操纵数据
- 拒绝服务
四、哪些类型的SQL注入是可能的?
在通常情况下,有三种类型的SQL注入:带内注入、带外注入和盲注入。反过来,带内攻击可以是基于联合的或基于错误的,而盲SQLi可以是基于布尔的或基于时间的。
五、SQL注入层次结构
如果攻击者足够幸运,他们可以在后端响应中包含被破坏的SQL查询的结果。这被称为带内SQLi。带内SQLi有两种子类型:
1.基于联合的SQLi:攻击者能够指定他们可以读取的查询输出的位置(列)。
2.基于错误的SQLi:当应用程序公开SQL/编程语言错误时,这种类型的SQLi是可能的。在这种情况下,攻击者可以分析错误消息/堆栈跟踪,并推断攻击是否成功。
使用BlindSQLi,网络攻击者无法看到被破坏的SQL查询的结果。然而,它们有某种反馈,可以帮助确定是否存在注入。盲SQLi有两种子类型:
1.基于布尔的SQL:攻击者可以使用SQL条件语句以某种方式修改服务器的响应。然后,他们可以将这种新的反应与原来的反应进行比较,并确定注入是否有效。
2.基于时间的SQLi:攻击者可以将数据库的SLEEP函数与条件语句结合起来,从而延迟后端响应。然后,他们可以将原始响应时间与新的响应时间进行比较,以确定注入是否成功。
在某些情况下,攻击者可能根本无法从数据库获得任何反馈。在这种情况下,它们可以强制数据库将输出重定向到另一个位置,并尝试从那里读取它。这就是所谓的带外SQL注入。例如,他们可以强制数据库将包含敏感信息的DNS查询发送到他们控制的DNS服务器。或者,它们可以强制数据库将一些数据写入可公开访问的文件中。这种注入会影响许多数据库。
六、减轻SQLi时的常见错误
用户不应该试图为SQL输入参数提供自己的清理程序。这样做需要深入了解数据库规范和使用它们的经验。最有可能的是,最终会淹没在其他人无法理解的正则表达式中,并且随着数据库的发展,没有人会支持清理程序。
需要记住:攻击者总是试图混淆他们的SQLi有效负载,将其偷运到WAF和IPS。有大量的框架可以利用SQLi,为攻击者提供扭曲有效负载的脚本库。编写自定义混淆处理程序并将其与现有混淆处理程序结合使用也很容易。
考虑一下开发人员在试图净化用户输入时所犯的一些常见错误。
一个常见的误解是,可以通过删除/替换SQL查询参数中的空格来避免SQLi。例如,如果攻击者只能使用一个单词,会造成多大的伤害?但是许多数据库将注释转换为空格,因此“SELECT email FROM user”等于“SELECT/**/email/**/FROM/**/user”,这是一个单词。
(使用注释而不是空格的SQLMap篡改脚本)
通常认为删除引号可以使参数安全,但有时攻击者可以指定另一个特殊字符来定义字符串。例如,PostgreSQL允许定义包含在双美元符号中的多行字符串。所以“email”等于$$ email$$。
(SQLMap篡改脚本,使用双美元符号代替单引号)
最后但并非最不常见的错误是对数据库关键字进行非递归删除。这也很容易绕过检测,因为攻击者可以在相同的关键字中间插入关键字。因此,经过清理之后,注入仍然存在。例如:
“SELSELECTECT” -> “SELECT”
(用于嵌套关键字的SQLMap篡改脚本)
七、防止SQL注入的正确方法
防止SQLi的第一步是使用预处理语句。允许用户定义预处理语句也是不可接受的。这里有一个使用TypeORM防止SQL注入的例子:采用硬编码的模板,并使用这个框架的特性来安全地插入变量:
(使用TypeORM编写语句)
但是仅仅使用ORM是不够的。正如前面看到的,业务逻辑缺陷可以允许绕过安全保护措施。SQLi修正的第二步是显式验证用户输入。如果需要一个数字,可以手动将值转换为数字。如果需要URL,可以手动将输入字符串转换为URL。这种方法显著降低了利用SQLi的可能性。额外的好处是,将拥有更一致的数据和更少的错误。有许多库可用于声明性验证,例如express-validator或class-validator。
另一件需要记住的重要事情是始终为每个应用程序创建一个专用的数据库用户。仔细阅读有关默认用户权限的文档,并禁用除了对应用程序运行至关重要的功能之外的所有功能。除了数据库管理之外,永远不应该将DBA帐户用于其他任何事情。默认情况下,DBA帐户被授予所有可能的权限。这显著地放大了SQL注入的严重性。
最后但同样重要的是,使用Web应用程序防火墙或入侵预防系统。它们能够发现并破坏SQL注入攻击,甚至有一组流量规则来检测依赖SQLi的已知漏洞。当然,使用WAF或IPS并不是灵丹妙药,因为它们可以绕过检测。然而,这种工具的存在显著提高了进行攻击所需的知识阈值。另外,WAF/IPS干扰了SQLi开发自动化,并提供了比传统工具更好的日志记录。
八、相关内容拓展:(技术前沿)
近10年间,甚至连传统企业都开始大面积数字化时,我们发现开发内部工具的过程中,大量的页面、场景、组件等在不断重复,这种重复造轮子的工作,浪费工程师的大量时间。
针对这类问题,低代码把某些重复出现的场景、流程,具象化成一个个组件、api、数据库接口,避免了重复造轮子。极大的提高了程序员的生产效率。
推荐一款程序员都应该知道的软件JNPF快速开发平台,采用业内领先的SpringBoot微服务架构、支持SpringCloud模式,完善了平台的扩增基础,满足了系统快速开发、灵活拓展、无缝集成和高性能应用等综合能力;采用前后端分离模式,前端和后端的开发人员可分工合作负责不同板块,省事又便捷。
体验官网:https://www.jnpfsoft.com/?csdn
还没有了解低代码这项技术可以赶紧体验学习!
相关文章:

加强Web应用程序安全:防止SQL注入
数据库在Web应用程序中存储和组织数据时起着至关重要的作用,它是存储用户信息、内容和其他应用程序数据的中央存储库。而数据库实现了高效的数据检索、操作和管理,使Web应用程序能够向用户提供动态和个性化的内容。然而,数据库和网络应用程序…...

【云原生】k8s中Contrainer 生命周期回调/策略/指针学习
个人主页:征服bug-CSDN博客 kubernetes专栏:kubernetes_征服bug的博客-CSDN博客 目录 1 容器生命周期 2 容器生命周期回调/事件/钩子 3 容器重启策略 4 自定义容器启动命令 5 容器探针 1 容器生命周期 Kubernetes 会跟踪 Pod 中每个容器的状态&am…...

electron+vue3全家桶+vite项目搭建【25】使用electron-updater自动更新应用
文章目录 引入实现效果实现步骤引入依赖配置electron-buidler文件封装版本升级工具类主进程调用版本更新校验渲染进程封装方法调用 测试版本更新 引入 demo项目地址 electron-updater官网 我们不可能每次发布新的版本都让用户去手动下载安装最新的包,而是应用可以…...

SQL 表别名 和 列别名
列表名 列表名之后 order by 可以用别名 也可以用原名, where 中不能用别名的 SQL语句执行顺序: from–>where–>group by -->having — >select --> order 第一步:from语句,选择要操作的表。 第二步࿱…...
面试之快速学习c++11-函数模版的默认模版参数,可变模版,tuple
//学习地址: http://c.biancheng.net/view/3730.html 函数模版的默认模版参数 在 C98/03 标准中,类模板可以有默认的模板参数,如下: template <typename T, typename U int, U N 0> struct TestTemplateStruct {};但是…...

Visual Studio Code 常见的配置、常用好用插件以及【vsCode 开发相应项目推荐安装的插件】
一、VsCode 常见的配置 1、取消更新 把插件的更新也一起取消了 2、设置编码为utf-8:默认就是了,不用设置了 3、设置常用的开发字体:Consolas, 默认就是了,不用设置了 字体对开发也很重要,不同字体,字母形…...
源码编译安装gcc
摘要: 在编译开源的FunASR项目的C代码时,可能要求的gcc版本不符合,需要升级gcc版本,但是从网上搜索升级gcc方式,大部分都是通过简单的yum命令方式升级,我也尝试了这个方式,这种方式并不能升级到…...

pc文件上传
1.代码: <template><div><el-upload:multiple"true":auto-upload"true":headers"headers":action"uploadFileUrl":before-upload"handleBeforeUpload":on-error"handleUploadError":o…...

Vue3_对响应式对象解构赋值之后失去响应性
官网toRefs() :响应式 API:工具函数 | Vue.js toRefs 在调用时只会为源对象上可以枚举的属性创建 ref。如果要为可能还不存在的属性创建 ref,请改用 toRef。 setup(){const state reactive({name:"张三"age:14})const stateAsToRefs toRef…...

3d 地球与卫星绕地飞行
1 创建场景 2 创建相机 3 创建地球模型 4 创建卫星中心 5 创建卫星圆环及卫星 6 创建控制器 7 创建渲染器 <template><div class"home3dMap" id"home3dMap"></div> </template><script> import * as THREE from three impo…...

Opencv-C++笔记 (16) : 几何变换 (图像的翻转(镜像),平移,旋转,仿射,透视变换)
文章目录 一、图像平移二、图像旋转2.1 求旋转矩阵2.2 求旋转后图像的尺寸2.3手工实现图像旋转2.4 opencv函数实现图像旋转 三、图像翻转3.1左右翻转3.2、上下翻转3.3 上下颠倒,左右相反 4、错切变换4.1 实现错切变换 5、仿射变换5.1 求解仿射变换5.2 OpenCV实现仿射…...

第十次CCF计算机软件能力认证
第一题:分蛋糕 小明今天生日,他有 n 块蛋糕要分给朋友们吃,这 n 块蛋糕(编号为 1 到 n)的重量分别为 a1,a2,…,an。 小明想分给每个朋友至少重量为 k 的蛋糕。 小明的朋友们已经排好队准备领蛋糕,对于每个朋…...

【敏捷开发】测试驱动开发(TDD)
测试驱动开发(Test-Driven Development,简称TDD)是敏捷开发模式中的一项核心实践和技术,也是一种设计方法论。TDD有别于以往的“先编码,后测试”的开发模式,要求在设计与编码之前,先编写测试脚本…...

骑砍二 ATC MOD 使用教程与应用案例解析
骑砍二 ATC MOD 使用教程与应用案例解析 作者:blibli-财不外漏 / NEXUSMODS-PuepleKarmen 案例MOD依赖:ATC - Adonnay’s Troop Changer & AEW - Adonnay’s Exotic Weaponry & New Armor 文本编辑工具:VS Code(推荐使用&…...

python和c语言哪个好上手,c语言和python语言哪个难
大家好,本文将围绕python和c语言哪个更值得学展开说明,python语言和c语言哪个简单是一个很多人都想弄明白的事情,想搞清楚c语言和python语言哪个难需要先了解以下几个事情。 前言 新手最容易拿来讨论的三个语言,具体哪个好&#x…...

智能优化算法 | Matlab实现鲸鱼优化算法(Whale Optimization Algorithm)(内含完整源码)
文章目录 效果一览文章概述研究内容源码设计参考资料效果一览 文章概述 智能优化算法 | Matlab实现鲸鱼优化算法(Whale Optimization Algorithm)(内含完整源码) 研究内容 步骤 1:设置鲸鱼数量 N 和算法的最大迭代次数 tmax,初始化位置信息; 步骤 2:计算每条鲸鱼的适应度,…...
Android随笔-VPN判断
Android中判断当前网络是否为VPN /*** 判断当前网络是否为VPN* param context* return*/public static boolean hasVPN(Context context) {// 查询网络状态,被动监听网络状态变化ConnectivityManager cm (ConnectivityManager) context.getSystemService(Context.C…...

【黑马头条之kafka及异步通知文章上下架】
本笔记内容为黑马头条项目的kafka及异步通知文章上下架部分 目录 一、kafka概述 二、kafka安装配置 三、kafka入门 四、kafka高可用设计 1、集群 2、备份机制(Replication) 五、kafka生产者详解 1、发送类型 2、参数详解 六、kafka消费者详解 1、消费者…...

Modelsim打开后报unable to checkout a viewer license
找到Modelsim安装包中的MentorKG.exe文件和patch64_dll.bat文件,将这两个文件拷贝到Modelsim安装目录中的win64文件夹: 在win64文件夹中找到mgls64.dll,将它拷贝粘贴一份后修改名字为mgls.dll: 双击win64文件夹中的patch64_dll.ba…...

计算机视觉与图形学-神经渲染专题-Seal-3D(基于NeRF的像素级交互式编辑)
摘要 随着隐式神经表示或神经辐射场 (NeRF) 的流行,迫切需要与隐式 3D 模型交互的编辑方法,以完成后处理重建场景和 3D 内容创建等任务。虽然之前的作品从不同角度探索了 NeRF 编辑,但它们在编辑灵活性、质量和速度方面受到限制,无…...

接口测试中缓存处理策略
在接口测试中,缓存处理策略是一个关键环节,直接影响测试结果的准确性和可靠性。合理的缓存处理策略能够确保测试环境的一致性,避免因缓存数据导致的测试偏差。以下是接口测试中常见的缓存处理策略及其详细说明: 一、缓存处理的核…...

CTF show Web 红包题第六弹
提示 1.不是SQL注入 2.需要找关键源码 思路 进入页面发现是一个登录框,很难让人不联想到SQL注入,但提示都说了不是SQL注入,所以就不往这方面想了 先查看一下网页源码,发现一段JavaScript代码,有一个关键类ctfs…...

Unity3D中Gfx.WaitForPresent优化方案
前言 在Unity中,Gfx.WaitForPresent占用CPU过高通常表示主线程在等待GPU完成渲染(即CPU被阻塞),这表明存在GPU瓶颈或垂直同步/帧率设置问题。以下是系统的优化方案: 对惹,这里有一个游戏开发交流小组&…...
Java 8 Stream API 入门到实践详解
一、告别 for 循环! 传统痛点: Java 8 之前,集合操作离不开冗长的 for 循环和匿名类。例如,过滤列表中的偶数: List<Integer> list Arrays.asList(1, 2, 3, 4, 5); List<Integer> evens new ArrayList…...
Linux简单的操作
ls ls 查看当前目录 ll 查看详细内容 ls -a 查看所有的内容 ls --help 查看方法文档 pwd pwd 查看当前路径 cd cd 转路径 cd .. 转上一级路径 cd 名 转换路径 …...

涂鸦T5AI手搓语音、emoji、otto机器人从入门到实战
“🤖手搓TuyaAI语音指令 😍秒变表情包大师,让萌系Otto机器人🔥玩出智能新花样!开整!” 🤖 Otto机器人 → 直接点明主体 手搓TuyaAI语音 → 强调 自主编程/自定义 语音控制(TuyaAI…...
OpenPrompt 和直接对提示词的嵌入向量进行训练有什么区别
OpenPrompt 和直接对提示词的嵌入向量进行训练有什么区别 直接训练提示词嵌入向量的核心区别 您提到的代码: prompt_embedding = initial_embedding.clone().requires_grad_(True) optimizer = torch.optim.Adam([prompt_embedding...
C++八股 —— 单例模式
文章目录 1. 基本概念2. 设计要点3. 实现方式4. 详解懒汉模式 1. 基本概念 线程安全(Thread Safety) 线程安全是指在多线程环境下,某个函数、类或代码片段能够被多个线程同时调用时,仍能保证数据的一致性和逻辑的正确性…...

基于 TAPD 进行项目管理
起因 自己写了个小工具,仓库用的Github。之前在用markdown进行需求管理,现在随着功能的增加,感觉有点难以管理了,所以用TAPD这个工具进行需求、Bug管理。 操作流程 注册 TAPD,需要提供一个企业名新建一个项目&#…...

排序算法总结(C++)
目录 一、稳定性二、排序算法选择、冒泡、插入排序归并排序随机快速排序堆排序基数排序计数排序 三、总结 一、稳定性 排序算法的稳定性是指:同样大小的样本 **(同样大小的数据)**在排序之后不会改变原始的相对次序。 稳定性对基础类型对象…...