いろいろと原則論はあるんですが。昨今のアプリケーションは複雑化し、扱う情報はよりセンシティブになり、そしてより幅広く使われるようになっています。よって「安全な」アプリケーションを作るために必要な知識はますます増える傾向にあります。
よく分かってない人は以下のことにとりあえず気をつけましょう
これは最も重要なことです。検索する、他人に聞く、自分で考えない。これは重要です。大抵の問題は他人が作ってくれた解決策を適用できます。
例えばセキュアな問合せフォームを作ることにしましょう。気をつけるべきことは以下のことぐらいでしょうか。
めんどうですね。これを自前で実装しようと思ったら時間もかかるし、なんかバグっててダメでしたとなりがちです。
ところが世の中にあるフレームワークを使うと、自然にフォーム置いて DB に値入れるコード書けば上記は達成されます。だいたいエスケープは自動で行なわれますし、プリペアドステートメントは使わさせられますし(あるいはもっと DB が隠蔽されてるか)、 CSRF 対策も放っとくと入れてくれてることが多いです。
なるべく自分でものを作るのはやめましょう。時間の無駄ですし、性能が悪いものができますし、セキュリティ上の問題が発生します。
「現代のフレームワークは複雑だから、初学者はなるべく生の PHP を使ってやってみよう」みたいなことを言う人がいますが、これに騙されてはいけません。
そういうことを言う人は、セキュアなアプリケーション開発の為の知見が積み重なっていき、ツールが進歩してきたこの 20 年の歴史をリアルタイムに追跡してきたからこそ、的確な知識を得ることができたのです。
つまりそういう人が言うことを聞いていては、 20 年間かけないとその人なみのプログラマーになれないということです。これは極めて非効率です。
というわけで CakePHP とか Ruby on Rails とか使いましょう。フレームワークの動作について疑問に思うことがあったら、フレームワークのソース読んだり知ってそうな人に聞いたりしましょう。
我々はなんだかんだいってあと数年は jQuery と付き合う必要がありそうです。もっとかもしれません。このフレームワークは現代的なフレームワークではなく、自動でエスケープしてくれたりとかそんな気取った機能はありません。
ユーザーからの入力値がくる部分は意図的に .text() を使ってエスケープをしなければなりません。
HTML を表示する場合、「表示の直前に無害化する」という原則があります。入力バリデーションで問題を防ごうとしてはいけません。ブラックリストにするにせよホワイトリストにするにせよ絶対に抜けます。
jQuery を使用する場合、この原則に従って以下のようにしなければなりません
$('#hoge').text(ユーザーからの入力値が含まれる何らかの何か)
それから、ユーザー入力値が属性に直接入るようなコードは非常に悪いものです。そうした事例で適切なエスケープな方法を知ってる人は殆どいません。私も知りません。ユーザー入力値を入れていいのはタグの内側だけです。ユーザー入力値をもとに属性値を変えたい場合、以下のようにしたらいいと思います。
var list, attr;
list = ['a', 'b', 'c']
// ここにユーザー入力値をもとに list から何か選んできて attr に代入するコード
$('#hoge').attr({huga: attr})
頑張りましょう。
フレームワークが提供する Ajax 支援機構を使って、なるべく JavaScript を自分で書かないというのはよい考え方です。但しこの場合も、 JavaScript を文字列組み立てなどで動的に生成することのないようにしましょう。これは恐しいバグの温床です。
MV** 系のデータバインディングがあるフレームワークは、大抵自動的にエスケープをしてくれます。よって変なことをしないかぎり、セキュアなコードを書くことができます。ただこれらのフレームワークはまだ過渡期感が高く厳しいものがあります。
余計な情報をシステムに持つのはやめときましょう。他人の個人情報とか預からないほうがいいです。決済を自分で作るのは絶対にやめときましょう。今なら他人の作った決済サービスを安く使えます。
もしこれらのサービスにセキュリティ上の問題があったとして、その責任は作った人達に押し付けることができますし、自分で作る場合よりもセキュリティ上の問題が発生する確率は遥かに低いでしょう。
これは前述した「自分でやらない」という話にも通じることです。
長くでだるいですが、やっぱりこういうものは読みましょう。読まないなら読まないでもいいんですけど、その場合はとにかく「自分で考えない」ということを徹底すべきです。自分で考えて何かを作るためには、基礎的な知識が必要です。