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

加强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注入

(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篡改脚本

(使用注释而不是空格的SQLMap篡改脚本)

通常认为删除引号可以使参数安全,但有时攻击者可以指定另一个特殊字符来定义字符串。例如,PostgreSQL允许定义包含在双美元符号中的多行字符串。所以“email”等于$$ email$$。

SQLMap篡改脚本,使用双美元符号代替单引号

(SQLMap篡改脚本,使用双美元符号代替单引号)

最后但并非最不常见的错误是对数据库关键字进行非递归删除。这也很容易绕过检测,因为攻击者可以在相同的关键字中间插入关键字。因此,经过清理之后,注入仍然存在。例如:

“SELSELECTECT” -> “SELECT”

用于嵌套关键字的SQLMap篡改脚本

(用于嵌套关键字的SQLMap篡改脚本)

七、防止SQL注入的正确方法

防止SQLi的第一步是使用预处理语句。允许用户定义预处理语句也是不可接受的。这里有一个使用TypeORM防止SQL注入的例子:采用硬编码的模板,并使用这个框架的特性来安全地插入变量:

使用TypeORM编写语句

(使用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语句,选择要操作的表。 第二步&#xff1…...

面试之快速学习c++11-函数模版的默认模版参数,可变模版,tuple

//学习地址&#xff1a; http://c.biancheng.net/view/3730.html 函数模版的默认模版参数 在 C98/03 标准中&#xff0c;类模板可以有默认的模板参数&#xff0c;如下&#xff1a; template <typename T, typename U int, U N 0> struct TestTemplateStruct {};但是…...

Visual Studio Code 常见的配置、常用好用插件以及【vsCode 开发相应项目推荐安装的插件】

一、VsCode 常见的配置 1、取消更新 把插件的更新也一起取消了 2、设置编码为utf-8&#xff1a;默认就是了&#xff0c;不用设置了 3、设置常用的开发字体&#xff1a;Consolas, 默认就是了&#xff0c;不用设置了 字体对开发也很重要&#xff0c;不同字体&#xff0c;字母形…...

源码编译安装gcc

摘要&#xff1a; 在编译开源的FunASR项目的C代码时&#xff0c;可能要求的gcc版本不符合&#xff0c;需要升级gcc版本&#xff0c;但是从网上搜索升级gcc方式&#xff0c;大部分都是通过简单的yum命令方式升级&#xff0c;我也尝试了这个方式&#xff0c;这种方式并不能升级到…...

pc文件上传

1.代码&#xff1a; <template><div><el-upload:multiple"true":auto-upload"true":headers"headers":action"uploadFileUrl":before-upload"handleBeforeUpload":on-error"handleUploadError":o…...

Vue3_对响应式对象解构赋值之后失去响应性

官网toRefs() :响应式 API&#xff1a;工具函数 | Vue.js toRefs 在调用时只会为源对象上可以枚举的属性创建 ref。如果要为可能还不存在的属性创建 ref&#xff0c;请改用 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 上下颠倒&#xff0c;左右相反 4、错切变换4.1 实现错切变换 5、仿射变换5.1 求解仿射变换5.2 OpenCV实现仿射…...

第十次CCF计算机软件能力认证

第一题&#xff1a;分蛋糕 小明今天生日&#xff0c;他有 n 块蛋糕要分给朋友们吃&#xff0c;这 n 块蛋糕&#xff08;编号为 1 到 n&#xff09;的重量分别为 a1,a2,…,an。 小明想分给每个朋友至少重量为 k 的蛋糕。 小明的朋友们已经排好队准备领蛋糕&#xff0c;对于每个朋…...

【敏捷开发】测试驱动开发(TDD)

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

骑砍二 ATC MOD 使用教程与应用案例解析

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

python和c语言哪个好上手,c语言和python语言哪个难

大家好&#xff0c;本文将围绕python和c语言哪个更值得学展开说明&#xff0c;python语言和c语言哪个简单是一个很多人都想弄明白的事情&#xff0c;想搞清楚c语言和python语言哪个难需要先了解以下几个事情。 前言 新手最容易拿来讨论的三个语言&#xff0c;具体哪个好&#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) {// 查询网络状态&#xff0c;被动监听网络状态变化ConnectivityManager cm (ConnectivityManager) context.getSystemService(Context.C…...

【黑马头条之kafka及异步通知文章上下架】

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

Modelsim打开后报unable to checkout a viewer license

找到Modelsim安装包中的MentorKG.exe文件和patch64_dll.bat文件&#xff0c;将这两个文件拷贝到Modelsim安装目录中的win64文件夹&#xff1a; 在win64文件夹中找到mgls64.dll&#xff0c;将它拷贝粘贴一份后修改名字为mgls.dll&#xff1a; 双击win64文件夹中的patch64_dll.ba…...

计算机视觉与图形学-神经渲染专题-Seal-3D(基于NeRF的像素级交互式编辑)

摘要 随着隐式神经表示或神经辐射场 (NeRF) 的流行&#xff0c;迫切需要与隐式 3D 模型交互的编辑方法&#xff0c;以完成后处理重建场景和 3D 内容创建等任务。虽然之前的作品从不同角度探索了 NeRF 编辑&#xff0c;但它们在编辑灵活性、质量和速度方面受到限制&#xff0c;无…...

RestClient

什么是RestClient RestClient 是 Elasticsearch 官方提供的 Java 低级 REST 客户端&#xff0c;它允许HTTP与Elasticsearch 集群通信&#xff0c;而无需处理 JSON 序列化/反序列化等底层细节。它是 Elasticsearch Java API 客户端的基础。 RestClient 主要特点 轻量级&#xff…...

Linux链表操作全解析

Linux C语言链表深度解析与实战技巧 一、链表基础概念与内核链表优势1.1 为什么使用链表&#xff1f;1.2 Linux 内核链表与用户态链表的区别 二、内核链表结构与宏解析常用宏/函数 三、内核链表的优点四、用户态链表示例五、双向循环链表在内核中的实现优势5.1 插入效率5.2 安全…...

Admin.Net中的消息通信SignalR解释

定义集线器接口 IOnlineUserHub public interface IOnlineUserHub {/// 在线用户列表Task OnlineUserList(OnlineUserList context);/// 强制下线Task ForceOffline(object context);/// 发布站内消息Task PublicNotice(SysNotice context);/// 接收消息Task ReceiveMessage(…...

Rust 异步编程

Rust 异步编程 引言 Rust 是一种系统编程语言,以其高性能、安全性以及零成本抽象而著称。在多核处理器成为主流的今天,异步编程成为了一种提高应用性能、优化资源利用的有效手段。本文将深入探讨 Rust 异步编程的核心概念、常用库以及最佳实践。 异步编程基础 什么是异步…...

AI编程--插件对比分析:CodeRider、GitHub Copilot及其他

AI编程插件对比分析&#xff1a;CodeRider、GitHub Copilot及其他 随着人工智能技术的快速发展&#xff0c;AI编程插件已成为提升开发者生产力的重要工具。CodeRider和GitHub Copilot作为市场上的领先者&#xff0c;分别以其独特的特性和生态系统吸引了大量开发者。本文将从功…...

自然语言处理——循环神经网络

自然语言处理——循环神经网络 循环神经网络应用到基于机器学习的自然语言处理任务序列到类别同步的序列到序列模式异步的序列到序列模式 参数学习和长程依赖问题基于门控的循环神经网络门控循环单元&#xff08;GRU&#xff09;长短期记忆神经网络&#xff08;LSTM&#xff09…...

C++ Visual Studio 2017厂商给的源码没有.sln文件 易兆微芯片下载工具加开机动画下载。

1.先用Visual Studio 2017打开Yichip YC31xx loader.vcxproj&#xff0c;再用Visual Studio 2022打开。再保侟就有.sln文件了。 易兆微芯片下载工具加开机动画下载 ExtraDownloadFile1Info.\logo.bin|0|0|10D2000|0 MFC应用兼容CMD 在BOOL CYichipYC31xxloaderDlg::OnIni…...

SAP学习笔记 - 开发26 - 前端Fiori开发 OData V2 和 V4 的差异 (Deepseek整理)

上一章用到了V2 的概念&#xff0c;其实 Fiori当中还有 V4&#xff0c;咱们这一章来总结一下 V2 和 V4。 SAP学习笔记 - 开发25 - 前端Fiori开发 Remote OData Service(使用远端Odata服务)&#xff0c;代理中间件&#xff08;ui5-middleware-simpleproxy&#xff09;-CSDN博客…...

人机融合智能 | “人智交互”跨学科新领域

本文系统地提出基于“以人为中心AI(HCAI)”理念的人-人工智能交互(人智交互)这一跨学科新领域及框架,定义人智交互领域的理念、基本理论和关键问题、方法、开发流程和参与团队等,阐述提出人智交互新领域的意义。然后,提出人智交互研究的三种新范式取向以及它们的意义。最后,总结…...

虚拟电厂发展三大趋势:市场化、技术主导、车网互联

市场化&#xff1a;从政策驱动到多元盈利 政策全面赋能 2025年4月&#xff0c;国家发改委、能源局发布《关于加快推进虚拟电厂发展的指导意见》&#xff0c;首次明确虚拟电厂为“独立市场主体”&#xff0c;提出硬性目标&#xff1a;2027年全国调节能力≥2000万千瓦&#xff0…...