如何使程序员停止编写易受SQL注入攻击的代码?


11

有时您会很忙,将一些小任务委派给初级程序员。但是,如果您没有给予足够的关注,您就会在生产中使用这种代码:

class DivtoggleController extends Zend_Controller_Action {

    public function closeAction() {
        /* ... code removed for brevity ... */

        $req = $this->getRequest();
        $formData = $req->getPost();

        $d = $formData['div'];
        $i = $formData['id'];

        $dm = new Model_DivtoggleManager();
        $rs = $dm->setDivToggleById($d, $i);

    }

}


class Model_DivtoggleManager extends Zend_Db_Table {

    public function setDivToggleById($div, $id) {
        $result = $this->getAdapter()->query(
           "update div_toggle set " . $div . "=1 where id=" . $id
        );
    }

}

因此,为简洁起见,鉴于我已经删除了身份验证/会话管理逻辑,谁能告诉我此样本可能存在什么问题?


为什么不将其存储在简单的Cookie中?
2011年

1
@Darknight,您假设存在一个用于存储cookie的会话。是否存在与更大的安全性问题无关。
罗杰·哈里伯顿

Answers:


24

您可以教他们。每个人一开始都会这样做,即使您也是如此。如果将这种类型的代码投入生产,那是老年人的错。不是初中。

编辑:

我所做的一件事是我个人主动要求人们在发布之前检查我的代码(包括初级版本)。对代码进行审查,初级用户将其视为学习经验,人们不再担心对代码审查的惩罚,因此他们开始做同样的事情。


2
+1必须同意。您不能责怪(大概)初级程序员,因为您假设他们可能不具备一定的知识水平。(这就是说,你会喜欢去思考这样的问题,在这个时代,众所周知话又说回来,我想,喜欢认为我是有才华和美观等):-)
约翰·帕克

足够公平的声明。我想我应该问一个后续问题,即为什么管理层会坚持将未经高级程序员批准的代码发布到生产中。我是否会因为轻微的安全问题而冒险工作?
罗杰·哈利伯顿

1
@Roger Halliburton:好吧,如果确实以某种方式利用了该安全问题,那么最糟糕的情况是什么?为何指出安全问题会花费您的工作呢?管理层是否不想对此进行处理?
FrustratedWithFormsDesigner

1
@Roger-在被黑客入侵之前这是很小的事情。:)我认为,将代码投入生产而不进行审查(无论开发人员的水平如何)都是失败的。不幸的是,这在许多公司中是非常普遍的做法。而且,在管理层开始重视代码审查之类的东西之前,ime通常需要花费大量时间oh- $ 4!t。
约翰·卡夫

1
@Roger:应该检查所有代码,而不仅仅是“初级”程序员编写的代码。即使是高级程序员也会犯错误。
Dean Harding

20

在他们眼前乱砍他们的代码,然后向他们展示如何修复它。一遍又一遍,直到他们了解。


4
每天早上给他们发邮件:“对了,我昨晚又通过在代码中留下另一个SQL注入漏洞降到你的数据库,我知道你是多么喜欢还原数据库备份:d”
蚂蚁

2
@Ant:很好。做到这一点不久未前不久计划的备份。
Donal Fellows

@Donal:在备份后不久执行此操作,然后告诉他们备份失败,并让他们在一天的余下时间流汗,然后将备份恢复整夜。
jwenting 2011年

8

您可以要求他们在加入您的公司后立即上课,然后他们才能进行源代码控制访问,从而向他们介绍SQL注入,跨站点脚本编写,跨站点请求伪造以及其他常见漏洞。当面对面的例子时,破坏错误代码,让它们破坏错误代码,一旦“毕业”,就将它们指向OWASP网站以获取更多信息。

您还可以要求使用自定义库来为您处理此问题,但这只是辅助解决方案,因为他们将确保在更方便时运行自定义查询。

如果您有足够的资源,确保在提交之前确保团队中更多的高级成员验证其差异也很有用。

知识就是力量!


3
在他们加入您的公司之前清除它们会更好。如果您正在雇用某人编写任何使用SQL的东西,而不是问面试官有关无能的注入边界的问题。
Wooble

我通常会同意,但是非常聪明且雄心勃勃的初级招聘要比“具有N年经验的PHP开发人员”便宜很多,但不能保证会更好。精明的初级开发人员可以非常快地掌握这些东西,并且是一笔不小的财富。
yan

3

假设这是其他人以任何级别的开发人员所提到的不安全性,则很容易忘记getPost()并没有首先保护数据。

解决此问题的一种方法是:

  1. 编写一个获取所有POST / GET数据的类,并将其照原样写入名为“ insecure_data”的Singleton类。然后清除POST / GET数组。
  2. 开发人员必须从“ insecure_data”数组而不是POST / GET数组中检索POST / GET数据。

任何从称为“ insecure_data”的数组中检索某些内容而又不打算保护它的开发人员都是无知的或懒惰的。如果是前者,请提供培训,之后必须是后者-然后您将遇到纪律问题,而不是编程问题。


哇,那是不必要的麻烦,仍然无法解决问题。清理仅仅是出于娱乐目的,而不是清理输入到数据库中的数据,理论上数据可以来自任何地方,从Web表单,电子邮件或XML文档中获取。有人上传。在所有这些情况下,您都需要在进入数据库时​​进行清理。
罗杰·哈利伯顿

@RogerHalliburton当然,它不能解决所有问题,但它是一个概念(一种设计模式,如果可以的话),而不是一种完全完善的安全措施,可以使不安全的数据看起来不安全。
Dan Blows'Apr

知道了 但是,如果您告诉某人“除非将该对象标记为安全的,否则该对象是不安全的”,并且他们尝试将其用于某些用途,那么您在战斗的只是人类的本性,大多数情况下,他们会在未进行实际检查的情况下将其标记为安全。好吧,享受声誉提升。
罗杰·哈里伯顿

从初级开发人员的角度来看,仅看到$ insecure_data会以一个仅看到$ postdata(或其他任何东西)不会的方式引发一个标志。这个想法来自Joel Spolsky的“使代码看起来不正确”。如果您的开发人员的人性是如此忽略该危险信号,那么您要么需要提供大量的培训,要么就需要一些新的开发人员。
Dan Blows'Apr

我不会让Spolsky处于基座上。这些开发人员很容易忽略不一致的制表符,对于使用名为“不安全”的东西,他们不会三思而行。
罗杰·哈里伯顿

1

我已阅读的有关Web安全性的最佳指南之一是Ruby on Rails安全性指南。尽管它是Ruby on Rails,但是许多概念适用于任何Web开发。我鼓励任何新手阅读该指南。


2
每个人都知道Ruby不安全。
罗杰·哈里伯顿

5
@Roger:“每个人都知道”各种各样可能正确或不正确的事情。我主张基于现实的编程方法,而不是基于传闻的方法。
Donal Fellows

0

您上面链接的代码很容易受到SQL注入攻击的影响,因为您在查询中使用的HTTP输入尚未通过mysql_real_escape_string任何其他方式清除。


1
哦,我以为我们像一个测试问题一样回答这个问题:]
Ryan

下注有点la脚,因为问题的措词事后已更改:P
Ryan

0

关于您的(大概是压倒一切的)“我怎样才能让程序员停止这样做”的问题,我想说的是定期指导他们,仔细解释所讨论的问题(以及潜在的后果等)并强调代码漏洞的重要性(从SQL注入和跨站点脚本等方面来说)可能是最明智的解决方案。

如果他们尽管上述所有事情仍然混乱不堪(您可能想关注他们的提交等,而不是发现“实时”),那么问题就出在您使他们作为导师失败了,还是他们也许需要找到更适合做生活的东西。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.