Webでセキュリティのトピックを扱う場合、物事を行うための「真の」安全な方法はありません。Webセキュリティは本質的にいたちごっこゲームです。日常のユーザーはネズミで、ハッカーは猫です。Webセキュリティは主に事後対応型です。つまり、新しいセキュリティの実装は、セキュリティ違反が発生した場合にのみ考慮されます。このため、ハッカーは一般的にセキュリティの実装より一歩進んでいます。
そうは言っても、サイトをより安全にするためにできることはたくさんあります。
1)ソルト値を使用します。
私はあなたがすでにこれをしていることを知っています、そしてそれは良い習慣です。ソルトを使用するとアプリケーションが安全になると言うのは誤りですが、そうではありません。ハッキングははるかに難しくなりますが、DBにソルト値を格納していて、DB全体が注入/ダンプされてしまう場合、ハッカーはレインボーテーブルを使用するために必要なすべての情報を持っています。アプリケーション固有のソルトを使用することはセキュリティの追加手段ですが、アプリケーションがハッキングされ、ソースコードが取得/逆コンパイルされた場合、ハッカーは必要なものをすべて持っています。
2)SSL証明書を使用する
アプリケーションが存在するサーバーに出入りするときにデータが暗号化されていることを確認することは、パケットスニッフィングやセッションサイドジャックから保護するための良い方法です。
3)SHA2ハッシュを使用する
SHA2ハッシュ値は広く実装されており、その前身であるSHA1よりも何倍も安全です。
4)DBとアプリケーションを別々のサーバーに配置します。
別のサーバー(または少なくとも別のIPがある場所)にDBがある場合は、DBへのアクセスを特定の呼び出し元IPアドレス/ポートに制限できます。そうすることで、データベースに対して行うことができる唯一の呼び出しがアプリケーションからのものであることを確認できます。
5)クエリを動的に作成する代わりに、ストアドプロシージャを使用します。
アプリケーションにSQLクエリを1行ずつ構造化するコードが含まれている場合、攻撃者はこの情報を使用してDBの構造をマップし、その後効果的に挿入することができます。ストアドプロシージャを使用する場合、このロジックはソースコードの観点から抽象化され、攻撃者はそれらを表示してもDB構造を洞察することはできません。
6)すべての可能な注入ポイントに対してチェックします
自分のアプリケーションをハックしてみてください。あなたはそれを最もよく知っているので、あなたはその最も弱い点を知っているべきです。開発者はそこに最悪のQAerのいくつかを作るかもしれませんが、注入可能な穴を開いたままにしたかどうかを把握することは可能であるはずです。ユーザー入力を使用してクエリをフォーマットしている場所はありますか?もしそうなら、入力をいじって、あなたが何ができるかを見てください。
私の経験から、上記のすべてを実行すると、非常によく保護されます。100%安全なものはありませんが、10億ドルの現金を手放すための秘密のコードを保持していない限り、これらの障害はハッカーの大多数(すべてではないにしても)を阻止します。少数の大企業のサイトで作業してきましたが、これらのサイトの一部が利用しているセキュリティの欠如はばかげています(咳*咳*ソニー咳*咳*)。
また、多くのユーザーが別々のプラットフォームで同じパスワードを使用することを好むことにも注意してください。ユーザーAがすべてに同じパスワードを使用し、自分のサイト(安全なサイト)に登録してから別のサイト(安全ではなく、パスワードをハッシュしないサイト)に登録する場合、攻撃者は攻撃者が最も弱いリンクを見つけるだけです。ユーザーの閲覧習慣とそこからプレーンテキストのパスワードを取得します。
よろしくお願いします、