web-dev-qa-db-ja.com

安全なコーディングの実践について愛する人に教える

これは狭すぎるかもしれませんが、ITSecの専門家に固有の問題です。愛する人は新しいプログラミングのキャリアを始めたばかりであり、彼女が最も基本的なプログラミングの概念を一から学ぶのを見る喜びを感じます。彼女は各カレッジコースでクラスのトップにあり、高品質の仕事を生み出しており、非常に注目を集めているため、すでに契約作業を行っています。

ITSecの専門家として、私たちは開発サイクルに安全なコーディングの実践と設計を注入することについて話しますが、それはまったく新しい学習者にどのように適用されますか?新しいプログラマーは、彼ら自身の「生涯の開発サイクル」の始まりにいます。教育の観点から、「機能させる」という考え方から「絶対に安全でなければならない」という考え方に切り替えるのはどの時点で適切ですか。セキュリティの問題のため、生徒はどの時点で課題に「失敗」しますか?

彼女は安全なコードを作成する必要性を完全に理解しており、それを望んでいますが、彼女のクラスはどれもアイデアを導入しておらず、コードのレビューと分析のために私を訪ね続けています。安全な設計を使用するためにすべてのクラス割り当てを再設計するように彼女に強制する切り替えはいつ行うべきですか?

欲求不満な要件を導入することで有望なキャリアを短くしたくはありませんが、その新しいキャリアを可能な限り最高のスタートにしたいと考えています。さらに、初心者のプログラマーの視点から安全なコーディングの基本を教えてくれるリソースはありますか?私は行くにつれてそれを補っていることがわかります...

私はあなたのアドバイスを歓迎します。

  • 教育の観点から、「機能させる」という考え方から「絶対に安全でなければならない」という考え方に切り替えるのはどの時点で適切ですか。
  • セキュリティの問題のため、生徒はどの時点で課題に「失敗」しますか?
  • 安全な設計を使用するためにすべてのクラス割り当てを再設計するように彼女に強制する切り替えはいつ行うべきですか?
  • 初心者のプログラマーの視点から安全なコーディングの基本を教えてくれるリソースはありますか?

余談ですが、基本的な「検証およびサニタイズ」セキュリティの観点から、彼女のクラス割り当てのコードレビューで基準を引き上げることにより、彼女は一般的に非常に高品質のコードを生成することに気づきました。この1つの例から、データフローとプログラミングロジックの理解をさらに深めることができるため、この方法で教育を開始することの価値を理解できると思います。

37
schroeder

私が学ぶための素晴らしい方法は、彼女がbreak彼女がすでに書いたアプリケーションであることです。

彼女がWebアプリケーションを作成していると仮定して、OWASPトップ10に向けます。自分のコードでこれらの欠陥のいずれかを見つけることができるかどうか確認してもらいます。実際に自分のコードで発生するのを見るよりも、セキュリティの概念について学ぶ良い方法はありません。

欠陥が見つかったら、アプリケーションを書き直して欠陥を修正してもらいます。そうすることで、ユーザー入力の衛生化や検証、パラメーター化されたクエリなどの効果を評価できます。

増分ステップを実行します。どのタイプのコードがセキュリティ上の欠陥をもたらすかを真に理解する前に、セキュリティを念頭に置いて新しいアプリケーションを設計することにすぐに飛び込むことはしません。

53
user10211

気まずくなるかもしれない立場を取るつもりです...

私が見る問題は、安全なプログラミングがアドオンとして教えられていることです。ベストプラクティスは、最初から(セキュリティを含む)教える必要があります。人々が教えられているうそは、練習が完璧になるということです。真実は、実践が永続化することです。それで、あなたがそれを間違っているなら、あなたはあなたが学んだことを学ばなければなりません。それがバサックワード方式です。

安全なコーディングの実践は、初日から教えられるべきだと思います。方法を学び、安全に行う方法を学ぶ必要はありません。時間とお金の無駄です...

私の2ビット、1、および0と言って...

16
Everett

私は原則としてエバレットに同意しますが、別の見方もあります。レッスンのポイントは、コンセプトを学び、さらにその上に構築できるようにすることです。これにより、学習曲線の傾きが小さくなります。教えるのが速すぎると圧倒的です。情報の猛攻撃に直面すると、ほとんどの頭脳は「リーク」します。

「安全なコーディングの実践は初日から教える必要がある」と言うのは素晴らしいことであり、特に「コンピュータプログラムとは何か」が新しい概念である場合に、初日の「Hello World」プログラムがどのように脆弱であるかを示すことは非常に難しいクラス。共有データストアに触れるWebサイトプロジェクト(大学の少なくとも半分まで実際には見ていませんでした)は弱点を示しやすいですが、多くの場合、これらの弱点は、「デフォルトの設定。脆弱性がわかっている場合、アプリケーションに脆弱性があることを証明するのは非常に簡単です。何も存在しないことを証明することは困難です(実際には不可能です)。

私はOPと同じように思います。プログラマーの開発のある時点で、「誰かがこのコードを使用して望まないことをするにはどうすればよいのか、そしてどのようにそれを防ぐことができるのか」という考えは、現在行っていることにマージできます。その出発点はおそらく、外部通信または永続性(ハードドライブまたはデータベースへのデータの読み取り/書き込み、またはネットワークチャネル経由での送信)、またはオブジェクト指向の原則(継承、オーバーロード/オーバーライド、等)、どちらか早い方。これは、コーダーが悪意のある人にダメージを与える力を持つプログラムを書き始めることができる場所であり、したがって、悪意のある人がプログラムを悪用できないように注意する必要があります。

いくつかの概念は理解しやすいです。 「私のプログラムはユーザーの秘密であるデータを処理します。私はそれを信頼しており、データを見る必要のある人だけが許可されるようにする必要があります。」難しいものもあります。プログラムのバイナリを逆コンパイルして読み取り、ハードコードされた資格情報やキーを見つけることができること、そして.NETのような一部の環境では、ビルドに使用するのとほぼ同じソースコードを生成するのに十分なメタデータをバイナリに入れることに本当にショックを受けている人を見てきました。または、それらのアセンブルされたバイナリを、コンパイルされた形式で、公開された封印されていないクラスまたはメンバーを使用してプラグインし、それらのクラスが扱うすべてのシークレットにアクセスできる攻撃者によって便乗できること。これらは説明する必要がある基本的な問題であり、次にそれらに対する解決策を説明する必要があり、それらがどのようにそしてなぜ機能するかを説明します。

13
KeithS

実際の教育の他の側面と同じように(おそらく、これはParenting.SEにもっとあるはずです...)、それは批判的思考に戻ってくると思います。

私の娘も大学のCSコースをいくつか受講しており、私は彼女がそれらを学習するのを手伝っています。しかし、私は彼女に情報をスプーンフィードしないでください、彼女はそれのために働く必要があります。
多くの場合、私は彼女に非常に悪いことを説明し、彼女がそれを私に呼ぶことを期待します。 (彼女は通常そうします)。時々、それはほんのわずかに間違っているだけで、それから彼女が気づくことはより困難です。時々、彼女はそれにすぐに気づかず、間違った仮定に基づいて何かを構築し始めます-その後、彼女は問題を見つけるために後方に努力しなければなりません。 (彼女もその点で良くなっています。)

このように、私は彼女に仮定を疑うことに慣れるように強制します。
彼女は確かに私の方法に興奮していません。

同様に、私は彼女に、彼女のコードが誤ってまたは悪意で悪用される可能性がある方法を見つけるように依頼します。私は彼女に、彼女は自分のコードを所有し、自分のコードが何をするかについて責任があると説明しました、ここには受動性の余地はありません。これの一部は適切な例外処理です。彼女のインストラクターは、ずっと後のコースまで実際にそれをしなくても、とにかくそうすることを期待しています。

もちろん、私は「カーゴカルトプログラミング」を教えることのすべての形式に反対します-そのように明示されていない限り、基本的な概念を可能にするそれはすべての話ではないという警告で教えました、そして、これは後でこれに戻ってきます。 (上記の例外処理など)。

これらすべてからの私の指摘は、"安全なプログラミング"は "プログラミング"と同じですです。
しかし、プログラミングブック全体を一度に一度に教えることができないのと同じように、概念は徐々に導入されます-基本概念が教えられながら、プログラミング概念の「セキュリティ」の側面は待つことができます「ここではまだ完了していません」という明確な注記により、また、少なくともより良い学生が安全でない側面のsomeを理解するであろうという期待。

TL; DR

  1. 新しいプログラミング概念を徐々に学習する必要があり、一部の側面(セキュリティを含む)を他の側面よりも後で教えることができます。
  2. 上記のプログラミングコンセプトは完全ではないであり、すべての側面が学習および理解されるまでセキュリティの側面を含みます(それまでは注意が必要です) ;
  3. プログラマーはコードを完全に制御しており、プログラマーになるには、自分のコードがどのように悪用される可能性があるかを知る必要があります。
  4. 批判的思考を実践する学生は、セキュリティの(必ずしもallとは限らない)早い段階で自分でこれを理解する必要がありますが、不足しているコンテキストとコードの大部分悪用);
  5. しないでください批判的思考を実践する学生は、実際にプログラミングを学ぶべきではありません...
9
AviD

最終的には、セキュリティ教育がレッスンの要点を不明瞭にしない点を理解しようとすることが最終的には重要だと思います。レッスンの割り当ては通常、特定の問題を明らかにし、その特定の問題を解決する方法を示すように設計された単純化された問題です。

アプローチのより理想的な方法は、 hackthissite.org のようなことを彼女に行わせることから始めて、いくつの攻撃が機能し、どのような危険があるかを知ることです。コードを破壊する方法を正しく理解することは、安全なコーディング手法の重要性を誰かが理解するのに役立つ優れた方法です。並行してそれを行うことは、セキュリティ上の懸念が何であるかを示しながら、彼女のインストラクターが得ようとしているトピックを難読化しないことを意味します。

5
AJ Henderson

私の見解では、システムアナリストには1つの方法があります。1年生に標準化、分類、パターンマッチングの概念を教える必要があります。以下の質問は簡単で、最初に持ってくることができます...

  • ユーザーが入力できる「すべての可能なデータ入力」について考え、それらの厳密なリストを作成します。
  • 正規表現を学ぶ/教える。このツールは、マッチングとサニタイズのどちらにも使用できます。
  • 入力データが欠落しているか無効な場合の「デフォルト値」の原則。
  • ログファイルを使用します。入力に疑問や不整合がある場合、ソフトウェアはある種のロギングを使用して「書き留める」必要があります。ログファイルは、セキュリティホールをデバッグして見つけるための最良の方法の1つであり、誰かが使用する可能性があるか、すでに使用しています。
  • エラーメッセージとエラーケースを使用します。システムに障害が発生する可能性がある場合を考え、適切なエラー番号と詳細メッセージを考えてください。一部のエラーは、デバッグまたはセキュリティの目的で、2つの異なる詳細エラーメッセージにつながる可能性があります。

ユーザーは常に「悪人」であり、ユーザーは常にソフトウェアを壊したいと思っています。ユーザーが求めているよりも多くの情報を決して与えないでください。そして、彼が求めている場合は、単純な「あなたが持っている」アクセスなし」-エラーメッセージは、ハッカーがシステムの状態を理解するのに役立ちます。

より多くのことを考えることができますが、これは早い段階から学ぶことができます。

1
Deele