これは狭すぎるかもしれませんが、ITSecの専門家に固有の問題です。愛する人は新しいプログラミングのキャリアを始めたばかりであり、彼女が最も基本的なプログラミングの概念を一から学ぶのを見る喜びを感じます。彼女は各カレッジコースでクラスのトップにあり、高品質の仕事を生み出しており、非常に注目を集めているため、すでに契約作業を行っています。
ITSecの専門家として、私たちは開発サイクルに安全なコーディングの実践と設計を注入することについて話しますが、それはまったく新しい学習者にどのように適用されますか?新しいプログラマーは、彼ら自身の「生涯の開発サイクル」の始まりにいます。教育の観点から、「機能させる」という考え方から「絶対に安全でなければならない」という考え方に切り替えるのはどの時点で適切ですか。セキュリティの問題のため、生徒はどの時点で課題に「失敗」しますか?
彼女は安全なコードを作成する必要性を完全に理解しており、それを望んでいますが、彼女のクラスはどれもアイデアを導入しておらず、コードのレビューと分析のために私を訪ね続けています。安全な設計を使用するためにすべてのクラス割り当てを再設計するように彼女に強制する切り替えはいつ行うべきですか?
欲求不満な要件を導入することで有望なキャリアを短くしたくはありませんが、その新しいキャリアを可能な限り最高のスタートにしたいと考えています。さらに、初心者のプログラマーの視点から安全なコーディングの基本を教えてくれるリソースはありますか?私は行くにつれてそれを補っていることがわかります...
私はあなたのアドバイスを歓迎します。
余談ですが、基本的な「検証およびサニタイズ」セキュリティの観点から、彼女のクラス割り当てのコードレビューで基準を引き上げることにより、彼女は一般的に非常に高品質のコードを生成することに気づきました。この1つの例から、データフローとプログラミングロジックの理解をさらに深めることができるため、この方法で教育を開始することの価値を理解できると思います。
私が学ぶための素晴らしい方法は、彼女がbreak彼女がすでに書いたアプリケーションであることです。
彼女がWebアプリケーションを作成していると仮定して、OWASPトップ10に向けます。自分のコードでこれらの欠陥のいずれかを見つけることができるかどうか確認してもらいます。実際に自分のコードで発生するのを見るよりも、セキュリティの概念について学ぶ良い方法はありません。
欠陥が見つかったら、アプリケーションを書き直して欠陥を修正してもらいます。そうすることで、ユーザー入力の衛生化や検証、パラメーター化されたクエリなどの効果を評価できます。
増分ステップを実行します。どのタイプのコードがセキュリティ上の欠陥をもたらすかを真に理解する前に、セキュリティを念頭に置いて新しいアプリケーションを設計することにすぐに飛び込むことはしません。
気まずくなるかもしれない立場を取るつもりです...
私が見る問題は、安全なプログラミングがアドオンとして教えられていることです。ベストプラクティスは、最初から(セキュリティを含む)教える必要があります。人々が教えられているうそは、練習が完璧になるということです。真実は、実践が永続化することです。それで、あなたがそれを間違っているなら、あなたはあなたが学んだことを学ばなければなりません。それがバサックワード方式です。
安全なコーディングの実践は、初日から教えられるべきだと思います。方法を学び、安全に行う方法を学ぶ必要はありません。時間とお金の無駄です...
私の2ビット、1、および0と言って...
私は原則としてエバレットに同意しますが、別の見方もあります。レッスンのポイントは、コンセプトを学び、さらにその上に構築できるようにすることです。これにより、学習曲線の傾きが小さくなります。教えるのが速すぎると圧倒的です。情報の猛攻撃に直面すると、ほとんどの頭脳は「リーク」します。
「安全なコーディングの実践は初日から教える必要がある」と言うのは素晴らしいことであり、特に「コンピュータプログラムとは何か」が新しい概念である場合に、初日の「Hello World」プログラムがどのように脆弱であるかを示すことは非常に難しいクラス。共有データストアに触れるWebサイトプロジェクト(大学の少なくとも半分まで実際には見ていませんでした)は弱点を示しやすいですが、多くの場合、これらの弱点は、「デフォルトの設定。脆弱性がわかっている場合、アプリケーションに脆弱性があることを証明するのは非常に簡単です。何も存在しないことを証明することは困難です(実際には不可能です)。
私はOPと同じように思います。プログラマーの開発のある時点で、「誰かがこのコードを使用して望まないことをするにはどうすればよいのか、そしてどのようにそれを防ぐことができるのか」という考えは、現在行っていることにマージできます。その出発点はおそらく、外部通信または永続性(ハードドライブまたはデータベースへのデータの読み取り/書き込み、またはネットワークチャネル経由での送信)、またはオブジェクト指向の原則(継承、オーバーロード/オーバーライド、等)、どちらか早い方。これは、コーダーが悪意のある人にダメージを与える力を持つプログラムを書き始めることができる場所であり、したがって、悪意のある人がプログラムを悪用できないように注意する必要があります。
いくつかの概念は理解しやすいです。 「私のプログラムはユーザーの秘密であるデータを処理します。私はそれを信頼しており、データを見る必要のある人だけが許可されるようにする必要があります。」難しいものもあります。プログラムのバイナリを逆コンパイルして読み取り、ハードコードされた資格情報やキーを見つけることができること、そして.NETのような一部の環境では、ビルドに使用するのとほぼ同じソースコードを生成するのに十分なメタデータをバイナリに入れることに本当にショックを受けている人を見てきました。または、それらのアセンブルされたバイナリを、コンパイルされた形式で、公開された封印されていないクラスまたはメンバーを使用してプラグインし、それらのクラスが扱うすべてのシークレットにアクセスできる攻撃者によって便乗できること。これらは説明する必要がある基本的な問題であり、次にそれらに対する解決策を説明する必要があり、それらがどのようにそしてなぜ機能するかを説明します。
実際の教育の他の側面と同じように(おそらく、これはParenting.SEにもっとあるはずです...)、それは批判的思考に戻ってくると思います。
私の娘も大学のCSコースをいくつか受講しており、私は彼女がそれらを学習するのを手伝っています。しかし、私は彼女に情報をスプーンフィードしないでください、彼女はそれのために働く必要があります。
多くの場合、私は彼女に非常に悪いことを説明し、彼女がそれを私に呼ぶことを期待します。 (彼女は通常そうします)。時々、それはほんのわずかに間違っているだけで、それから彼女が気づくことはより困難です。時々、彼女はそれにすぐに気づかず、間違った仮定に基づいて何かを構築し始めます-その後、彼女は問題を見つけるために後方に努力しなければなりません。 (彼女もその点で良くなっています。)
このように、私は彼女に仮定を疑うことに慣れるように強制します。
彼女は確かに私の方法に興奮していません。
同様に、私は彼女に、彼女のコードが誤ってまたは悪意で悪用される可能性がある方法を見つけるように依頼します。私は彼女に、彼女は自分のコードを所有し、自分のコードが何をするかについて責任があると説明しました、ここには受動性の余地はありません。これの一部は適切な例外処理です。彼女のインストラクターは、ずっと後のコースまで実際にそれをしなくても、とにかくそうすることを期待しています。
もちろん、私は「カーゴカルトプログラミング」を教えることのすべての形式に反対します-そのように明示されていない限り、基本的な概念を可能にするそれはすべての話ではないという警告で教えました、そして、これは後でこれに戻ってきます。 (上記の例外処理など)。
これらすべてからの私の指摘は、"安全なプログラミング"は "プログラミング"と同じですです。
しかし、プログラミングブック全体を一度に一度に教えることができないのと同じように、概念は徐々に導入されます-基本概念が教えられながら、プログラミング概念の「セキュリティ」の側面は待つことができます「ここではまだ完了していません」という明確な注記により、また、少なくともより良い学生が安全でない側面のsomeを理解するであろうという期待。
TL; DR:
最終的には、セキュリティ教育がレッスンの要点を不明瞭にしない点を理解しようとすることが最終的には重要だと思います。レッスンの割り当ては通常、特定の問題を明らかにし、その特定の問題を解決する方法を示すように設計された単純化された問題です。
アプローチのより理想的な方法は、 hackthissite.org のようなことを彼女に行わせることから始めて、いくつの攻撃が機能し、どのような危険があるかを知ることです。コードを破壊する方法を正しく理解することは、安全なコーディング手法の重要性を誰かが理解するのに役立つ優れた方法です。並行してそれを行うことは、セキュリティ上の懸念が何であるかを示しながら、彼女のインストラクターが得ようとしているトピックを難読化しないことを意味します。
私の見解では、システムアナリストには1つの方法があります。1年生に標準化、分類、パターンマッチングの概念を教える必要があります。以下の質問は簡単で、最初に持ってくることができます...
ユーザーは常に「悪人」であり、ユーザーは常にソフトウェアを壊したいと思っています。ユーザーが求めているよりも多くの情報を決して与えないでください。そして、彼が求めている場合は、単純な「あなたが持っている」アクセスなし」-エラーメッセージは、ハッカーがシステムの状態を理解するのに役立ちます。
より多くのことを考えることができますが、これは早い段階から学ぶことができます。