6

小背景:我是这家公司唯一的程序员。我正在使用预先存在的框架。

也就是说,该公司有一个 dll(Database.dll),其中包含“我需要的所有数据库交互”。例如,它有一个Query(), Update(),Insert()等。现在,我正在编写的项目设置了对 Database.dll 的引用。我的项目接受零用户输入。最接近用户输入的是一个下拉框,用户可以从中选择一个日期。没有太多经验,我很好奇我是否还需要担心 SQL 注入?如果是这样,查询会写成

var query = string.Format("SELECT timestamp FROM table1 WHERE date = \"{0}\" 
                           AND measured_dist = bit_loc AND rop > 0" , Date))

作为参数化查询就足够了吗?Query()请记住,所有查询执行都由我被告知必须使用且无法编辑 的预先存在的查询执行处理。

编辑

这个程序是一个 WinForm 应用程序。

4

5 回答 5

6

如评论中所述,答案是“总是”。因为向其中添加参数并正确执行它会很容易,而不是串联:只需第一次就正确执行。另外:您是否认为注入不是您显示的代码中唯一的问题?该代码也容易受到本地化/国际化的影响。对于在不同文化中配置 PC 的用户会发生什么?日期和数字会以不同的方式呈现 - 并且经常会中断。参数不会发生这种情况。另外:名称中通常有撇号:)

于 2013-01-16T21:08:00.530 回答
4

请扩展@KirkWoll 的非常有效的评论,任何时候您将任何用户输入(或自动来源的输入)合并到 SQL 语句中,您的程序就会面临 SQL 注入的风险。

作为一个政策问题,您永远不应该使用任何此类输入构建您自己的 SQL 语句。

始终清理输入并始终使用参数化查询作为抵御 SQL 注入的第一道防线。

如果你以前没见过,xkcd 上有一个很棒的插图

http://xkcd.com/327/

于 2013-01-16T21:05:51.770 回答
2

鉴于这是一个 WinForms 程序,访问数据库的唯一安全方法是使用带参数的存储过程。然后创建一个只能访问这些 SP 的用户。其他任何东西都不安全。

虽然带有参数的查询在与可能具有“攻击”输入的 Web 应用程序一起使用时可作为一种安全措施,但在与可以反汇编并重写为任何内容的本地应用程序一起使用时它们会失败。如果您不提供 SP 安全性,您将迷失方向。

于 2013-01-16T21:20:15.467 回答
1

即使用户交互可能是下拉菜单,老练的攻击者也有可能插入不在选择列表中的值。所以是的,你仍然应该警惕 SQL 注入。

于 2013-01-16T21:07:16.230 回答
0

即使没有 SQL 注入之类的东西,我也会使用准备好的语句。它们只是更容易使用,在某些情况下,它们允许数据库缓存语句,下次使用时不必编译它。Oracle 会这样做,我认为 SQL Server 会这样做,我不知道 MySQL 是否会这样做。

您应该始终假设存在黑客,即使在内部 Intranet 项目中,我使用准备好的语句并使用随机数来防止 CSRF。

于 2013-01-16T21:15:32.947 回答