这更像是一个概念问题。
我在c#中构建了一个小的wpf应用程序来读取工资单数据的csv并将其插入到我的sql 2005数据库中,不需要编辑或删除。
我已经采取了我能想到的所有步骤来保护应用程序免受用户进入sql注入和阅读主题。这些步骤包括连接字符串用户作为低级sql用户,将我的datagrid控件列与sql表紧密匹配以及不可编辑的用户输入(组合框,文件和日期选择器,只有特定的csv文件名)。我关闭数据源的更新方法是将读取csv的数据表合并到datagrid中并显示到sql datatable然后更新。
我现在有一个想法,最明显的弱点是csv文件本身(我可以看到!)。我可以看到有人可能会创建一个具有正确文件名的csv,并在“删除[某些声明] - 等列中输入”并将其读入。
所以现在我觉得需要检查这个输入,但很多文章说这个客户端的东西是浪费时间。其他人的想法是什么?我在考虑一个简单的类,其中包含要检查的事项列表,例如'sp',';','选择','删除',' - '然后是一个函数,根据需要检查csv列输入和句柄。
课堂观念有点粗糙吗?
答案 0 :(得分:4)
我在考虑一个简单的类,其中包含要检查的事项列表,例如'sp',';','选择','删除',' - '然后是一个函数,根据需要检查csv列输入和句柄。
课堂观念有点粗糙吗?
是。它也无效。寻找违规术语并将其过滤掉是一场失败的战斗。相反,您应该做的只是不在数据库中执行用户输入作为代码。如果有人输入字符串“DELETE”并且你执行该字符串作为代码那么你就会受到攻击。另一方面,如果有人输入字符串“DELETE”并且您只是将该字符串保存到数据库中,那么他们所做的只是输入数据到数据库。
将用户输入字符串视为字符串,而不是代码。保存它们,不要执行它们。
如果没有看到实际的数据访问代码,就很难更具体。您可能对SQL注入攻击持开放态度。没有人看到你的代码,这里任何人都无法知道。
但是SQL注入漏洞不在UI中。那个可能就是你在这个奇怪的陈述中所提到的:
很多文章说这个客户端的东西是浪费时间
任何SQL注入漏洞都将出现在您与数据库交互的代码中。只要对该代码的输入正确处理为值而不是作为可执行代码(例如,参数化查询而不是查询连接),那么您就不应该有SQL注射漏洞。
答案 1 :(得分:4)
您应该能够使用SQL参数而不是从输入数据构建SQL语句:
请参阅:Why do we always prefer using parameters in SQL statements?