ホームページ  >  記事  >  バックエンド開発  >  PHP セキュア プログラミング - Web サイトのセキュリティ設計のいくつかの原則

PHP セキュア プログラミング - Web サイトのセキュリティ設計のいくつかの原則

不言
不言オリジナル
2018-04-09 10:31:391620ブラウズ

この記事の主な内容は、PHP セキュリティ プログラミングにおける Web サイトのセキュリティ設計のいくつかの原則についてです。興味のある方は、


Deep Defense


の原則をご覧ください。ディープディフェンス これはセキュリティ専門家の間ではよく知られた原則であり、歴史によって証明されている冗長セキュリティ対策の価値を示しています。

多層防御の原則は、プログラミングに限定されず、他の分野にも拡張できます。バックアップ パラシュートを使用したことのあるスカイダイバーは、メイン パラシュートが故障することを決して望んでいませんが、冗長な安全対策を持つことの価値を証明できます。冗長なセキュリティ対策は、主要なセキュリティ対策が失敗する可能性において重要な役割を果たす可能性があります。

プログラミングの分野に戻ると、多層防御の原則を遵守するには、常にバックアップ計画を立てる必要があります。 1 つのセキュリティ対策が失敗した場合は、別のセキュリティ対策が何らかの保護を提供する必要があります。たとえば、ユーザー認証ロジックに既知の欠陥がない場合でも、重要な操作を実行する前にユーザーを再認証することをお勧めします。認証されていないユーザーが何らかの方法で別のユーザーになりすました場合、パスワードの入力を求めるプロンプトが表示されると、認証されていない (検証されていない) ユーザーが一部の重要な操作を実行できなくなる可能性があります。

多層防御は合理的な原則ですが、セキュリティ対策を過度に強化するとコストが増加し、価値が低下するだけです。

最低特権

私は以前、メイドキーが付いた車に乗っていました。このキーはイグニッションにのみ使用できるため、ドア、コンソール、トランクを開けることはできません。車の始動にのみ使用できます。駐車場の係員に渡す(またはイグニッションに置いたままにする)ことができ、キーが他の目的に使用できないことを確認します。

駐車場の係員に、コンソールやトランクを開けられない鍵を渡すのは理にかなっています。結局のところ、貴重品はそれらの場所に保管しておきたいと思うかもしれません。しかし、私にとって理解できないのは、なぜドアを開けることができないのかということです。もちろん、私の言いたいことは権限の剥奪にあるからです。なぜ駐車監視員がドアを開ける権限を剥奪されたのか不思議でした。プログラミングにおいて、これは非常に悪い考えです。代わりに、どのような権限が必要かを検討し、各ユーザーが仕事を行うのに必要な最小限の権限を与える必要があります。

メイドキーで車のドアを開けることができない理由の1つは、キーがコピー可能であり、コピーされたキーが将来車を盗むために使用される可能性があることです。このシナリオはありそうもないように聞こえるかもしれませんが、これは、たとえアクセス許可がわずかに増加したとしても、不必要な承認によってリスクがどのように増大するかを示す一例です。リスクの最小化は、安全プログラム開発の主要な要素です。

権限が悪用される可能性があるすべての方法について考える必要はありません。実際、潜在的な攻撃者の行動をすべて予測することはほぼ不可能です。

シンプルさは美しい

複雑さはエラーを生み出し、エラーはセキュリティの脆弱性につながる可能性があります。この単純な事実は、安全なアプリケーションにとってシンプルさがなぜ非常に重要であるかを示しています。不必要な複雑さは、不必要なリスクと同じくらい悪いものです。

たとえば、次のコードは、最近のセキュリティ脆弱性勧告からの抜粋です:

<?php
	 
	$search = (isset($_GET[&#39;search&#39;]) ? $_GET[&#39;search&#39;] : &#39;&#39;);
 
?>

このプロセスは、特に経験の浅い開発者にとって、$search 変数が汚染されている*という事実を混乱させる可能性があります (注: 汚染された変数、つまり、Duringプログラムの実行では、この変数の値は代入ステートメントによって直接指定されるのではなく、コンソール エントリやデータベースなどの他のソースから取得されます。上記のステートメントは、次のプログラムと同等です:

<?php
 
  $search = &#39;&#39;;
 
  if (isset($_GET[&#39;search&#39;]))
  {
		$search = $_GET[&#39;search&#39;];
  }
 
?>

上記の 2 つの処理フローはまったく同じです。ここで、次のステートメントに注目してください:

$search = $_GET[&#39;search&#39;];

このステートメントを使用すると、$search 変数の状態がプロセスに影響を与えることなくそのまま維持され、汚染されているかどうかも確認できます。

露出の最小化

PHP アプリケーションでは、PHP と外部データ ソース間の頻繁な通信が必要です。主な外部データ ソースは、クライアント ブラウザとデータベースです。データを正しく追跡すると、どのデータが公開されたかを特定できます。インターネットは非常に公共のネットワークであるため、主な漏洩源となります。インターネット上でデータが漏洩しないように常に注意する必要があります。

データの漏洩は、必ずしもセキュリティ上のリスクを意味するわけではありません。ただし、データの露出は可能な限り最小限に抑える必要があります。たとえば、ユーザーが支払いシステムにアクセスし、クレジット カード データをサーバーに送信する場合、SSL を使用してデータを保護する必要があります。確認ページにクレジット カード番号を表示したい場合、カード番号情報はサーバーからクライアントに送信されるため、SSL を使用して保護する必要もあります。

たとえば、前の例では、クレジット カード番号を示すと明らかに暴露される可能性が高くなります。 SSL はリスクを軽減しますが、最善の解決策は、最後の 4 桁のみを表示してリスクを完全に排除することです。

機密データへの露出を減らすには、どのデータが機密であるかを特定し、同時に追跡し、不必要なデータ露出をすべて排除する必要があります。この本では、多くの一般的な種類の機密データを保護するのに役立ついくつかのテクニックを紹介します。

関連する推奨事項:

一般的な PHP セキュリティ攻撃と解決策

PHPセキュリティ例の詳細説明

PHPセキュリティ開発ライブラリの詳細説明

以上がPHP セキュア プログラミング - Web サイトのセキュリティ設計のいくつかの原則の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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