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に保存されないのですか?
ダークナイト

1
@Darknight、あなたはクッキーを保存するセッションがあると仮定しています。存在するかどうかは、より大きなセキュリティ問題とは無関係です。
ロジャーハリバートン

回答:


24

それらを教えることができます。誰でも、あなたでさえこれを最初に行います。このタイプのコードが本番環境に組み込まれた場合、上級者のせいです。後輩ではありません。

編集:

私がやったことの1つは、リリース前に自分のコード(ジュニアを含む)をレビューするよう人々に積極的に依頼することです。コードはレビューされ、後輩はそれを学習体験と見なし、人々は罰としてコードレビューの恐怖を失い、同じことを始めます。


2
+1同意する必要があります。(おそらく)ジュニアプログラマーを非難することはできません。なぜなら、彼らが持っていないかもしれないレベルの知識を想定しているからです。(それはあなたがしたい、と述べたいと、このような問題はよくこの日および年齢で知られていると思うしその後、再び、私は思います。好きな私はなど、見ている才能と良かったと考えるのは):-)
ジョン・パーカー

十分な声明。上級プログラマーによって承認されていないコードを運用環境に導入することを経営陣が主張する理由を尋ねるフォローアップの質問をする必要があると思います。軽度のセキュリティ問題で仕事を危険にさらしますか?
ロジャーハリバートン

1
@ロジャーハリバートン:まあ、そのセキュリティ問題何らかの形で悪用された場合、起こりうる最悪の事態は何ですか?そして、なぜセキュリティの問題を指摘することがあなたの仕事に費用をかけるのでしょうか?経営者はこれに対処したくないですか?
FrustratedWithFormsDesigner

1
@ロジャー-あなたがハッキングされるまで、それはマイナーです。:)(開発者のレベルに関係なく)レビューなしでコードを本番環境に入れることは失敗だと思います。残念ながら、これは多くの企業で非常に一般的な慣行です。そして、管理者がコードレビューのようなものを評価し始める前に、通常、それは大いに$ 4!tかかります。
ジョンクラフト

1
@Roger:「ジュニア」プログラマーによって書かれたコードだけでなく、すべてのコードをレビューする必要があります。上級プログラマーでも間違いを犯します。
ディーンハーディング

20

目の前でコードをハックし、修正方法を示します。彼らが理解するまで何度も。


4
毎朝、それらを電子メール:「ところで、私はあなたのコードに残って別のSQLインジェクションの脆弱性を利用して、最後の夜をもう一度データベースを落とした私はどのくらいデータベースのバックアップを復元するように知っている:D。!」
Antの

2
@Ant:お元気で。直前のバックアップではなく、スケジュールされたバックアップの直後に実行してください。
ドナルドフェローズ

@Donal:バックアップの直後に実行し、バックアップが失敗したことを伝え、残りの日は汗を流してから、バックアップを一晩で復元します。
11

8

入社後すぐにクラスを受講するように彼らに指示することができます。彼らはソース管理アクセス権を得る前に、SQLインジェクション、クロスサイトスクリプティング、クロスサイトリクエストフォージェリ、およびその他の一般的な脆弱性を紹介します。例題を対面でカバーし、それらの前に悪いコードを破り、悪いコードを破らせ、「卒業」したら詳細情報を得るためにOWASPサイトにそれらを向けます。

さらに、これを処理するカスタムライブラリの使用を義務付けることもできますが、それは、より便利になったときにカスタムクエリを実行することが確実になるため、二次的なソリューションにすぎません。

リソースがある場合は、コミットする前にチームの上級メンバーが差分を確認することも役立ちます。

知識は力である!


3
彼らがあなたの会社に入る前にそれらを除草することはよりよいです。SQLを使用するものを書くために誰かを雇っている場合、無能の注入境界についてのインタビューの質問をしません。
ウーブル

私は一般的には同意しますが、非常に賢明で意欲的なジュニア採用は、「N年の経験を持つPHP開発者」よりもはるかに安く、それほど良いとは限りません。スマートなジュニア開発者は、このようなものを非常に迅速に手に入れることができ、非常に大きな財産となります。
ヤン

3

あらゆるレベルの開発者として他の人が言及している不安であると仮定すると、getPost()が最初にデータを保護していないことを忘れがちです。

これを回避する1つの方法は次のとおりです。

  1. すべてのPOST / GETデータを取得し、「insecure_data」というシングルトンクラスにそのまま書き込むクラスを作成します。次に、POST / GET配列をクリアします。
  2. 開発者は、POST / GET配列ではなく、 'insecure_data'配列からPOST / GETデータを取得する必要があります。

「insecure_data」と呼ばれる配列から何かを取得し、それを保護することを気にしない開発者は、無知か怠laです。前者の場合はトレーニングを提供し、その後は後者でなければなりません。プログラミングの問題ではなく、懲戒の問題が発生します。


うわー、それは不必要に複雑であり、それでも問題を解決しません。入力をスクラブするだけではなく、データベースに入れるデータをスクラブすることであり、そのデータは理論的にはどこからでも、Webフォーム、メール、またはXMLドキュメントから取得できます。誰かがアップロードします。これらのすべての場合、データベースにアクセスするときにスクラブする必要があります。
ロジャーハリバートン

@RogerHalliburtonもちろんすべてを解決するわけではありませんが、安全でないデータ安全でないように見せるための完全に肉付けされたセキュリティ対策というよりは、概念(もしそうなら、ある種の設計パターン)です。
ダンは吹く

ああ、分かった。しかし、「このオブジェクトは安全であるとフラグ付けされていない限り安全ではない」と誰かに伝え、彼らがそれを何かに使用しようとすると、ほとんどの場合、実際にチェックせずに安全であるとフラグを立てます。さて、評判の向上をお楽しみください。
ロジャーハリバートン

ジュニア開発者の観点から見ると、$ insecure_dataを見るだけで、$ postdata(または何でも)を見るのとは異なる方法でフラグが立てられます。このアイデアは、Joel Spolskyの「間違ったコードを間違って見えるようにする」から来ています。開発者の人間性がその危険を無視するようなものである場合、多くのトレーニングを提供するか、新しい開発者を獲得する必要があります。
ダンは吹く

私はスポルスキーを台の上に置いていません。これらは一貫性のないタブ移動を簡単に無視する開発者であり、「安全でない」という名前の何かを使用することについて二度と考えることはありません。
ロジャーハリバートン

1

私がWebセキュリティに関して読んだ最高のガイドの1つは、このRuby on Railsセキュリティガイドです。Ruby on Railsですが、多くの概念はあらゆるWeb開発に適用されます。私は新しい人にそのガイドを読んでもらうことをお勧めします。


2
Rubyが安全でないことは誰もが知っています。
ロジャーハリバートン

5
@Roger:「誰もが知っている」あらゆる種類の事柄が真実であるかもしれないし、そうでないかもしれない。伝聞に基づくアプローチではなく、現実に基づいたプログラミングのアプローチを提唱します。
ドナルドフェローズ

0

上記でリンクしたコードは、SQLインジェクション攻撃を受けやすくなります。これは、クエリで使用しているHTTP入力がクリーンアップされていないmysql_real_escape_stringか、他の手段がないためです。


1
ああ、私たちはテストの質問のようにこれに答えていると思った:]
ライアン

質問の文言が事後的に変更されたため、Downvotesは少しラメです。P–
ライアン

0

(おそらくオーバーライドする)「プログラマーにこれをやめるようにするには」という質問に関して、定期的にそれらを指導し、問題の問題(および潜在的なフォールアウトなど)を注意深く説明し、強調することコードの脆弱性(SQLインジェクションとクロスサイトスクリプティングなどの両方の面で)の重要性は、おそらく最も賢明なソリューションです。

上記のすべてにも関わらず、彼らが混乱を続けている場合(「ライブ」を見つけるのではなく、コミットに目を向けたい場合があります)、問題はメンターとして失敗していること、またはおそらく、彼らは生計を立てるためにより適した何かを見つける必要があります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.