何年もの間、セキュリティの専門家は、ウェブアプリケーションの脆弱性について人々に警告してきました。ハッカーがウェブ・アプリケーションへの侵入に成功したという報告を目にすることは珍しくありません。また、ハッカーやサイバー犯罪者は、新たに発見された脆弱性を共有し、その成功事例や次のターゲットに関する研究 を共有しています。企業ネットワークが絶対に侵入不可能であることを保証することは不可能であり、ハッカーはそれを証明しています。
本稿では、セキュリティを念頭に置いてコンピュータをプログラミングする際に、リスクの低いウェブベースのアプリケーションを構築する方法について説明します。
1.クエリのパラメータ化
例えば、java標準では、パラメータ化されたクエリーは、以下のメソッドの助けを借りて実装することができます:
文字列 custname = request.getParameter("customerName");
String query = "SELECT account_balance FROM user_data WHERE user_name = ? ";
PreparedStatement pstmt = connection.prepareStatement( query );
pstmt.setString( 1, custname);
ResultSet results = pstmt.executeQuery( );
2.安全なパスワード保管
パスフレーズを保存する最も悪い方法は、もちろんプレーンテキストを使うことです。その理由は、暗号化が可逆的であること、そしてもう一つの理由は、MD5やその他のハッシュアルゴリズムに問題があることです。今日のハッカーは、強力だがそれほど高価ではないコンピューティング・リソースを利用できるため、平均的な強度のパスワードをリアルタイムで解読できる「レインボー・テーブル」を作成したり、購入したりすることも可能です。現在では、ハッカーはレインボーテーブルさえも使わなくなり、その代わりに高性能な家庭用コンピュータを使って高速な辞書攻撃を行っています。パスワードの塩付けは、レインボーテーブル攻撃に対抗し、パスワードハッシュの重複を除去するのに役立つコーディング技術ですが、それだけでは十分ではありません。
攻撃者は、限られたリソースを使用して、保存されたパスワードをターゲットとするGPUクラッカーを生成することができ、毎秒250億回のパスワード試行を実行することができます。
パスフレーズを保存し、GPUクラッキングプログラムや同様のリソースからパスフレーズが公開されるのを防ぐために、3つの主なテクニックを組み合わせることが推奨されます:一方向アルゴリズムの使用、ソルティング、および意図的に遅いアルゴリズムの使用。つの優れたアルゴリズム、SCRYPT と PBKDF2 は、この形式でパスフレーズを安全に保存するために使用できます。
3.出力エンコーディングのXSS防御
クロスサイトスクリプティング攻撃は、JavaScriptハイジャッキングという、より適切な名称を持ち、セッションハイジャック、サイト妨害、ネットワークスキャン、CSRF防御の破り、サイトリダイレクトやフィッシング、スクリプトをロードするためのリモートホスティング、データ窃盗、キー入力ロギングなどに使用されます。
出力エンコーディングは、出力時に実行される XSS をブロックするために使用される重要なプログラミング技術です。このエンコーディングは、ユーザーインターフェースを構築する際に、信頼できないデータが動的に HTML に追加される最後の瞬間に実行されます。
つまり、特別な事情がない限り、信頼できないデータをHTML文書に置かないということです。最も重要なことは、信頼できないソースからのJavaScriptコードを決して受け入れないことです。
4.コンテンツセキュリティポリシー
コンテンツ・セキュリティ・ポリシーは、新しいブラウザ標準です。基本的な考え方は、ブラウザベースの保護を可能にする標準化されたフレームワークを作成することで、開発者側の作業を少なくしてXSS攻撃をブロックできるようにすることです。
コンテンツセキュリティポリシーを有効にするためには、HTMLに埋め込まれたすべてのJavaScriptをクリアし、別の外部JavaScriptファイルに展開する必要があります。この時点から、コンテンツセキュリティポリシーを理解するブラウザが HTML ドキュメントに埋め込まれた JavaScript を検出した場合(例えば、ハッカーがそのようなスクリプトを挿入しようとした場合)、そのアクションは拒否されます。この実践は、多くの形式の XSS 攻撃に対してブラウザを本当にロックダウンすることができます。
5.クロスサイトスクリプティングリクエストフォージェリの防止
ユーザーが安全なサイトにログインした後、別のタブを開いてうっかり悪意のあるサイトにログインしてしまうと、問題のサイトにはクロスサイト・リクエストが含まれており、ユーザーがログインしたという事実を最大限に利用する可能性があります。悪意のあるサイトは、ユーザーを騙してバンキングサイトから送金させるなど、重大な損害を与える偽のリクエストを送信する可能性があります。
この種の攻撃を防ぐために、開発者は暗号トークンを導入し、トランザクションを完了するためにユーザに再認証を要求し、セッションハイジャックを防ぐことを検討する必要があります。
6.多要素認証
多くの人が、パスワードは認証の単一要素としては死語だと考えています。より良い認証方式は、二要素認証または多要素認証です。本人確認のために常に別のデバイスの携帯を要求するのは非現実的であるため、過去には両方のタイプの認証が大きな人気を博しました。MFA の SMS やネイティブ・アプリケーションは完璧ではありませんが、リスクを軽減することはできます。現在、多くの消費者向けウェブサイトやその他のウェブサービスが、Google などの多要素認証を提供しています。
7.パスワード忘れの安全設計
多くのウェブサイトでは、単純な認証で、ユーザが元のパスフレーズを要求したり、新しいパスフレーズを登録した電子メールアドレスに送信したりすることができます。実際には、より堅牢なプロセスは、セキュリティ質問で身元を確認し、帯域外の方法でランダムに生成されたパスワードをユーザに送信し、同じウェブセッション中にコードを検証し、ロックダウンポリシーを強化し、ユーザがパスフレーズを変更することです。
上記のステップは、既存の脆弱性をすべて根絶したり、攻撃のすべての要素を阻止したりするものではありませんが、ウェブサイトやアプリケーションの強化に役立ちます。
アプリケーションのプログラマーは、安全な方法でコードを書くことを学ぶべきです。これは、企業がウェブサイトのセキュリティのために適切な防御策を導入する唯一の重要な機会です。




