ホームページ > バックエンド開発 > PHPチュートリアル > PHPセキュリティトーク_PHPチュートリアル

PHPセキュリティトーク_PHPチュートリアル

WBOY
リリース: 2016-07-21 15:18:27
オリジナル
874 人が閲覧しました

1. Apache サーバーのセキュリティ設定

1. Nobody ユーザーとして実行します

通常、Apache は Root によってインストールされ、実行されます。 Apache サーバー プロセスに Root ユーザー権限がある場合、システム セキュリティに大きな脅威となるため、Apache サーバー プロセスが可能な限り低い権限を持つユーザーとして実行されるようにする必要があります。 httpd.conf ファイル内の次のオプションを変更すると、Apache を Nobody ユーザーとして実行して、相対的なセキュリティを実現できます。
UserEveryone
Group# -1

2. ServerRoot ディレクトリの権限

すべての設定が適切で安全であることを保証するために、スーパーユーザー以外がアクセスできないように、Apache ホーム ディレクトリのアクセス権限を厳密に制御する必要があります。ディレクトリの内容を変更します。 Apache のホーム ディレクトリは、Apache サーバー設定ファイル httpd.conf のサーバー ルート制御項目に対応します。これは、設定ファイル access.conf 内の
Server Root /usr/local/apache

3. SSI 設定

である必要があります。または httpd conf の Options ディレクティブに include NO EXEC オプションを追加して、Apache Server の実行機能を無効にします。ユーザーが Apache サーバー内の実行プログラムを直接実行できないようにします。これにより、サーバー システムが漏洩する可能性があります。

オプションには Noexec が含まれます


4. ユーザーがシステム設定を変更できないようにする

ユーザーが .htaccess ファイルを作成および変更できないようにし、定義されたシステム セキュリティ機能を超えないようにするために、Apache サーバー構成ファイルで次の設定を行います。

AllowOveride なし
オプション なし
すべてから許可

次に、特定のディレクトリを適切に設定します。

5. Apache サーバーのデフォルトのアクセス特性を変更する

Apache のデフォルト設定では、サーバーが通常のマッピング ルールを通じてファイルを見つけることができる場合のみ、クライアントはファイルを取得します。 http:// /local host/~ root/ により、ユーザーはファイル システム全体にアクセスできるようになります。次のコンテンツをサーバー ファイルに追加します:

orderdeny,ellow
Deny from all

はファイル システムへのデフォルトのアクセスを無効にします。

6. CGI スクリプトのセキュリティに関する考慮事項

CGI スクリプトは、Web サーバーを通じて実行できる一連のプログラムです。システムのセキュリティを確保するには、CGI の作成者が信頼できるものであることを確認する必要があります。 CGI の場合は、管理を容易にするために、ファイルを cgi-bin などの特定のディレクトリに制限するのが最善です。また、不正なプログラムが常駐したり混在したりするのを避けるために、CGI ディレクトリ内のファイルが書き込み不可であることを確認する必要があります。その中で、セキュリティに優れた CGI プログラムのモジュールをリファレンスとして提供できれば、CGI ディレクトリ内の業務以外のアプリケーション スクリプトをすべて削除し、異常な情報漏洩を防ぐことができます。

7. SSL リンク暗号化

上記の一般的な対策により、Apache サーバーに基本的な安全な動作環境を提供できますが、実際のアプリケーションと一致するセキュリティ構成計画を策定するには、特定の実装でさらに詳細な分析が必要であることは明らかです。

2. PHP セキュリティ設定

サーバーは、プログラムの脆弱性、ユーザー入力フォームの問題、PHP ファイルのアクセス許可の問題など、すべてのセキュリティ問題を防ぐことはできません。
何らかの手段を使って、ハッカーや不純な動機を持つ人々を混乱させることもできます。
1. プログラムコードの脆弱性の問題

多くの PHP プログラムの主な弱点は、PHP 言語自体の問題ではなく、プログラマーのセキュリティ意識の低さが原因です。したがって、誤ったデータ送信による影響を発見するには、コードの各部分で起こり得る問題に常に注意を払う必要があります。

コードをコピーします コードは次のとおりです:
fwrite ($fp, $evil_var);
exec ($evil_var); );
?>
常にコードに注意して、クライアントから送信されたすべての変数が適切にチェックされていることを確認してから、いくつかの質問を自問してください:

このスクリプトは、期待されているファイルにのみ影響を及ぼしますか?
異常なデータは提出後に何らかの影響を与える可能性がありますか?
このスクリプトは意図しない目的に使用できますか?
このスクリプトを他のスクリプトと組み合わせて悪いことをすることはできますか?
すべての取引は適切に記録されていますか?
コードを記述するときに次の質問を自問してください。そうしないと、後でセキュリティを強化するためにコードを書き直す必要が生じる可能性があります。これらの問題に注意すれば、システムのセキュリティを完全に保証することはできませんが、少なくともセキュリティを向上させることはできます。

register_globals、magic_quotes、またはプログラミングをより便利にするその他の設定をオフにすることも検討してください。ただし、変数の正当性、ソース、値が台無しになります。

2. ユーザー入力フォームの問題

PHP コードのセキュリティを確保するために、ユーザーが入力したデータを検証します。
注 1: JS は、訪問ユーザーのエクスペリエンスを向上させるためにのみ作成されており、検証ツールではありません。なぜなら、訪問ユーザーが誤ってクライアント スクリプトの実行を無効にして、この検証層をスキップする可能性があるからです。したがって、このデータを PHP サーバー側プログラムで検証する必要があります。
注 2: データの送信元アドレスを確認するためにスーパー変数 $_SERVER['HTTP_REFERER'] を使用しないでください。小規模な初心者ハッカーはツールを使用してこの変数のデータを偽造し、Md5 または rand を使用しようとします。トークンを生成する他の関数は、ソースを検証するときに、トークンが一致するかどうかを検証します。

3. PHP ファイルのアクセス許可の問題

PHP はユーザー レベルでファイル システムにアクセスするように設計されているため、/etc/passwd などのシステム ファイルを読み取り、ネットワーク接続を変更し、大量の印刷タスクを送信することが完全に可能です。 PHP コードなどを書くことによって。したがって、PHP コードが適切なファイルを読み書きしていることを確認する必要があります。 以下のコードを見てください。ユーザーはホーム ディレクトリ内のファイルを削除したいと考えています。このシナリオでは、ファイル システムが Web インターフェイスを通じて管理されているため、Apache ユーザーがユーザー ディレクトリ内のファイルを削除する権限を持っていると仮定します。
コードをコピーします コードは次のとおりです:
$username = $_POST['user_submitted_name'];
$homedir = "/home/$username"; "$userfile" ;
unlink ("$homedir/$userfile");
echo "$file_to_delete が削除されました!";


ユーザー名変数はユーザー フォームから送信できます。他の人のユーザー名とファイル名を入力してファイルを削除します。この場合、他の認証方法を考慮する必要があります:
PHP Web ユーザーには非常に限定された権限のみを与えます。
送信されたすべての変数を確認します。
以下は、ファイル名と変数のより安全な検証とチェックです:



コードをコピーします
コードは次のとおりです: $username = $_SERVER['REMOTE_USER'];
$homedir = "/home/$username";

if (!ereg('^[^./][^/]*$', $userfile))
die('不正なファイル名'); (!ereg('^ [^./][^/]*$', $username))
die('bad username')?>

4. PHP 拡張機能を隠す

一般的に、隠れた手段によるセキュリティの向上はほとんど効果がないと考えられています。ただし、場合によっては、可能な限りのセキュリティを追加する価値があります。

いくつかの簡単な方法は PHP を隠すのに役立ち、攻撃者がシステムの弱点を発見するのをより困難にすることができます。 php.ini ファイルで Expose_php = off を設定すると、取得できる有用な情報が減少します。

もう 1 つの戦略は、PHP を使用して Web サーバーにさまざまな拡張機能を解析させることです。 .htaccess ファイルまたは Apache 構成ファイルを使用するかどうかに関係なく、攻撃者に誤解を与える可能性のあるファイル拡張子を設定できます:



# PHP を他のプログラミング言語のように見せます
AddType application/x-httpd-php .pl


# PHP を不明なファイルタイプのように見せます
AddType application/x-httpd-php .bop .foo .133t

# PHP コードを HTML ページのように見せます
AddType application/x-httpd-php .htm .html

この方法を有効にするには、PHP ファイルの拡張子を上記の拡張子に変更する必要があります。これにより、隠蔽によりセキュリティが向上しますが、防御能力が低く、いくつかの欠点があります。

3. Mysqlデータベースのセキュリティ設定

PHP自体はデータベースのセキュリティを保護できません。次の章では、PHP スクリプトを使用してデータベースに対する基本的なアクセスと操作を実行する方法のみについて説明します。シンプルなルールを 1 つ覚えておいてください。それは、徹底的に防御することです。データベースを保護するために講じる対策が多ければ多いほど、攻撃者がデータベース内の情報を取得して使用することが難しくなります。データベースを適切に設計して実装すると、攻撃される心配を軽減できます。

1. データベース設計の問題

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


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

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

3. データベースデータの暗号化

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

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

この問題には簡単な解決策があります。それは、独自の暗号化メカニズムを作成し、それを PHP プログラムで使用することです。最も一般的な例は、パスワードの MD5 暗号化ハッシュをデータベースに保存して、元のパスワードを置き換えることです。クリアテキストのパスワード。

コードをコピーします コードは次のとおりです:

$query = sprintf("INSERT INTO users(name,pwd) VALUES('%s','%s'); ",
addslashes($username), md5($password));
$result = pg_query($connection, $query);
$query = sprintf("SELECT 1 FROM users WHERE name='%s' AND pwd= '%s ';",
addslashes($username), md5($password));
$result = pg_query($connection, $query);
if (pg_num_rows($result) > 0) {
echo 'ようこそ、$ username!';
} else {
echo '$username の認証に失敗しました。';
?>


4. SQL インジェクションの問題は、一般的に使用されます。攻撃者による 隠しデータを取得したり、キー値を上書きしたり、データベース ホスト オペレーティング システム コマンドを実行したりする目的を達成するための既存の SQL ステートメント テクノロジが存在します。これは、アプリケーションがユーザー入力を取得し、それを静的パラメーターと組み合わせて SQL クエリにすることによって実現されます。いくつかの実例を以下に示します。




コードをコピー
コードは次のとおりです: $query = "商品からID、名前、挿入されたサイズを選択
WHERE size = '$size'
ORDER BY $order LIMIT $limit , $offset;";
$result = odbc_exec($conn, $query);
?>



元のクエリに別の SELECT クエリを追加してパスワードを取得できます:
union select '1', concat(uname||'-'||passwd) as name, '1971-01-01', ' 0' from usertable;
上記のステートメント (' と -- を使用) を $query の変数に追加すると、問題が発生します。

これらの攻撃は常に、セキュリティ意識が弱いコードの悪用に基づいています。したがって、外部から入力されたデータ、特にクライアントから入力されたデータ (選択ボックス、フォームの隠しフィールド、Cookie など) を決して信頼しないでください。上記の最初の例と同様、通常のクエリでも災害が発生する可能性があります。

データベースへの接続にはスーパーユーザーまたは所有者のアカウントを決して使用しないでください。権限が厳しく制限されたアカウントを使用してください。
入力データが予期したデータ形式であるかどうかを確認します。 PHP には、単純な変数関数や文字型関数 (is_numeric()、ctype_digit() など) から、この仕事を実行できる複雑な Perl 互換の正規表現関数まで、入力のチェックに使用できる関数が多数あります。

プログラムが数値の入力を待っている場合は、is_numeric() を使用して数値をチェックするか、settype() を直接使用して型を変換するか、sprintf() を使用して数値としてフォーマットすることを検討してください。

SQL インジェクションを防ぐためのより安全なページング表示方法:

コードをコピー コードは次のとおりです:

settype($offset, 'integer');
$query = "商品から ID、名前を選択 名前で注文 LIMIT 20 オフセット $offset;";
$query = sprintf("商品から ID、名前を選択 名前で注文 LIMIT 20 オフセット %d;",
$offset);
?>

www.bkjia.comtru​​ehttp://www.bkjia.com/PHPjc/325517.html技術記事 1. Apache サーバーのセキュリティ設定 1. 通常の状況では、Apache は Root によってインストールされ、実行されます。 Apache サーバー プロセスに Root ユーザー権限がある場合、...
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート