这段代码可以防止SQL注入吗?

2024-03-16

背景

我已签约分析现有数据提供者,并且我知道以下代码有错误;但为了指出它有多糟糕,我需要证明它容易受到 SQL 注入的影响。

Question

什么“Key”参数可能会破坏PrepareString函数并允许我执行DROP陈述?

代码片段

Public Shared Function GetRecord(ByVal Key As String) As Record
    Dim Sql As New StringBuilder()

    With Sql
        .Append("SELECT * FROM TableName")
        If String.IsNullOrEmpty(Agency) Then
            .Append(" ORDER BY DateAdded")
        Else
            .Append(" WHERE Key = '")
            .Append(PrepareString(Key))
            .Append("'")
        End If
    End With

    Return ExecuteQuery(Sql.ToString())
End Function

Public Shared Function PrepareString(ByVal Value As String) As String
    Return Value.Replace("''", "'") _
                .Replace("'", "''") _
                .Replace("`", "''") _
                .Replace("´", "''") _
                .Replace("--", "")
End Function

回答你的直接问题:此代码是否可以防止 SQL 注入:否

这是证明 - 通过PrepareString方法推送这个字符串:

Dim input = "'" & Chr(8) & "; Drop Table TableName; - " & Chr(8) & "-"
Dim output = PrepareString(input)

Console.WriteLine(input)
Console.WriteLine(output)

我修改了您发布的 GetRecord 方法,以返回完全准备好的 SQL 字符串,而不是从数据库获取记录:

Console.WriteLine(GetRecord(output))

这是输出

Input  = ; Drop Table TableName; --
Output = '; Drop Table TableName; --
Query  = SELECT * FROM TableName WHERE Key = ''; Drop Table TableName; --'

添加 1 行额外代码:

My.Computer.Clipboard.SetText(input)

您已经将需要复制到剪贴板的字符串粘贴到网站上的输入字段中以完成 SQL 注入:

'; Drop Table TableName; - -

[请注意,StackOverflow 的帖子输出中省略了控制字符,因此您必须按照代码示例来创建输出]

运行PrepareString方法后,它将具有完全相同的输出 - Chr(8) ASCII代码是退格键,它将删除您附加到我的多余的“'”,这将关闭您的字符串,然后我可以自由地在最后添加我想要的任何内容。您的PrepareString看不到我的--因为我实际上使用--和退格字符来删除空格。

您正在构建的 SQL 代码将不受阻碍地执行我的 Drop Table 语句,并立即忽略查询的其余部分。

有趣的是,您可以使用不可打印的字符来基本上绕过您可以发明的任何字符检查。因此,使用参数化查询是最安全的(这不是您所要求的,但却是避免这种情况的最佳途径)。

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

这段代码可以防止SQL注入吗? 的相关文章

  • .NET 中的线程中止

    我有一个线程正在分析文件并对数据库进行事务调用 每个事务都有一个审计条目作为其事务的一部分 调用 Thread Abort 来停止文件的处理有什么大问题吗 而不是到处散布丑陋的安全点 文件将在 Abort 调用后关闭 明显的问题是放弃交易的
  • 哪种 SQL 模式能够更快地避免插入重复行?

    我知道有两种不重复插入的方法 第一个是使用WHERE NOT EXISTS clause INSERT INTO table name col1 col2 col3 SELECT s s s WHERE NOT EXISTS SELECT
  • c#.net 中委托事件的超级简单示例? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我需要一个非常简单的例子来了解自己对这些事件的了解 我觉得很难理解互联网或书籍上提供的示例 这是公开事
  • 在 SQL Server 中选择条件的值[重复]

    这个问题在这里已经有答案了 在查询选择中 我想显示字段是否满足条件的结果 想象一下我有一张名为stock 该表有一列告诉我库存中每种商品的数量 我想做的是这样的 SELECT stock name IF stock quantity lt
  • C# - 挂钩现有 COM 对象

    假设我们有一个现有进程 或应用程序 它从 ocx 文件 例如 MyCOMLibrary ocx 调用 COM 对象 有没有办法编写一个 C 库来精确复制 ocx 文件 这样原始应用程序就可以调用您的 C 代码而不是原始 COM 对象 当然
  • Python 仪器驱动程序

    我是一名实验物理学家 并且是Python http en wikipedia org wiki Python 28programming language 29 我发现它非常适合数据分析和脚本编写 实际上我还用它来连接实验室仪器 网络分析仪
  • 当应用程序终止时,我可以安全地依赖 Threads 中的 IsBackground 吗?

    我正在 GUI 中运行一些后台线程 目前 我正在实现个人线程取消代码 但线程中有 IsBackground 属性 根据 MSDN 它们会自行取消 我知道它将进入 Thread Abort 这很令人讨厌 但是在这个后台线程中没有任何事情需要我
  • 关系数据库和图数据库的比较

    有人可以向我解释一下 MySQL 等关系数据库与 Neo4j 等图形数据库相比的优缺点吗 在 SQL 中 您有多个表 它们之间有不同的 id 链接 然后你必须加入来连接表 从新手的角度来看 为什么要将数据库设计为需要联接 而不是像图形数据库
  • 如何将 Excel 中的图表导出为图形

    我有一系列 Excel 电子表格 每个电子表格至少包含一页数据和一页根据数据创建的图表 我需要捕获 不从数据中重新生成 将现有图表作为网络友好图像 这可以通过 Java 或 Net 实现吗 我知道 POI 的东西 Java 不会这样做 或者
  • 在 Oracle SQL 中执行 MERGE 时,如何更新 SOURCE 中不匹配的行?

    我有一个main数据库和一个report数据库 我需要同步一个表main into report 但是 当项目在main数据库 我只想设置一个IsDeleted标志在report数据库 执行此操作的优雅方法是什么 我目前正在使用 MERGE
  • 导入 IronPython 的嵌入式库

    我已通过 NuGet 将 IronPython 标准库添加到我的 c net4 项目中 后来获得了一些参考资料 IronPython IronPython Modules IronPython SQLite IronPython Wpf M
  • C#中析构函数的使用?

    我对 C 中析构函数的使用有点困惑 据我所知我们不能打电话 根据我的愿望 析构函数会在垃圾收集器之前自动调用 以对类 对象 执行一些工作 所以我想问一下我们是否在 C 中使用析构函数 那么我们何时需要垃圾收集器 据我所知 析构函数可以处理内
  • 无法使用前导 ../ 在顶级目录之上退出

    我有一个 asp net 网站 我们有管理区域 其中的登录页面仅供管理员使用 并且所有网站都允许所有人使用 当我收到此错误时 我需要询问如何为其定义正确的安全配置 Cannot use a leading to exit above the
  • 显示多个表的账户余额

    我有以下两个表 其中存储有关贷记和借记记录的信息 couponCr 表包含 voucherType voucherPrefix voucherNo crparty cramount SALES S 1 1 43000 SALES S 2 1
  • 动态SQL生成列名?

    我有一个查询 我正在尝试将行值转换为列名称 目前我正在使用SUM Case As ColumnName 声明 像这样 SELECT SKU1 SUM Case When Sku2 157 Then Quantity Else 0 End A
  • 从Oracle表中删除重复行

    我正在 Oracle 中测试某些内容并使用一些示例数据填充表 但在此过程中我不小心加载了重复记录 因此现在我无法使用某些列创建主键 如何删除所有重复行并只保留其中一行 Use the rowid伪列 DELETE FROM your tab
  • 为什么像 BindingList 或 ObservableCollection 这样的类不是线程安全的?

    我一次又一次发现自己必须编写 BindingList 和 ObservableCollection 的线程安全版本 因为当绑定到 UI 时 这些控件无法从多个线程更改 我想理解的是why情况就是这样 这是设计错误还是故意的 问题是设计一个线
  • 您认为 ASP.NET MVC 会与 ASP.NET Webforms 竞争吗?

    您认为 ASP NET MVC 会在 Microsoft Web 开发市场中占据重要份额吗 还是会占市场的 10 15 哦是的 它将让 Web 表单脱颖而出 我们已经看到了真正的 MVC 框架在 Java 世界中的价值 在 MS 世界中 这
  • 单向关系和双向关系的区别

    我想知道这两个词是什么意思 我遇到他们是在教义的文档 http www doctrine project org documentation manual 2 0 en association mapping 但我不明白他们的意思 这与常见
  • 使用 OleDbCommand / OleDbDataAdapter 读取 CSV 文件

    我不明白为什么 但是当我使用 OleDbDataAdapter 或 OleDbCommand 读取 CSV 文件时 在这两种情况下 生成的数据结构良好 它识别文件头中的列 但行数据都是空字符串 我之前已经成功进行过多次 CSV 处理 因此我

随机推荐

  • 结合代码契约和正则表达式

    所以我有一个非常简单的类 其中一个字符串作为属性 该字符串必须具有一定的模式 我正在尝试使用代码合同来强制执行此操作 这个类看起来像这样 class SimpleClass public Property get set public Si
  • 在 UITableViewCell 中播放视频

    我正在尝试在单元格本身中播放视频 而不是全屏视频显示 我在用MPMoviePlayerController以此目的 我已经定义了 MPMoviePlayerController moviePlayer 在实施部分 Then in cellF
  • 查找 HTML5 表单用于验证的正则表达式

    一些 HTML5 输入元素接受pattern属性 它是用于表单验证的正则表达式 其他一些 HTML5 输入元素 例如 input type email自动进行验证 现在看来 跨浏览器处理验证的方式是不同的 给定一个特定的浏览器 比如 Chr
  • JSP/Servlet 中的倒计时器

    我正在使用 servlet jsp 开发在线考试 我需要在问题页面添加一个倒计时 hh mm ss 计时器 该计时器将结束考试并重定向到结果页面 除了计时器功能之外 我已经完成了所有其他功能 有人可以为此提供一些帮助吗 Thanks 您是否
  • 如何将本地数据存储数据导出到生产 Google App Engine 数据存储

    我想将本地数据存储数据导出到我的 google appengine 应用程序数据存储 有没有直接且简短的方法可以做到这一点 你可以阅读相关内容here http code google com appengine docs python t
  • STM32内部时钟

    我对 STM32F7 设备 意法半导体的 Cortex M7 微控制器 上的时钟系统感到困惑 参考手册没有充分阐明这些时钟之间的差异 SYSCLK HCLK FCLK 参考手册中阅读章节 gt RCC 为 Cortex 系统定时器 SysT
  • Angular 4 预定表单自动保存

    我正在尝试在 Angular 4 中实现表单数据自动保存 它应该像这样工作 用户更改表单中的某些数据 gt 调用对数据库的某些保存请求 我们假设这里启动了一些计时器 2 秒 在上一个保存请求之后的 2 秒内 所有更改都不会调用任何请求 以减
  • 为什么我的书呆子树有这些奇怪的字符

    尝试让 vim 设置顺利进行 我想让书呆子树发挥最佳状态 但是当我使用它时 它的每个部分前面都有这些字符 V 看起来像这样 V project V tools 我遇到了完全相同的问题 并且能够通过取消注释 UTF 8 并在 etc loca
  • 使用 HTML 和 CSS 扩展大括号

    有没有一种简单的方法可以模拟cases提供的环境amsmath在 LaTeX 中使用 HTML 和 CSS 例如 在 LaTeX 中 可以这样写 documentclass article usepackage amsmath begin
  • SQL Anywhere 11,JZ0C0:连接已关闭

    我开发基于 apache tomcat 6 0 26 apache cxf 2 2 7 spring 3 0 hibernate 3 3 和 sybase sqlanywhere 11 的 Web 服务 我使用 SYBASE jconn j
  • 使用回形针上传多个文件

    我在使用回形针上传多个文件时遇到问题 我的模型是这样的 slider has many imgarrays imgarrays has many imageobjects imageobjects have attachment as fo
  • Android 中的 WorkManager 多次执行 do Work()

    我正在使用 WorkManager 来安排一些任务 但问题是工作管理器在一次调用中多次执行这些任务 doWork 我在用 android arch work work runtime 1 0 0 alpha08 我尝试过使用 alpha07
  • 如何在 Google 云端硬盘中搜索子文件夹和子子文件夹?

    这是一个常见问题 场景是 folderA folderA1 folderA1a folderA2 folderA2a folderA2b 问题是如何列出根目录下所有文件夹中的所有文件folderA 编辑 2020 年 4 月 Google
  • 在 ASP.NET c# 中重定向到另一个页面之前显示 ClientScript 警报?

    我必须在这里解决一个问题 我正在开发一个系统 我不断地向用户显示消息 例如 我正在添加一个新客户端 我输入所有数据并按 保存 在 C 上我所做的就是完成所有保存过程 然后我使用 ClientScript RegisterStartupScr
  • 如何在没有 VS 6.0 的计算机上安装 Microsoft FlexGrid Control 6.0?

    我的 VB NET 应用程序使用 Microsoft Flex Grid Control 6 0 这是一个遗留应用程序 已通过 Visual Studio 转换向导从 VB6 移植 虽然我可以编译程序集 但由于某些类未注册 我收到了 COM
  • For 循环中的 Grunt 运行

    我是咕噜声的新手 我有一个适用于单个构建的 gruntfile 有几个目标链接在一起来完成该过程 问题是我需要使用变量数据创建几个不同的版本 我正在尝试弄清楚如何在我的 gruntfile 中执行此操作 今天 要进行构建 我只需要运行 gr
  • 让 `nosetests` 脚本按 Python 版本选择文件夹

    我曾经有过这个setup cfg file nosetests where test python toolbox 但现在我通过提供两个并行代码库来支持 Python 2 和 Python 3 其中一个位于source py2文件夹和其中一
  • 使用facet_wrap时,geom_bar中的条形有不需要的不同宽度

    我找不到以下问题的解决方案 我非常感谢一些帮助 以下代码使用facet 生成条形图 然而 由于 ggplot2 在某些组中具有 额外空间 即使我指定 0 1 或类似的宽度 它也会使条形变得更宽 我觉得这很烦人 因为它看起来很不专业 我希望所
  • 如何在 C++ 中正确返回数组(类成员)?

    我对 C 还很陌生 所以这可能是一个微不足道的问题 我的类有一个私有成员变量 它是一个数组 我需要返回该数组 但我不确定如何正确执行此操作 class X private double m Array 9 public double Get
  • 这段代码可以防止SQL注入吗?

    背景 我已签约分析现有数据提供者 并且我知道以下代码有错误 但为了指出它有多糟糕 我需要证明它容易受到 SQL 注入的影响 Question 什么 Key 参数可能会破坏PrepareString函数并允许我执行DROP陈述 代码片段 Pu