blankyao さんは、「学習のプロセスは常に間違いを発見し、常に修正することです
まずマニュアルに書かれていることを読みましょう!」
一般の方は、最初の 2 つの段落だけ読んでください
Magic Quotes
コード:
Magic Quotes は、受信データを PHP スクリプトに自動的にエスケープするプロセスです。マジック クオートをオフにしてコーディングし、代わりにデータをエスケープすることをお勧めします。必要に応じて、実行時に
マジッククオートとは
コード:
オンの場合、すべての ' (一重引用符)、" (二重引用符)、(バックスラッシュ) および NULL 文字は自動的にバックスラッシュでエスケープされます。これは同じです。
3 つのマジック クォート ディレクティブがあります:
magic_quotes_gpc
コード:
HTTP リクエスト データ (GET、POST、および COOKIE) に影響します。実行時に設定することはできません。PHP ではデフォルトで on になります。 magic_quotes_runtime
コード:
有効にすると、データベースやテキスト ファイルを含む、外部ソースからデータを返すほとんどの関数で引用符がバックスラッシュでエスケープされます。
magic_quotes_sybase
ではデフォルトでオフになります。コード:
有効な場合、単一引用符はバックスラッシュではなく単一引用符でエスケープされます。オンの場合、両方のディレクティブを有効にすると、単一引用符のみが '' としてエスケープされます。
マジッククォートを使用する理由
1 初心者に役立つ
マジッククォートは、初心者が書いたコードを危険から守るためにPHPに実装されていますが、マジッククォートを使用してもSQLインジェクションは可能です。リスクが軽減されます。
2便利です
データベースにデータを挿入する場合、マジック クオートは基本的にすべての Get、Post、Cookie データに runlashes() を追加します。
マジック クォートを使用しない理由
。
1 移植性
コード:
on か off であると仮定して、get_magic_quotes_gpc() を使用してこれを確認し、それに応じてコードを作成します。
2 パフォーマンス
コード:
エスケープされたデータのすべてが挿入されるわけではないため。データベースにこのデータをすべてエスケープすると、パフォーマンスが低下します。実行時にエスケープ関数 (addslashes() など) を呼び出す方が効率的です。ただし、php.ini-dist はデフォルトでこれらのディレクティブを有効にします。 -recommended はこれを無効にします。この推奨事項は主にパフォーマンス上の理由からです。
3 不便
コード:
すべてのデータをエスケープする必要がないため、たとえば、フォームからメールを送信する場合などに、エスケープされたデータが表示されると煩わしいことがよくあります。修正するには、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 (同じinput)
説明:addlashes() 関数は、SQL ステートメントが正常に実行できるように単一引用符をエスケープ文字に変換します。
ただし、データベースはデータとして保存しません。これは私たちが想像していたものではありません。snow''''sun
コード:
3.
条件: magic_quotes_gpc=on
データベースに書き込まれた文字列はまったく処理されていません。データベースから読み取られた文字列は一切処理されません。
データ: $data="snow''''sun"; (snow と sun の間には 4 つの連続した一重引用符があります)
操作: 文字列「snow''''sun」をデータベースに書き込みます
結果: SQL ステートメントはスムーズに実行され、データはデータベースに正常に書き込まれました
データベース保存形式: Snow''''sun (入力と同じ)
出力データ形式: Snow''''sun (同じinput)
説明: magic_quotes_gpc=on は、SQL ステートメントが正常に実行できるように単一引用符をエスケープ文字に変換します。
ただし、データベースは、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 は、データベースに書き込もうとしている一重引用符を ' に変換し、後者の変換が書き込まれます。
Database として、データベースは Snow''''sun を保存します
概要は次のとおりです:
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 クエリから取得されたデータ; アクションの時間: スクリプトが実行状態で生成されたデータにアクセスするたび