vb.net - SQL 注入(inject) : Why is the following code dangerous?

标签 vb.net tsql sql-injection sanitization

一位实习生编写了以下 vb.net 代码:

    Public Sub PopulateUsersByName (name As String)
        'Here, the parameter 'name' is unsantized, coming straight from the form

        Dim query As String = ""
        query += vbNewLine + " SELECT Id, FirstName, LastName FROM dbo.[Users]"
        query += vbNewLine + " WHERE FirstName LIKE '" + REPLACE(name, "'", "''") + "'"
        query += vbNewLine + "     OR LastName LIKE '" + REPLACE(name, "'", "''") + "'"

        'Execute SQLCommand with above query and no parameters
        'Then do some other stuff

    END Sub

我已经解释过,一般来说,在尝试执行上述操作时,永远不应该使用字符串连接。最佳实践是使用 SP 或带参数的 SQLClient.SQLCommand。

他的逻辑是:通过用两个单引号替换所有单引号(并在字符串的开头和结尾添加额外的单引号)来清理任何 sql varchar(xxx)。

我无法提供一个用户可以键入的内容来解决这个问题的示例——我希望我能找到比“但是,作为一般负责人,应该避免这种情况——你知道......因为。 ..好吧,不要和我争论——我是老板,我的愿望是你的命令。”。

注意:代码将始终连接到我们的 Microsoft SQL Server。但我可以想象它无法清理其他 SQL 实现的输入。

更新:

只是为了更清楚一点,我正在寻找的是参数 name 的可能值这将允许某人将 SQL 注入(inject)查询。

最佳答案

尝试使用他的代码使用 '%_%' (带和不带单引号)作为输入......与 SQL 中的 this 相同......

select SELECT Id, FirstName, LastName FROM dbo.[Users] from TBL_EMPLOYEES where FirstName like '%_%' or LastName like '%_%'

不管它是否失败,他的代码都很糟糕......公平地说,这只是一个单一的衬里,但除此之外,包括复杂的 SQL 语句将难以维护和调试......无论如何,使用 Sps让他习惯使用它们,并允许他利用 T-SQL 的灵 active 和强大功能......大声笑,我害怕想到我写的一些 SQL 在代码中会是什么样子......

你知道,我总是遇到这样的代码(而且更糟)......仅仅因为它可能会工作一段时间并不意味着它是正确的方法......如果你的实习生没有听听经验,他永远不会成为一名优秀的开发人员,这是可悲的事实

我曾经减少了一个初级开发人员尝试以与您的实习生相同的方式导入 CSV 文件(5000 万行),从她的 300 行代码(这永远不会工作)到仅一行 LINQ 将其转换为XML(我们不能使用 Bulk Insert 或 bcp)和一个花哨的 SP……是防弹的,工作完成了……

关于vb.net - SQL 注入(inject) : Why is the following code dangerous?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21555627/

相关文章:

php - SQL 注入(inject)、引用和 PHP

mysql - 如何使用 Windows 窗体 (vb.net) 将数据库单列行存储到数组中

vb.net - 无法逃脱空文本框

sql - 如何生成随机 Base36 ID

python - 使用 Python 错误填充 PostgreSQL 数据库

c# - 如何在从中选择的表发生变化的 ADO.NET 中安全地创建查询?

c# - 只允许在 datagridview 单元格中输入一些字符

vb.net - HttpUtility.ParseQueryString 未按预期工作

sql-server - sp_dbcmptlevel 被弃用后如何检查 SQL Server 数据库兼容性?

sql - 从同一表中的逗号分隔列更新行列