blankyao さんは、「学習のプロセスは、常に間違いを発見し、常に修正することです。」
まずマニュアルに書いてあることを読みましょう。
一般の方は、最初の 2 つの段落だけ読んでください
マジック クオート
コード:
マジック クォートは、受信データを PHP スクリプトに自動的にエスケープするプロセスです。マジック クォートをオフにしてコーディングし、代わりに実行時にデータをエスケープすることをお勧めします。必要に応じて
マジック引用符とは
コード:
オンにすると、すべての ' (一重引用符)、" (二重引用符)、(バックスラッシュ)、および NULL 文字がバックスラッシュで自動的にエスケープされます。これは、スラッシュ () を追加するものと同じです。
3 つのマジック クォート ディレクティブがあります:
magic_quotes_gpc
コード:
HTTP リクエスト データ (GET、POST、および COOKIE) に影響し、PHP ではデフォルトでオンになります。 、データベースやテキスト ファイルなど、外部ソースからデータを返すほとんどの関数では、引用符がバックスラッシュでエスケープされます。実行時に設定でき、PHP ではデフォルトでオフになります。 quote はバックスラッシュではなく単一引用符でエスケープされます。オンの場合、magic_quotes_gpc が完全にオーバーライドされます。両方のディレクティブを有効にすると、二重引用符、バックスラッシュ、および NULL のみがそのまま残り、エスケープされません。マジッククォート
1 初心者に便利
初心者が書いたコードが危険でないようにマジッククォートが PHP に実装されていますが、マジッククォートをオンにしても SQL インジェクションは可能ですが、リスクは軽減されます
2 データベースにデータを挿入する場合。 magic quotes は基本的にすべての Get、Post、Cookie データに対して addslashes() を実行し、それを自動的に実行します。
Magic Quotes を使用しない理由
1 移植性
コード:
on か off であると仮定すると、get_magic_quotes_gpc を使用します。 () をチェックして、それに応じてコーディングします。
2 パフォーマンス
コード:
エスケープされたデータのすべてがデータベースに挿入されるわけではないため、このデータをすべてエスケープする関数 (たとえば、実行時に addlashes()) を実行する方が効率的です。
php.ini-dist はデフォルトでこれらのディレクティブを有効にしますが、php.ini-recommended は主にパフォーマンス上の理由からです。データはエスケープする必要があります。たとえば、フォームからメールを送信すると、メール内に ' が大量に表示され、これを修正するには、stripslashes() を過剰に使用する必要がある場合があります。これらの英語の単語は、私のような人には十分な忍耐力が必要です (私に忍耐力があるわけではありませんが、私の英語は下手です)。先ほども言いましたが、一般の人は最初の 2 つの段落、特に赤で強調した単語を読んでください。 ! ! !
さらに、$_GET、$_POST、$_COOKIE を渡すときにマジック引用符が有効になるという事実に特別な注意が払われます
以下の場合が当てはまります
コード:
1
条件: magic_quotes_gpc=off
に書き込まれる文字列データベースはフィルタ処理を通過していません。データベースから読み取られた文字列は一切処理されません。
データ: $data="snow''''sun"; (snow と sun の間には 4 つの連続した一重引用符があります)
操作: 文字列「snow''''sun」をデータベースに書き込みます。
結果: SQL ステートメント エラーが発生しました。MySQL は SQL ステートメントを正常に完了できず、データベースへの書き込みに失敗しました。
データベース保存形式: データがありません。
出力データ形式: データなし。
注: 未処理の一重引用符は、データベースに書き込まれるときに SQL ステートメント エラーを引き起こします。
コード:
2.
条件: magic_quotes_gpc=off
データベースに書き込まれた文字列は関数addlashes()によって処理されます。データベースから読み取られた文字列は一切処理されません。
データ: $data="snow''''sun"; (snow と sun の間には 4 つの連続した一重引用符があります)
操作: 文字列「snow''''sun」をデータベースに書き込みます。
結果: SQL ステートメントが正常に実行され、データがデータベースに正常に書き込まれました。
データベース保存形式: Snow''''sun (入力と同じ)
出力データ形式: Snow''''sun (入力と同じ)
手順: addedlashes() この関数は、SQL ステートメントが正常に実行できるように、一重引用符をエスケープ文字に変換します。
ただし、データベースには雪は保存されず、雪は保存されません。
コード:
3.
条件: magic_quotes_gpc=on
データベースに書き込まれる文字列は一切処理されません。データベースから読み取られた文字列は一切処理されません。
データ: $data="snow''''sun"; (snow と sun の間には 4 つの連続した一重引用符があります)
操作: 文字列「snow''''sun」をデータベースに書き込みます。
結果: SQL ステートメントが正常に実行され、データがデータベースに正常に書き込まれました。
データベース保存形式: Snow''''sun (入力と同じ)
出力データ形式: Snow''''sun (入力と同じ)
説明: magic_quotes_gpc=on 一重引用符を ' エスケープ文字に変換すると、SQL ステートメントは正常に実行されますが、 ' はデータとしてデータベースに入力されず、データベースは、snow''''sun の代わりに、snow''''sun を保存します。私たちは想像しました。
コード:
4.
条件: magic_quotes_gpc=on
データベースに書き込まれた文字列は関数 addlashes() によって処理されます。データベースから読み取られた文字列は一切処理されません。
データ: $data="snow''''sun"; (snow と sun の間には 4 つの連続した一重引用符があります)
操作: 文字列「snow''''sun」をデータベースに書き込みます。
結果: SQL ステートメントはスムーズに実行され、データはデータベースに正常に書き込まれました。
データベース保存形式: Snow''''sun (エスケープ文字を追加)
出力データ形式: Snow''''sun (エスケープ文字を追加)
命令: magic_quotes_gpc=on は SQL ステートメントが正常に実行できるように一重引用符を 'エスケープ文字に変換します。
addslashes はデータベースに書き込もうとしている一重引用符を ' に変換し、後者の変換は
ファイルに書き込まれます。データベースをデータとして保存し、データベースは雪です '''' 太陽です
概要は次のとおりです:
1. magic_quotes_gpc=on の場合、
addslashes() およびtripslashes() 操作を実行することはできません。入出力データベースの文字列データを取得すると、データは正常に表示されます。
この時点で入力データに対してaddslashes()を実行する場合、
出力時にstripslashes()を使用して余分なバックスラッシュを削除する必要があります。
2. magic_quotes_gpc=off の場合
入力データを処理するために addslashes() を使用する必要がありますが、addslashes() はバックスラッシュをまとめてファイルに書き込まないため、出力をフォーマットするためにstripslashes() を使用する必要はありません
データベースでは、これは mysql が SQL ステートメントの実行を完了するのに役立つだけです。
補足:
magic_quotes_gpc アクションの範囲: WEB クライアント サーバー; アクション時間: スクリプトの実行時など、リクエストの開始時。
magic_quotes_runtime スコープ: ファイルから読み取られたデータ、または exec() の実行結果、または SQL クエリから取得されたデータ; アクションの時間: スクリプトが実行状態で生成されたデータにアクセスするたび
上記では、引用符の内容を含め、php magic_quotes_gpc の理解と分析を紹介しました。PHP チュートリアルに興味のある友人に役立つことを願っています。