ホームページ バックエンド開発 PHPチュートリアル PHP データ フィルタリングのセキュリティについて説明する_PHP チュートリアル

PHP データ フィルタリングのセキュリティについて説明する_PHP チュートリアル

Jul 15, 2016 pm 01:31 PM
php 存在する 安全性 始める 私たち ガイド 話し合う データ 言語 フィルター

ガイドの冒頭の では、データ フィルタリングは、どの言語でも、どのプラットフォームでも WEB アプリケーションのセキュリティの基礎であると述べました。これには、アプリケーションへのデータ入力とアプリケーションからのデータ出力の検証が含まれます。優れたソフトウェア設計は、開発者が次のことを行うのに役立ちます。

PHP データ フィルタリングがバイパスできないことを確認し、違法な情報が正当な情報に影響を与えないことを確認し、識別するデータのソース。

データ フィルタリングをバイパスできないようにする方法についてはさまざまな見解があり、そのうちの 2 つは他のものよりも一般的であり、より高いレベルの保証を提供します。

PHP データフィルタリングスケジュールメソッド

このメソッドは、単一の PHP スクリプト (URL 経由) でスケジュールされます。他の操作は、必要に応じて include または require を使用して含められます。このアプローチでは通常、各 URL にディスパッチ用の個別の GET 変数を渡す必要があります。この GET 変数は、スクリプト名を置き換えるより単純化された設計と考えることができます。例:

http://example.org/dispatch.php?task=print_formdispatch.php は唯一のルート ファイル (ドキュメント ルート) です。これにより、開発者は 2 つの非常に重要な作業を行うことができます:

dispatch.php の先頭にいくつかのグローバル セキュリティ処理を実装し、これらの処理がバイパスできないようにします。特に一部の特殊な目的の制御フロー操作では、データ フィルタリングが必要な場所を判断するのは簡単です。 dispatch.php スクリプトについてさらに詳しく説明するには、以下の例を参照してください:

<ol class="dp-xml"><li class="alt"><span><span class="tag"><</span><span> ?php  </span></span></li><li><span>/* 全局安全处理 */  </span></li><li class="alt"><span>switch ($_GET['task']){case <br />'print_form':include '/inc/<br />presentation/form.inc';  </span></li><li><span>break;  </span></li><li class="alt"><span>case 'process_form':$</span><span class="attribute">form_valid</span><span> = </span><span class="attribute-value">false</span><span>;  </span></li><li><span>include '/inc/logic/process.inc';  </span></li><li class="alt"><span>if ($form_valid){include '/inc/<br />presentation/end.inc';}else{include <br />'/inc/presentation/form.inc';}<br />break;default:include '/inc/presentation<br />/index.inc';  </span></li><li><span>break;  </span></li><li class="alt"><span>}  </span></li><li><span class="tag">?></span><span> </span></span></li></ol>
ログイン後にコピー

これがパブリックにアクセスできる唯一の PHP スクリプトである場合、プログラムは、そもそもグローバル セキュリティ ハンドラーをバイパスできないように設計されていると確信できます。 。 合格。また、開発者は特定のタスクの制御フローを簡単に確認できます。たとえば、コード全体を閲覧しなくても簡単にわかります。$form_valid が true の場合、end.inc は process.inc がインクルードされる前であり、false に初期化されたばかりであるため、ユーザーに表示される唯一のものです。 process.inc の内部ロジックによって true に設定されると判断できます。それ以外の場合は、フォームが再度表示されます (関連するエラー メッセージが表示される可能性があります)。

PHP データをフィルタリングする際の注意事項

(dispatch.php の代わりに)index.php などのディレクトリ指定ファイルを使用する場合は、次のように URL アドレスを使用できます: http://example.org /?タスク= print_form。

ApacheForceType リダイレクトまたは mod_rewrite を使用して、URL アドレス http://example.org/app/print-form を調整することもできます。

PHPデータフィルタリングの組み込み方法

もう1つの方法は、すべてのセキュリティ処理を担当する単一のモジュールを使用することです。このモジュールは、すべてのパブリック PHP スクリプトの先頭 (または最先頭) に含まれています。次のスクリプト security.inc

<ol class="dp-xml"><li class="alt"><span><span class="tag"><</span><span> ?php  </span></span></li><li><span>switch ($_POST['form'])  </span></li><li class="alt"><span>{case 'login':  </span></li><li><span>$</span><span class="attribute">allowed</span><span> = </span><span class="attribute-value">array</span><span>();  </span></li><li class="alt"><span>$allowed[] = 'form';  </span></li><li><span>$allowed[] = 'username';  </span></li><li class="alt"><span>$allowed[] = 'password';  </span></li><li><span>$</span><span class="attribute">sent</span><span> = </span><span class="attribute-value">array_keys</span><span>($_POST);  </span></li><li class="alt"><span>if ($</span><span class="attribute">allowed</span><span> == $sent)  </span></li><li><span>{include '/inc/logic/<br />process.inc';}  </span></li><li class="alt"><span>break;  </span></li><li><span>}  </span></li><li class="alt"><span class="tag">?></span><span> </span></span></li></ol>
ログイン後にコピー

を参照してください。 この PHP データ フィルタリングの例では、送信された各フォームにフォームの一意の検証値が含まれているとみなされ、security.inc はフィルタリングが必要なフォーム内のデータを個別に処理します。この要件を実装する HTML フォームは次のようになります。

<ol class="dp-xml">
<li class="alt"><span><span class="tag"><</span><span> </span><span class="tag-name">form.</span><span> </span><span class="attribute">action</span><span>=</span><span class="attribute-value">"/receive.php"</span><span> <br /></span><span class="attribute">method</span><span>=</span><span class="attribute-value">"POST"</span><span class="tag">></span><span> </span></span></li>
<li>
<span class="tag"><</span><span class="tag-name">input</span><span> </span><span class="attribute">type</span><span>=</span><span class="attribute-value">"hidden"</span><span> <br /></span><span class="attribute">name</span><span>=</span><span class="attribute-value">"form"</span><span> </span><span class="attribute">value</span><span>=</span><span class="attribute-value">"login"</span><span> </span><span class="tag">/></span><span> </span>
</li>
<li class="alt">
<span class="tag"><</span><span> </span><span class="tag-name">p</span><span class="tag">></span><span>Username:  </span>
</li>
<li>
<span class="tag"><</span><span class="tag-name">input</span><span> </span><span class="attribute">type</span><span>=</span><span class="attribute-value">"text"</span><span> </span><span class="attribute">name</span><span>=</span><span class="attribute-value">"username"</span><span> </span><span class="tag">/></span><span> </span>
</li>
<li class="alt">
<span class="tag"><</span><span> /p</span><span class="tag">></span><span> </span>
</li>
<li>
<span class="tag"><</span><span> </span><span class="tag-name">p</span><span class="tag">></span><span>Password:</span><span class="tag"><</span><span class="tag-name">input</span><span> <br /></span><span class="attribute">type</span><span>=</span><span class="attribute-value">"password"</span><span> </span><span class="attribute">name</span><span>=</span><span class="attribute-value">"password"</span><span> </span><span class="tag">/></span><span> </span>
</li>
<li class="alt">
<span class="tag"><</span><span> /p</span><span class="tag">></span><span> </span>
</li>
<li>
<span class="tag"><</span><span> </span><span class="tag-name">input</span><span> </span><span class="attribute">type</span><span>=</span><span class="attribute-value">"submit"</span><span> </span><span class="tag">/></span><span> </span>
</li>
<li class="alt">
<span class="tag"><</span><span> /form</span><span class="tag">></span><span> </span>
</li>
</ol>
ログイン後にコピー

$allowed という配列は、フォームが処理される前にどのフォーム変数が許可されているかを確認するために使用されます。プロセス制御は何を実行するかを決定し、実際のフィルター処理されたデータは process.inc に到着します。

security.inc が常にすべてのスクリプトの先頭に含まれるようにするより良い方法は、auto_prepend_file 設定を使用することです。

PHPデータフィルタリングの例

ホワイトリストを確立することは、PHPデータフィルタリングにとって非常に重要です。遭遇する可能性のあるすべてのタイプのフォーム データの例を示すことは不可能であるため、いくつかの例は一般的な理解を助けることができます。

次のコードはメール アドレスを検証します:

<ol class="dp-xml">
<li class="alt"><span><span class="tag"><</span><span> ?php  </span></span></li><li><span>$</span><span class="attribute">clean</span><span> = </span><span class="attribute-value">array</span><span>();  </span></li><li class="alt"><span>$</span><span class="attribute">email_pattern</span><span> = </span><span class="attribute-value">'<br />/^[^@s<&>]+@([-a-z0-9]+.)<br>+[a-z]{2,}$/i'</span><span>;  </span></span></li>
<li><span>if (preg_match($email_<br>pattern, $_POST['email']))  </span></li>
<li class="alt"><span>{$clean['email'] = $_POST<br>['email'];}  </span></li>
<li>
<span class="tag">?></span><span> </span>
</li>
</ol>
ログイン後にコピー

次の PHP データ フィルタリング コードは $_POST['color'] の内容が赤、緑、または青であることを確認します:

<ol class="dp-xml"><li class="alt"><span><span class="tag"><</span><span> ?php  </span></span></li><li><span>$</span><span class="attribute">clean</span><span> = </span><span class="attribute-value">array</span><span>();  </span></li><li class="alt"><span>switch ($_POST['color'])<br />{case 'red':case 'green':case <br />'blue':$clean['color'] = <br />$_POST['color'];  </span></li><li><span>break;  </span></li><li class="alt"><span>}  </span></li><li><span class="tag">?></span><span> </span></span></li></ol>
ログイン後にコピー

次の PHP データ フィルタリング コードは $ _POST['num'] は整数です:

<ol class="dp-xml"><li class="alt"><span><span class="tag"><</span><span> ?php  </span></span></li><li><span>$</span><span class="attribute">clean</span><span> = </span><span class="attribute-value">array</span><span>();  </span></li><li class="alt"><span>if ($_POST['num'] == <br />strval(intval($_<br />POST['num']))){$clean<br />['num'] = $_POST['num'];  </span></li><li><span>}  </span></li><li class="alt"><span class="tag">?></span><span> </span></span></li></ol>
ログイン後にコピー

次の PHP データ フィルタリング コードは、$_POST['num'] が浮動小数点であることを保証します:

<ol class="dp-xml"><li class="alt"><span><span class="tag"><</span><span> ?php  </span></span></li><li><span>$</span><span class="attribute">clean</span><span> = </span><span class="attribute-value">array</span><span>();  </span></li><li class="alt"><span>if ($_POST['num'] == <br />strval(floatval($_POST<br />['num']))){$clean['num'] <br />= $_POST['num'];  </span></li><li><span>}  </span></li><li class="alt"><span class="tag">?></span><span> </span></span></li></ol>
ログイン後にコピー

PHP データ フィルタリングのための名前変換

前のすべての例では、配列 $clean。これは、開発者がデータに潜在的に脆弱性があるかどうかを判断するための良い方法です。 データを検証した後は、決して $_POST または $_GET にデータを保存しないでください。開発者は、スーパー グローバル配列に保存されたデータを常に完全に疑う必要があります。

$clean を使用すると、何がフィルターされていないのかを考えるのに役立ち、ホワイトリストの役割に似ていることを付け加えておきます。セキュリティレベルを向上させることができます。

$clean に検証済みデータのみを保存する場合、データ検証における唯一のリスクは、フィルターされていない危険なデータではなく、参照する配列要素が存在しないことです。

PHPデータフィルタリングのタイミング

PHPスクリプトの実行が開始されると、それはすべてのHTTPリクエストが終了したことを意味します。この時点では、ユーザーがスクリプトにデータを送信する機会はありません。したがって、(register_globals がオンになっている場合でも) スクリプトにデータを入力することはできません。このため、変数を初期化することは非常に良い方法です。


www.bkjia.com本当http://www.bkjia.com/PHPjc/446197.html技術記事このガイドの冒頭で、データ フィルタリングは、あらゆる言語およびプラットフォームにおける Web アプリケーション セキュリティの基礎であると述べました。これには、アプリケーションへのデータ入力とアプリケーションからのデータ出力の検証が含まれます...
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

Video Face Swap

Video Face Swap

完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

PHPとPython:2つの一般的なプログラミング言語を比較します PHPとPython:2つの一般的なプログラミング言語を比較します Apr 14, 2025 am 12:13 AM

PHPとPythonにはそれぞれ独自の利点があり、プロジェクトの要件に従って選択します。 1.PHPは、特にWebサイトの迅速な開発とメンテナンスに適しています。 2。Pythonは、データサイエンス、機械学習、人工知能に適しており、簡潔な構文を備えており、初心者に適しています。

アクション中のPHP:実際の例とアプリケーション アクション中のPHP:実際の例とアプリケーション Apr 14, 2025 am 12:19 AM

PHPは、電子商取引、コンテンツ管理システム、API開発で広く使用されています。 1)eコマース:ショッピングカート機能と支払い処理に使用。 2)コンテンツ管理システム:動的コンテンツの生成とユーザー管理に使用されます。 3)API開発:RESTFUL API開発とAPIセキュリティに使用されます。パフォーマンスの最適化とベストプラクティスを通じて、PHPアプリケーションの効率と保守性が向上します。

PHPの永続的な関連性:それはまだ生きていますか? PHPの永続的な関連性:それはまだ生きていますか? Apr 14, 2025 am 12:12 AM

PHPは依然として動的であり、現代のプログラミングの分野で重要な位置を占めています。 1)PHPのシンプルさと強力なコミュニティサポートにより、Web開発で広く使用されています。 2)その柔軟性と安定性により、Webフォーム、データベース操作、ファイル処理の処理において顕著になります。 3)PHPは、初心者や経験豊富な開発者に適した、常に進化し、最適化しています。

PHPおよびPython:さまざまなパラダイムが説明されています PHPおよびPython:さまざまなパラダイムが説明されています Apr 18, 2025 am 12:26 AM

PHPは主に手順プログラミングですが、オブジェクト指向プログラミング(OOP)もサポートしています。 Pythonは、OOP、機能、手続き上のプログラミングなど、さまざまなパラダイムをサポートしています。 PHPはWeb開発に適しており、Pythonはデータ分析や機械学習などのさまざまなアプリケーションに適しています。

PHPおよびPython:コードの例と比較 PHPおよびPython:コードの例と比較 Apr 15, 2025 am 12:07 AM

PHPとPythonには独自の利点と短所があり、選択はプロジェクトのニーズと個人的な好みに依存します。 1.PHPは、大規模なWebアプリケーションの迅速な開発とメンテナンスに適しています。 2。Pythonは、データサイエンスと機械学習の分野を支配しています。

PHP:データベースとサーバー側のロジックの処理 PHP:データベースとサーバー側のロジックの処理 Apr 15, 2025 am 12:15 AM

PHPはMySQLIおよびPDO拡張機能を使用して、データベース操作とサーバー側のロジック処理で対話し、セッション管理などの関数を介してサーバー側のロジックを処理します。 1)MySQLIまたはPDOを使用してデータベースに接続し、SQLクエリを実行します。 2)セッション管理およびその他の機能を通じて、HTTPリクエストとユーザーステータスを処理します。 3)トランザクションを使用して、データベース操作の原子性を確保します。 4)SQLインジェクションを防ぎ、例外処理とデバッグの閉鎖接続を使用します。 5)インデックスとキャッシュを通じてパフォーマンスを最適化し、読みやすいコードを書き、エラー処理を実行します。

PHPの目的:動的なWebサイトの構築 PHPの目的:動的なWebサイトの構築 Apr 15, 2025 am 12:18 AM

PHPは動的なWebサイトを構築するために使用され、そのコア関数には次のものが含まれます。1。データベースに接続することにより、動的コンテンツを生成し、リアルタイムでWebページを生成します。 2。ユーザーのインタラクションを処理し、提出をフォームし、入力を確認し、操作に応答します。 3.セッションとユーザー認証を管理して、パーソナライズされたエクスペリエンスを提供します。 4.パフォーマンスを最適化し、ベストプラクティスに従って、ウェブサイトの効率とセキュリティを改善します。

PHPとPythonの選択:ガイド PHPとPythonの選択:ガイド Apr 18, 2025 am 12:24 AM

PHPはWeb開発と迅速なプロトタイピングに適しており、Pythonはデータサイエンスと機械学習に適しています。 1.PHPは、単純な構文と迅速な開発に適した動的なWeb開発に使用されます。 2。Pythonには簡潔な構文があり、複数のフィールドに適しており、強力なライブラリエコシステムがあります。

See all articles