ホームページ  >  記事  >  バックエンド開発  >  PHP データベースのセキュリティ - 設計、接続、暗号化

PHP データベースのセキュリティ - 設計、接続、暗号化

伊谢尔伦
伊谢尔伦オリジナル
2016-11-22 10:43:521927ブラウズ

データベースを設計する

サードパーティのデータベース サービスを使用している場合を除き、通常、最初のステップはデータベースを作成することです。データベースが作成されると、新しいステートメントを実行して作成する所有者が割り当てられます。通常、データベース内のオブジェクトに対して任意の操作を実行する権限を持っているのは所有者 (またはスーパーユーザー) だけです。他のユーザーに使用させたい場合は、許可を与える必要があります。

アプリケーションは、データベース所有者またはスーパーユーザー アカウントを使用してデータベースに接続しないでください。これらのアカウントは、データベース構造の変更 (テーブルの削除など) やデータベースの内容全体のクリアなどの任意の操作を実行できるためです。

プログラムの各側面に対して個別のデータベース アカウントを作成し、データベース オブジェクトに対して非常に限定された権限を与える必要があります。同じユーザーが別のユーザーのタスクを完了できないように、その機能を完了するために必要な権限のみを割り当てます。このように、攻撃者がプログラムの脆弱性を悪用してデータベースにアクセスしたとしても、影響を受ける範囲はプログラムと同じ範囲に限られます。

Web アプリケーション (つまり、ユーザー スクリプト) にすべてのトランザクション ロジックを実装しないようにユーザーに奨励します。これは、ビュー、トリガー、またはルールを使用してデータベース レベルで行うのが最適です。システムをアップグレードする場合は、データベースに対して新しいインターフェイスを開き、すべてのデータベース クライアントをやり直す必要があります。これに加えて、トリガーはフィールドを透過的かつ自動的に処理し、プログラムのデバッグや事実の追跡に役立つ情報を提供できます。

データベースに接続する

SSL 暗号化テクノロジに基づいて接続を確立すると、クライアントとサーバー間の通信のセキュリティが強化されます。また、SSH を使用してクライアントとデータベース間の接続を暗号化することもできます。これらの手法を使用すると、攻撃者がサーバーの通信を監視したり、データベース情報を取得したりすることが困難になります。

暗号化ストレージ モデル

SSL/SSH はクライアントとサーバー間で交換されるデータを保護できますが、SSL/SSH はデータベース内に既に存在するデータを保護できません。 SSL は、単にネットワーク データ ストリームを暗号化するためのプロトコルです。

攻撃者が (Web サーバーをバイパスして) データベースに直接アクセスした場合、データベース自体がこの情報を保護しない限り、機密データが漏洩または悪用される可能性があります。データベース内のデータを暗号化することは、このようなリスクを軽減する効果的な方法ですが、これらの暗号化機能を提供するデータベースはほとんどありません。

この問題には簡単な解決策があります。それは、独自の暗号化メカニズムを作成し、それを PHP プログラム内で使用することです。 PHP には、これを実行できる Mcrypt や Mhash などの拡張ライブラリがいくつかあり、これらにはさまざまな暗号化アルゴリズムが含まれています。スクリプトはデータをデータベースに挿入する前に暗号化し、後で抽出するときに復号化します。

一部の本当に隠されたデータについては、プレーン テキストの形式で存在する必要がない場合 (つまり、表示する必要がない場合)、ハッシュ アルゴリズムの使用を検討できます。ハッシュ アルゴリズムを使用する最も一般的な例は、パスワードの MD5 暗号化ハッシュをデータベースに保存して、元の平文パスワードを置き換えることです。

例 #1 パスワードフィールドのハッシュ暗号化

<?php
    // 存储密码散列
    $query = sprintf("INSERT INTO users(name,pwd) VALUES(&#39;%s&#39;,&#39;%s&#39;);",
    pg_escape_string($username), md5($password));
    $result = pg_query($connection, $query);
    // 发送请求来验证用户密码
    $query = sprintf("SELECT 1 FROM users WHERE name=&#39;%s&#39; AND pwd=&#39;%s&#39;;",
    pg_escape_string($username), md5($password));
    $result = pg_query($connection, $query);
    if (pg_num_rows($result) > 0) {
        echo &#39;Welcome, $username!&#39;;
    } else {
        echo &#39;Authentication failed for $username.&#39;;
    }
?>


声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。