在csv导入应用程序中保护sql注入

时间:2013-10-05 11:54:46

标签: c# sql-server wpf

这更像是一个概念问题。

我在c#中构建了一个小的wpf应用程序来读取工资单数据的csv并将其插入到我的sql 2005数据库中,不需要编辑或删除。

我已经采取了我能想到的所有步骤来保护应用程序免受用户进入sql注入和阅读主题。这些步骤包括连接字符串用户作为低级sql用户,将我的datagrid控件列与sql表紧密匹配以及不可编辑的用户输入(组合框,文件和日期选择器,只有特定的csv文件名)。我关闭数据源的更新方法是将读取csv的数据表合并到datagrid中并显示到sql datatable然后更新。

我现在有一个想法,最明显的弱点是csv文件本身(我可以看到!)。我可以看到有人可能会创建一个具有正确文件名的csv,并在“删除[某些声明] - 等列中输入”并将其读入。

所以现在我觉得需要检查这个输入,但很多文章说这个客户端的东西是浪费时间。其他人的想法是什么?我在考虑一个简单的类,其中包含要检查的事项列表,例如'sp',';','选择','删除',' - '然后是一个函数,根据需要检查csv列输入和句柄。

课堂观念有点粗糙吗?

2 个答案:

答案 0 :(得分:4)

  

我在考虑一个简单的类,其中包含要检查的事项列表,例如'sp',';','选择','删除',' - '然后是一个函数,根据需要检查csv列输入和句柄。

     

课堂观念有点粗糙吗?

是。它也无效。寻找违规术语并将其过滤掉是一场失败的战斗。相反,您应该做的只是不在数据库中执行用户输入作为代码。如果有人输入字符串“DELETE”并且你执行该字符串作为代码那么你就会受到攻击。另一方面,如果有人输入字符串“DELETE”并且您只是将该字符串保存到数据库中,那么他们所做的只是输入数据到数据库。

将用户输入字符串视为字符串,而不是代码。保存它们,不要执行它们。

如果没有看到实际的数据访问代码,就很难更具体。您可能对SQL注入攻击持开放态度。没有人看到你的代码,这里任何人都无法知道。

但是SQL注入漏洞不在UI中。那个可能就是你在这个奇怪的陈述中所提到的:

  

很多文章说这个客户端的东西是浪费时间

任何SQL注入漏洞都将出现在您与数据库交互的代码中。只要对该代码的输入正确处理为而不是作为可执行代码(例如,参数化查询而不是查询连接),那么您就不应该有SQL注射漏洞。

答案 1 :(得分:4)

您应该能够使用SQL参数而不是从输入数据构建S​​QL语句:

请参阅:Why do we always prefer using parameters in SQL statements?