参数化语句能阻止所有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注入吗? 的相关文章

  • 创建用于存储高尔夫球成绩的可扩展数据库架构

    我正在尝试设计一个数据库来存储我所有的朋友和我的高尔夫球成绩 您可能知道 高尔夫得分由 18 洞的个人得分组成 我可以想到两种设计模式的方法 创建一个表 每个洞有一列 例如 h1 到 h18 该表具有引用其他表的 FK player id
  • 如何从 Databricks Delta 表中删除列?

    我最近开始发现 Databricks 并遇到了需要删除增量表的特定列的情况 当我使用 PostgreSQL 时 它就像 ALTER TABLE main metrics table DROP COLUMN metric 1 我正在浏览 Da
  • SQL,帮助进行有关用户年龄的小查询

    我有一个包含注册用户的表 其中我将年份保存为 varchar 值 只是因为我只花了一年 我想创建包含年龄的饼图 以显示哪些用户更有可能注册 下面的查询给出了表中出现超过 5 次的用户年龄计数 以避免结果过小 虽然这些小结果低于 having
  • 如何对Oracle进行SQL注入

    我正在对一个系统进行审计 开发人员坚称该系统可以防止 SQL 注入 他们通过去掉登录表单中的单引号来实现这一点 但后面的代码没有参数化 它仍然使用字面 SQL 如下所示 username username Replace var sql s
  • OVER ORDER BY 中的多个列

    有没有办法在 OVER ORDER BY 子句中指定多个列 SELECT ROW NUMBER OVER ORDER BY A Col1 AS ID FROM MyTable A 上面的方法工作正常 但尝试添加第二列不起作用 SELECT
  • SQL:两个没有完整列匹配的表的并集

    我有一个table A其中有一组列A1 A2和一个具有一组列的 table bB1 B2 碰巧的是A2 B1但其余列不匹配 也不应该匹配 我想附加表格 所以我使用UNION ALL 对于不匹配的列 我使用null as COLUMN NAM
  • 如何终止正在运行的 SELECT 语句

    如何通过终止会话来停止正在运行的 SELECT 语句 该命令不断根据 SELECT 语句向我提供输出 我想在其间停止它 As you keep getting pages of results I m assuming you starte
  • 在 Oracle 中创建数据库链接时出错

    我有两个数据库 需要编写跨数据库查询 所以我试图创建一个数据库链接 CREATE PUBLIC DATABASE LINK DBLink CONNECT TO SchemaName IDENTIFIED BY 123 using DBNam
  • 动态/条件 SQL 连接?

    我在 MSSQL 表 TableB 中有数据 其中 dbo tableB myColumn 在特定日期后更改格式 我正在做一个简单的连接到该表 Select dbo tableB theColumnINeed from dbo tableA
  • 如何将 T-SQL 中的结果连接到列中?

    我正在处理一个查询 它应该给我这样的结果 Name Surname Language Date James Hetfield en gb fr 2011 01 01 Lars Ulrich gb fr ca 2011 01 01 但我的选择
  • 导致聚集索引扫描的日期参数

    我有以下查询 DECLARE StartDate DATE 2017 09 22 DECLARE EndDate DATE 2017 09 23 SELECT a col1 a col2 b col1 b col2 b col3 a col
  • 如何重命名 SQL Server 中名称中带有方括号的内容?

    我的一张桌子上有一列 周围有方括号 Book Category 我想重命名为Book Category 我尝试了以下查询 sp rename BookPublisher Book Category Book Category COLUMN
  • 数据库“key/ID”设计思想、代理键、主键等

    因此 我最近看到多次提到代理键 但我不太确定它是什么以及它与主键有何不同 我总是假设 ID 是表中的主键 如下所示 Users ID Guid FirstName Text LastName Text SSN Int 然而 维基百科将代理键
  • 如何比较表中最后一个和倒数第二个条目的值?

    我在 Oracle 中有一个名为quotes 的表 其中包含两列 date 和value 我想比较表中最后一个条目和倒数第二个条目的值 在此示例中 我想获取日期13 1 和 11 1在一行中以及每个日期的值之间的差异 10 5 5 报价表
  • PHP 中的 SQL 语句与 phpmyadmin 中的 SQL 语句的行为不同

    I have form store sql INSERT INTO myodyssey myaccount id email username password VALUES NULL email unixmiah formtest woo
  • 如何在sql中提取周数

    我有一个 varchar2 类型的转换列 其中包含以下主菜 01 02 2012 01 03 2012 etc 我使用 to date 函数将其转换为另一列中的日期格式 这是我得到的格式 01 JAN 2012 03 APR 2012 当我
  • 如何查询多对多表(一个表的值成为列标题)

    给定此表结构 我想展平多对多关系 并将一个表的名称字段中的值设置为列标题 并将同一表中的数量设置为列值 目前可行的想法是将值放入字典 哈希表 中并用代码表示这些数据 但我想知道是否有 SQL 方法可以做到这一点 我还使用 Linq to S
  • 动态 SQL 和 where case 哪个更好?

    我需要创建一个带有 12 个参数的存储过程 并使用这些参数的不同组合来过滤查询 所有 12 个参数都不是强制性的 就好像我传递 3 5 或 12 个参数取决于用户输入的搜索输入一样 我可以通过两种方式创建 即使用动态 SQL 查询或使用 C
  • 使用 SQL 确定子网掩码的 cidr 值

    我想找到一种方法来执行 SQL 查询 该查询将计算存储在数据库中的子网掩码的 cidr 位表示 例如 我在数据库中存储了 255 255 255 0 或其十进制值 4294967040 我想通过查询进行选择并返回 24 表示 我已经执行了类
  • 在单个查询中设置和选择?

    我想知道是否可以在单个查询中设置和选择 像这样的事情 SET LOCAL search path TO 1 SET LOCAL ROLE user SELECT from posts 你可以这样做 with some set as sele

随机推荐

  • 在 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 攻击时 他们并没有真正解释原因 通常是 确实如此 所以不要问为什么 可能是因为他们不了解自己 糟糕的教育者的一个明显标志