blankyao さんは、「学習のプロセスは常に間違いを発見し、常に修正することです。
まずマニュアルに書かれていることを見てみましょう!」
ほとんどの人は、最初の 2 つの段落だけを読んでください。
Magic Quotes
コード:
Magic Quotes は、受信データを PHP スクリプトに自動的にエスケープするプロセスです。必要に応じて、マジック クオートをオフにしてコーディングし、代わりに実行時にデータをエスケープすることをお勧めします。
マジック クォートとは
オンの場合、すべて ' (単一 - quote)、" (二重引用符)、(バックスラッシュ)、および NULL 文字はバックスラッシュで自動的にエスケープされます。これは、addslashes() が行うことと同じです。
マジック クォート ディレクティブは 3 つあります:
magic_quotes_gpc
コード:
HTTP リクエスト データ (GET、POST、COOKIE) に影響します。実行時に設定することはできません。
magic_quotes_runtime
コード:
有効にすると、データベースやテキスト ファイルなど、外部ソースからデータを返すほとんどの関数で引用符がバックスラッシュでエスケープされます。
magic_quotes_sybase
コード:
有効にすると、単一引用符はバックスラッシュではなく単一引用符でエスケープされます。オンの場合、両方のディレクティブが有効になると、単一引用符のみが二重引用符としてエスケープされます。バックスラッシュと NULL はそのまま残り、エスケープもされません。
マジック クオートを使用する理由
1 初心者にとって役立つ
コードを支援するために、マジック クォートが PHP に実装されています。 SQL インジェクションはマジック クオートを有効にしても可能ですが、
2利便性
データベースにデータを挿入する場合、マジック クォートは基本的に addslashes() を実行します。
Magic Quotes を使用しない理由
1 >
コード:
オンまたはオフであると仮定すると、移植性に影響します。 get_magic_quotes_gpc() を使用してこれを確認し、それに応じてコードを作成します。
コード:
すべての部分ではないため。のエスケープされたデータがデータベースに挿入される場合、実行時にエスケープ関数 (addslashes() など) を呼び出すだけではパフォーマンスが低下します。
ただし、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
データベースに書き込まれた文字列は、addslashes() 関数によって処理されます。データベースから読み取られた文字列は一切処理されません。
データ: $data="snow''''sun"; (snow と sun の間には 4 つの連続した一重引用符があります)
操作: 文字列「snow' ''」を変更します。 'sun" がデータベースに書き込まれます、
結果: SQL ステートメントがスムーズに実行され、データがデータベースに正常に書き込まれます
データベースの保存形式: Snow''''sun (同じ
出力データ形式: Snow''''sun (入力と同じ)
説明: addslashes() 関数は、SQL ステートメントで使用できるように、一重引用符を ' エスケープ文字に変換します。
ただし、データベースにはデータとして保存されません。データベースには、私たちが想像した雪"" 太陽ではありません。
コード:
。 3.
条件: magic_quotes_gpc=on
データベースに書き込まれた文字列は、いかなる方法でも処理されません。データベースから読み取られた文字列は一切処理されません。
データ: $data="snow''''sun"; (snow と sun の間には 4 つの連続した一重引用符があります)
操作: 文字列「snow' ''」を変更します。 'sun" がデータベースに書き込まれます、
結果: SQL ステートメントがスムーズに実行され、データがデータベースに正常に書き込まれます
データベースの保存形式: Snow''''sun (同じ
出力データ形式: Snow''''sun (入力と同じ)
説明: magic_quotes_gpc=on は、SQL ステートメントを正常に実行するために一重引用符を ' エスケープ文字に変換します。
ですが、' はデータベースにデータとして入力されません。データベースには、私たちが想像する雪''''太陽ではなく、雪''''太陽が保存されます。
コード:
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 はデータベースに書き込もうとしている一重引用符を ' に変換し、後者の変換は
データベースにデータとして書き込まれます。データベースは、snow''''sun
を保存します。概要は次のとおりです。
1. magic_quotes_gpc=on、
の場合、文字列データの入力および出力に対して
addslashes() およびtripslashes() 操作を実行できません。データベースに保存すると、データは正常に表示されます。
この時点で入力データに対してaddslashes()を実行する場合、
出力時に余分なバックスラッシュを削除するにはstripslashes()を使用する必要があります。
2. magic_quotes_gpc=off の場合、
は入力データを処理するためにaddslashes() を使用する必要がありますが、出力
をフォーマットするためにstripslashes() を使用する必要はありません。 addslashes() は行いません。バックスラッシュはデータベースには書き込まれません。バックスラッシュは、mysql が SQL ステートメントの実行を完了するのに役立つだけです。
補足:
magic_quotes_gpc アクションの範囲: WEB クライアント サーバー。アクション時間: スクリプトの実行時など、リクエストの開始時。
magic_quotes_runtime スコープ: ファイルから読み取られたデータ、または exec() の実行結果、または SQL クエリから取得されたデータ アクション時間: スクリプトが実行状態で生成されたデータにアクセスするたび