PHP セキュリティ トーク: PHP セキュリティ設定
サーバーは、プログラムの脆弱性、ユーザー入力フォームの問題、PHP ファイルのアクセス許可の問題など、すべてのセキュリティ問題を防ぐことはできません。何らかの手段を使って、ハッカーや不純な動機を持つ人々を混乱させることもできます。
多くの PHP プログラムの主な弱点は、PHP 言語自体の問題ではなく、プログラマーのセキュリティ意識の低さが原因です。したがって、誤ったデータ送信による影響を発見するには、コードの各部分で起こり得る問題に常に注意を払う必要があります。
unlink ($evil_var); fwrite ($fp, $evil_var); system ($evil_var); exec ($evil_var);
常にコードに注意して、クライアントから送信されたすべての変数が適切にチェックされていることを確認してから、いくつかの質問を自問してください。
コードを記述するときに次の質問を自問してください。そうしないと、将来セキュリティを強化するためにコードを書き直す必要が生じる可能性があります。これらの問題に注意すれば、システムのセキュリティを完全に保証することはできませんが、少なくともセキュリティを向上させることはできます。
register_globals、magic_quotes、またはプログラミングをより便利にするその他の設定をオフにすることも検討してください。ただし、変数の正当性、ソース、値が台無しになります。
PHP コードのセキュリティを確保するために、ユーザーが入力したデータを検証します。
注 1: JS は、検証ツールとしてではなく、訪問ユーザーのエクスペリエンスを向上させるためにのみ作成されています。なぜなら、訪問ユーザーが誤ってクライアント スクリプトの実行を無効にして、この検証層をスキップする可能性があるからです。したがって、このデータを PHP サーバー側プログラムで検証する必要があります。
注 2: データの送信元アドレスを確認するためにスーパー変数 $_SERVER['HTTP_REFERER'] を使用しないでください。可能であれば、初心者のハッカーはツールを使用してこの変数のデータを偽造します。トークンを生成する関数は、ソースを検証するときに、トークンが一致するかどうかを検証します。
PHP はユーザー レベルでファイル システムにアクセスするように設計されているため、/etc/passwd などのシステム ファイルを読み取り、ネットワーク接続を変更し、大量の印刷ジョブを送信するための PHP コードを作成することは完全に可能です、など。したがって、PHP コードが適切なファイルを読み書きしていることを確認する必要があります。 以下のコードを見てください。ユーザーはホーム ディレクトリ内のファイルを削除したいと考えています。このシナリオでは、ファイル システムが Web インターフェイスを通じて管理されているため、Apache ユーザーがユーザー ディレクトリ内のファイルを削除する権限を持っていると仮定します。
$username = $_POST['user_submitted_name']; $homedir = "/home/$username"; $file_to_delete = "$userfile"; unlink ("$homedir/$userfile"); echo "$file_to_delete has been deleted!";
ユーザー名変数はユーザー フォームから送信できるため、他の人のユーザー名とファイル名を送信してファイルを削除することができます。この場合、他の認証方法を考慮する必要があります:
以下は、ファイル名と変数のより安全な検証とチェックです:
$username = $_SERVER['REMOTE_USER']; $homedir = "/home/$username"; if (!ereg('^[^./][^/]*$', $userfile)) die('bad filename'); if (!ereg('^[^./][^/]*$', $username)) die('bad username');
一般に、隠れた手段によるセキュリティの向上はほとんど役に立たないと考えられています。ただし、場合によっては、可能な限りのセキュリティを追加する価値があります。
いくつかの簡単な方法は PHP を隠すのに役立ち、そうすることで攻撃者がシステムの弱点を発見するのをより困難にします。 php.ini ファイルで Expose_php = off を設定すると、取得できる有用な情報が減少します。
もう 1 つの戦略は、PHP を使用して Web サーバーにさまざまな拡張機能を解析させることです。 .htaccess ファイルまたは Apache 設定ファイルのどちらを使用しても、攻撃者に誤解を与える可能性のあるファイル拡張子を設定する可能性があります:
# 使PHP看上去像其它的编程语言 AddType application/x-httpd-php .asp .py .pl # 使 PHP 看上去像未知的文件类型 AddType application/x-httpd-php .bop .foo .133t # 使 PHP 代码看上去像 HTML 页面 AddType application/x-httpd-php .htm .html
この方法を有効にするには、PHP ファイルの拡張子を上記の拡張子に変更する必要があります。これにより、隠蔽によりセキュリティが向上しますが、防御能力が低く、いくつかの欠点があります。