参数化语句能阻止所有SQL注入吗?

2024-02-27

如果是的话,为什么还有那么多成功的SQL注入呢?仅仅因为一些开发人员不使用参数化语句?


当文章谈论参数化查询阻止 SQL 攻击时,他们并没有真正解释原因,通常是“确实如此,所以不要问为什么”——可能是因为他们不了解自己。糟糕的教育者的一个明显标志是不能承认自己不知道某些事情。但我离题了。 当我说我发现困惑很简单是完全可以理解的。想象一下动态 SQL 查询

sqlQuery='SELECT * FROM custTable WHERE User=' + Username + ' AND Pass=' + password

所以一个简单的 sql 注入只需将用户名输入为 ' OR 1=1-- 这将有效地进行 sql 查询:

sqlQuery='SELECT * FROM custTable WHERE User='' OR 1=1-- ' AND PASS=' + password

这表示选择用户名为空 ('') 或 1=1 的所有客户,这是一个布尔值,相当于 true。然后它使用 -- 注释掉查询的其余部分。因此,这只会打印出所有客户表,或者用它做任何您想做的事情,如果登录,它将使用第一个用户的权限登录,该用户通常可以是管理员。

现在参数化查询的做法有所不同,代码如下:

sqlQuery='SELECT * FROM custTable WHERE User=? AND Pass=?'

parameters.add("User", username)
parameters.add("Pass", password)

其中用户名和密码是指向关联输入的用户名和密码的变量

现在,您可能会想,这根本不会改变任何事情。当然,您仍然可以在用户名字段中输入类似Nobody OR 1=1'--之类的内容,从而有效地进行查询:

sqlQuery='SELECT * FROM custTable WHERE User=Nobody OR 1=1'-- AND Pass=?'

这似乎是一个有效的论点。但是,你错了。

参数化查询的工作方式是,sqlQuery 作为查询发送,数据库确切地知道该查询将执行什么操作,只有这样,它才会将用户名和密码仅作为值插入。这意味着它们无法影响查询,因为数据库已经知道查询将做什么。因此,在这种情况下,它将查找用户名“Nobody OR 1=1'--”和空白密码,这应该会出现错误。

但这不是一个完整的解决方案,仍然需要完成输入验证,因为这不会影响其他问题,例如 XSS 攻击,因为您仍然可以将 javascript 放入数据库中。然后,如果将其读出到页面上,它将根据任何输出验证将其显示为普通 JavaScript。因此,最好的做法仍然是使用输入验证,但使用参数化查询或存储过程来阻止任何 SQL 攻击。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

参数化语句能阻止所有SQL注入吗? 的相关文章

  • 跨多个表进行搜索,并在结果行中显示表名称

    如何构建 SQL 语句以跨多个平面不相关的表运行 并使用选择结果和结果来自的表的名称显示结果 这种情况是这样的 我有几个表 每个表都有相同的列名 这是我从外部各方收到的数据 并将其存储在不同的表中 相同的表看起来像 Table 1 pid
  • 用更轻的解决方案替换完整的 ORM(JPA/Hibernate):推荐的加载/保存模式?

    我正在开发一个新的 Java Web 应用程序 并且正在探索保存数据的新方法 对我来说是新方法 我主要有 JPA 和 Hibernate 的经验 但是 除了简单的情况之外 我认为这种完整的 ORM 可能会变得相当复杂 另外 我不太喜欢和他们
  • 使用 ADODB 连接从关闭的工作簿中检索数据。某些数据被跳过?

    我目前正在编写一些代码 可以通过 ADODB 连接访问单独的工作簿 由于速度的原因 我选择了这种方法而不是其他方法 下面是我的代码 Sub GetWorksheetData strSourceFile As String strSQL As
  • 自加入表

    我有一张像这样的桌子 Employee name salary a 10000 b 20000 c 5000 d 40000 我想获取所有工资高于A工资的员工 我不想使用任何嵌套或子查询 在采访中被问及并暗示是使用自连接 我真的不知道如何实
  • 为什么我可以像调用实例方法一样调用类方法?

    我正在查看这个例子 class SQLObject def self columns return columns if columns columns DBConnection execute2 lt lt SQL first SELEC
  • XML 解析:格式良好的检查:未声明的实体

    我正在使用 SSMS 2008 但收到以下错误 你知道这意味着什么吗 Msg 9448 Level 16 State 1 Line 4 XML parsing line 1 character 89 well formed check un
  • 如何使用 LAMBDA 表达式在 LINQ 中执行 IN 或 CONTAINS?

    我有以下 Transact Sql 我正在尝试将其转换为 LINQ 并且很挣扎 SELECT FROM Project WHERE Project ProjectId IN SELECT ProjectId FROM ProjectMemb
  • SQL不允许表中有重复记录

    如何使其不添加重复项 我想让它通过 ID 之外的所有其他列进行检查 我希望这个无效 ID col1 col2 col3 1 first middle last ID col1 col2 col3 2 first middle last 我希
  • 如何获得顶部带有千位分隔符的数字?

    SELECT count FROM table A 假设结果是8689 我怎样才能将它转换为8 689在 SQL Server 上 尝试这样 select replace convert varchar convert Money coun
  • SQL Server 上的语法错误

    这可能是一个愚蠢的语法错误 但我只是继续阅读我的程序 但我无法弄清楚我的错误在哪里 消息 156 第 15 级 状态 1 第 41 行关键字附近的语法不正确 为了 这是我的代码 alter procedure LockReservation
  • POINT 列上的 MySQL INSERT/UPDATE

    我正在尝试用我国家的地理位置填充我的数据库 我的一张表有 4 个字段 ID PK 纬度 经度和地理点 EDIT SCDBs Punto Geografico SET lat 18 469692 SET lon 63 93212 SET g
  • java ResultSet,使用MAX sql函数

    你好 这就是我想要的 我连接到数据库并检索 UniqueId 列的最大元素 并将其分配给名为 maxID 的整数变量 这是我的方法 int maxID 0 Statement s2 con createStatement s2 execut
  • 如何查找当前数据库类型

    我们有一个 SQL 脚本可以在多种类型的数据库上执行 是否可以获取正在执行 SQL 脚本的当前数据库的类型 注意 我们不能使用非标准 SQL 即 TSQL 等 不 ANSI SQL 中没有任何关于确定数据库供应商的内容
  • MySQL“LIKE”搜索不起作用

    我通过 LOAD DATA INFILE 在 MySQL 中导入了一个 txt 数据库 一切似乎都正常 唯一的问题是 如果我使用以下查询在数据库上搜索记录 SELECT FROM hobby WHERE name LIKE Beading
  • 不带 GROUP BY 的聚合查询

    这个查询似乎在我的旧机器上完美运行 但是 在我的 MySQL 5 7 14 和 PHP 5 6 25 的新机器上 它会抛出错误 致命错误 未捕获异常 PDOException 并带有消息 SQLSTATE 42000 语法错误或访问冲突 1
  • 通过 osql.exe 运行脚本时出现问题

    我尝试以这种格式运行我的软件的更新脚本 osql exe i path to script U 用户 P 密码 S sqlserver 位置 d 数据库名称 n b 大多数脚本的格式相同 并且都以 GO 结尾 其中很多都运行得很好 但随机脚
  • SQL 2008全文索引填充延迟

    我的经理说 在基础表数据更改后 可能需要一段时间才能更新全文搜索索引 例如 如果我有一张桌子Products有一个柱子Description我更新了该描述 然后我可能需要一些时间才能搜索该新描述 真的吗 这需要多长时间 SQL 2008 对
  • 如何搜索例程的内容/(SP-触发函数)

    我需要在数据库内所有例程的例程主体 存储过程 函数 触发器 中搜索文本 我该怎么做 Thanks SELECT OBJECT NAME object id FROM sys sql modules WHERE definition LIKE
  • 在存储过程中验证用户的最简单方法?

    我需要一个存储过程 可以通过发送以下内容来检查登录尝试时他们是否是有效用户login and password查看它们在数据库中是否匹配 有没有一种简单的方法可以做到这一点 如果没有更多信息 我目前能提供的最好信息是 CREATE STOR
  • 快速查询最新记录的方法?

    我有一张这样的表 USER PLAN START DATE END DATE 1 A 20110101 NULL 1 B 20100101 20101231 2 A 20100101 20100505 在某种程度上 如果END DATE i

随机推荐

  • 在 Python 中监听连接时接收命令行输入

    我正在尝试编写一个程序 让客户端连接到它 同时服务器仍然能够向所有客户端发送命令 我正在使用 扭曲 解决方案 我该怎么办 这是我到目前为止的代码 我知道 Twisted 已经使用非阻塞套接字 import threading print t
  • JAVA执行Unix系统命令问题

    我在从 JAVA 代码执行系统命令时遇到一个奇怪的问题 其实我想得到Mac OSX来自我的 JAVA 应用程序的系统信息 为此 我正在使用 Runtime getRuntime exec system profiler detailLeve
  • HTML 5 文件输入 iOS 和 Android [Cordova/Phonegap]

    在 PhoneGap 应用程序中 我尝试使用 HTML5 使用相机input像这样的标签 使用 CLI 创建新项目 添加iOS和Android平台 添加相机插件 为两种设备构建 在两台设备上运行 实际设备 iPhone 5 配备 iOS 7
  • DataGridView 重新加载后保存过滤

    我在 C 中使用 DataGridView 时遇到一些问题 case is 我对数据库进行一些更新 然后使用新值重新加载 DataGridView myDataGridView DataSource myDataSet Tables 0 一
  • Android Canvas.drawText

    我有一个视图 我正在 onDraw Canvas canvas 方法中使用 Canvas 对象进行绘制 我的代码是 Paint paint new Paint paint setColor Color WHITE paint setStyl
  • CSS DIV 内联在底部

    我有3个部门要放inline at the bottom 我不知道该怎么做 任何人都可以帮助我吗 The expected output 我尝试过的代码 feature description margin top 20px padding
  • 从 CentOS 7 或 RHEL 7 中完全删除 MariaDB 或 MySQL

    我在 CentOS 7 上安装了 MariaDB 但我在某些配置上遇到了一些问题 现在它完全配置错误 因此 我想用 yum remove mariadb mariadb server 删除MariaDB 然后用 yum install ma
  • 使用 R 分割字符串和计算字符的更快方法?

    我正在寻找一种更快的方法来计算从 FASTA 文件读取的 DNA 字符串的 GC 含量 这归结为获取一个字符串并计算字母 G 或 C 出现的次数 我还想指定要考虑的字符范围 我有一个工作函数相当慢 它导致我的代码出现瓶颈 它看起来像这样 c
  • 如何从收据中提取相关信息

    我正在尝试结合使用 Opencv Tesseract 和 Keras 从一系列不同的收据中提取信息 该项目的最终结果是 我应该能够使用手机拍摄收据照片 并从该照片中获取商店名称 支付类型 卡或现金 支付金额和找零 到目前为止 我已经使用 O
  • ASP.NET MVC 4 捆绑 - 调试模式下的单个文件 URL

    Problem 在 ASP NET MVC 4 5 中完成的 HTML5 离线应用程序中 我们使用框架的捆绑和缩小样式和脚本内置功能 http www asp net mvc tutorials mvc 4 bundling and min
  • Objective-C:即使为 AVSystemController_SystemVolumeDidChangeNotification 添加观察者,也没有调用volumeChanged?

    void viewDidLoad NSNotificationCenter defaultCenter addObserver self selector selector volumeChanged name AVSystemContro
  • 加密能保证完整性吗?

    为了构建一个安全的系统 我们可以在开始安全编程之前假设加密保证完整性是真实的吗 无论是对称密钥还是公钥 加密 是我的问题 证明良好 如果没有 有哪些 漏洞 你能给出一个 例子 不 如果您考虑一下 这一点很容易看出一次性垫 http en w
  • 如何在 GORM 中将 PostgreSQL 函数设置为默认值?

    我想要类似的东西 type User struct ID int sql default
  • 如何找到DWT信号变换的频段?

    我是信号处理方面的新手 我想找出 Daubechies 小波 db4 变换输出的每个级别的频率范围 转换是通过 PyWavelet 完成的 我正在 python 中工作 下面的代码输出 5 个细节级别和 1 个近似值 但是我不确定每个级别描
  • 如何区分 bitbucket 管道中的两个 git 分支

    背景 我想确保推送分支上的所有提交消息都有时间日志 ie add readme spend 5m Problem 我想获取 bitbucket 管道中两个 git 分支之间的提交差异 这是我的 yaml 管道配置 pipelines def
  • 如何将 cdecl 回调与 pinvoke 一起使用

    我有一个带有 cdecl 回调的 C 库 我如何在 c 中使用这些 一切似乎都在说它们一定是 stdcall 回调 需要明确的是 delegate int del dllimport mylib dll CallingConvention
  • 如何在Python中计算两个向量数组的点积? [复制]

    这个问题在这里已经有答案了 A and B都是数组shape N 3 它们各自包含 N 个向量 使得A 0 a0 vector A 1 a1 and B 0 b0 B 1 b1 我想计算 N 对向量 an 和 bn 的点积 换句话说 我想获
  • Google 地图 Android API v2 - 简单的地图应用程序崩溃

    我是 Android 开发新手 我正在尝试创建一个简单的应用程序 带有地图的活动 我将 HTC 1x 连接到计算机 当我尝试运行该应用程序 通过 intellij IDEA 时 它崩溃了 我在网络 和 stackoverflow 上搜索了线
  • 使用elastic4s在搜索中获得零结果

    这是我用来进行简单搜索的小代码 import com sksamuel elastic4s ElasticsearchClientUri ElasticClient import com sksamuel elastic4s Elastic
  • 参数化语句能阻止所有SQL注入吗?

    如果是的话 为什么还有那么多成功的SQL注入呢 仅仅因为一些开发人员不使用参数化语句 当文章谈论参数化查询阻止 SQL 攻击时 他们并没有真正解释原因 通常是 确实如此 所以不要问为什么 可能是因为他们不了解自己 糟糕的教育者的一个明显标志