0

我在阅读有关防止 sql 注入攻击的保护时完成了我的作业:我知道我需要使用参数绑定,但是:

  • 我已经这样做了,谢谢。
  • 我知道我的用户使用的一些数据库驱动程序以最愚蠢的方式实现参数绑定。即,它们容易受到sql注入攻击。我可以尝试限制他们可以使用哪个数据库驱动程序,但是这种策略注定要失败。
  • 即使我使用了不错的数据库驱动程序,我也不相信自己不会忘记至少使用一次参数绑定

因此,我想通过对面向 http 的用户输入进行额外的清理来添加额外的保护层。诀窍是我知道这通常很难做到,所以我宁愿使用由安全专业人员编写的经过良好审核、精心设计的第三方库,以将输入字符串转义为不太危险的内容,但我找不到任何明显的候选人。我使用 python,所以我会对基于 python 的解决方案感兴趣,但如果我可以将它们绑定到 python,其他建议也很好。

4

4 回答 4

2
  • 我已经这样做了,谢谢。

好的; 有了这个,您可以完全确定(是的,完全确定)用户输入仅被解释为值。您应该将精力用于保护您的站点免受其他类型的漏洞(想到 XSS 和 CSRF;确保您正确使用 SSL 等等)。

  • 我知道我的用户使用的一些数据库驱动程序以最愚蠢的方式实现参数绑定。即,它们容易受到sql注入攻击。我可以尝试限制他们可以使用哪个数据库驱动程序,但是这种策略注定要失败。

好吧,世上没有万无一失的东西,因为傻瓜太聪明了。如果您的受众决心破坏您为保护他们的数据而付出的所有努力,那么您真的无能为力。您可以做的是确定您认为哪些驱动程序是安全的,并在您检测到您的用户正在使用其他东西时生成一个可怕的警告。

  • 即使我使用了不错的数据库驱动程序,我也不相信自己不会忘记至少使用一次参数绑定
  1. 所以不要那样做!

  2. 在开发过程中,记录发送到驱动程序的每个sql 语句。定期检查用户数据是否从未在此日志中(或作为单独的事件记录,用于参数)。

  3. SQL 注入基本上是字符串格式化。您通常可以将每个数据库事务向后跟踪到原始 sql;如果用户数据在此过程中的某个地方被格式化,那么你就有问题了。在扫描项目时,我发现我能够以大约每分钟一个的速度找到这些项目,有效地使用了 grep 和我选择的编辑器。除非您有数以万计的不同 sql 语句,否则遍历每一个语句应该不会非常困难。
  4. 尝试使您的数据库交互与应用程序的其余部分很好地隔离。将 sql 与您的其他代码混合在一起,很难维护,或者进行我上面描述的检查。理想情况下,您应该通过某种数据库抽象(完整的 ORM 或者更薄的东西),以便在手头的任务时可以只处理与数据库相关的代码。
于 2012-04-26T15:20:19.033 回答
1

我不知道这是否适用,但我只是为了完整性而将其放在那里,专家可以随意对我投反对票……更不用说我担心它在某些情况下的表现。

我曾经的任务是保护一个用经典 asp 编写的老化 Web 应用程序免受 sql 注入的影响(当时它们受到的打击非常严重)

我有时间浏览所有代码(不是可以选择的),所以我在我们的一个标准包含文件中添加了一个方法,该方法查看用户提交的所有内容(通过请求参数迭代)并检查它是否有列入黑名单的 html 标签(例如脚本标签)和 sql 注入标志(例如“;--”和“';shutdown”)..

如果它找到它重定向用户告诉他们他们提交是可疑的,如果他们有问题的电话或电子邮件..等等等等。

它还在表格中记录了注入尝试(一旦被转义)以及有关攻击的 IP 地址时间等的详细信息。

总的来说,这是一种享受……至少攻击停止了。

我使用的每一种网络技术都有某种方式来伪造这样的东西,我只花了一天时间来开发和测试..

希望它有所帮助,我不会将其称为行业标准或任何东西

tl;dr?: 根据字符串黑名单检查所有请求参数

于 2012-04-26T08:24:45.840 回答
0

因此,我想通过对面向 http 的用户输入进行额外的清理来添加额外的保护层。

这种策略注定要失败。

于 2012-04-26T14:56:03.440 回答
-1

在 php 中,我使用 preg_replace 来保护我的网站免受 sql 注入攻击。preg_match 也可以使用。尝试在 python 中搜索 this 的等效函数。

于 2012-04-26T08:14:20.903 回答