magic_quotes_gpc メソッドは、php.ini の設定に基づいて生成されます。その機能は、addlashes と同じです。
thinksaas ソース コードの一部を読んだ後、$_POST/$_GET からのデータ処理メソッドは関数 Add_S() を通じて実行されることがわかりました。つまり、環境では Magic_quotes_gpc がデフォルトで有効になっていないため、送信されたデータはaddslashes() によって処理されます。
私は、magic_quotes_gpc についていつも混乱していました。以前、magic_quotes_gpc について「magic_quotes_gpc とaddslashes() の正しい関係は?」という記事も公開しました。 》, このことを徹底的に理解したいので、今もう一度この問題について話します。thinksaas 公式ウェブサイトでこの質問を送信し、その時点で結果をこの記事に更新する予定です。 。
質問1: データ内のデータを今読み取る場合、読み取り後にstripslashes()を処理して元のデータの状態に戻す必要がありますか?
質問 2: 他の多くのプログラムはこれを逆に処理しているようです。つまり、環境が magic_quotes_gpc をオンにしている場合、送信されたデータに対してstripslashes() が実行され、その後データに対して htmlspecialchars() が実行されて特殊記号が置き換えられます。 , この方法とthinksaasではどちらの方法が良いのでしょうか?今後、magic_quotes_gpc はデフォルトで有効にならないと聞きました。
Typecho 機関車公開インターフェイス、質問 2 の方法を使用して投稿データを処理します。それが最適な方法かどうかはわかりません。
送信されたデータに対してstripslashes()を実行し、次にデータに対してhtmlspecialchars()を実行します。この方法には利点がないと思います。それでもTSよりは良いです。 Weibo やフォーマットの少ない特別な Web サイトの場合は、単に addlashed() してデータベースに直接保存するのが最善だと思います。
質問 1 には誰も回答しませんでしたが、magic_quotes_gpc がオンになっているかどうかに関係なく、データを保存するときに余分なバックスラッシュが追加されないため、データを読み取った後にstripslashes() 処理を実行する必要はありません。 。
magic_quotes_gpc の概要
1.治療方法
方法1: システム環境でmagic_quotes_gpcが有効になっていない場合、送信されたデータに対してaddslashes()処理を実行します。
方法 2: システム環境で magic_quotes_gpc が有効になっている場合は、送信されたデータに対してstripslashes() 処理を実行し、最後にデータに対して htmlspecialchars() 処理を実行して特殊記号を削除します。
2. 兄弟が言ったように、単純な保存の場合は、addslashed() を実行してから保存するのが最善の方法です。通常、文字列を保存する前に、magic_quotes_gpc を削除する必要があります。が自動的に追加され、処理後、addslashed() または htmlspecialchars() によって処理され、最終的にデータベースに保存されます。一般的にはそうなのですが、実態に応じて柔軟に方法を採用する必要があります。
2012-10-21更新
最善の方法は、magic_quotes_gpc によって自動的に追加されたバックスラッシュを削除してから、データベース操作クラスで、すべての操作を最初にデータベースに追加し、次にデータベースに追加することです
それでは、公式の運用内容を見てみましょう
まずは説明書に書いてあることを見てみましょう!
ほとんどの人は、最初の 2 つの段落だけ読んでください
魔法の名言
コード:
マジック クオートは、受信データを PHP スクリプトに自動的にエスケープするプロセスです。必要に応じて、マジック クオートをオフにしてコードを作成し、代わりに実行時にデータをエスケープすることをお勧めします。
魔法の名言とは
コード:
オンにすると、すべての ' (一重引用符)、" (二重引用符)、(バックスラッシュ)、および NULL 文字は自動的にバックスラッシュでエスケープされます。これは、addslashes() が行うことと同じです。
magic_quotes_gpc
HTTP リクエスト データ (GET、POST、COOKIE) に影響します。実行時に設定することはできません。PHP ではデフォルトでオンになります。
magic_quotes_runtime
有効にすると、データベースやテキスト ファイルなど、外部ソースからデータを返すほとんどの関数で引用符がバックスラッシュでエスケープされます。実行時に設定でき、PHP ではデフォルトでオフになります。
magic_quotes_sybase
有効にすると、一重引用符はバックスラッシュではなく一重引用符でエスケープされます。オンの場合、両方のディレクティブが有効になると、一重引用符、バックスラッシュ、および NULL のみがそのまま残ります。そして逃げられない
魔法の引用を使用する理由
1 初心者にも役立つ
2利便性
データベースにデータを挿入する場合、マジック クオートは基本的にすべての Get、Post、Cookie データに対して addslashes() を実行し、これを自動的に実行します。
魔法の引用を使用しない理由
1携帯性
コード:
これがオンかオフかは、移植性に影響を与えると仮定して、 get_magic_quotes_gpc() を使用してこれを確認し、それに応じてコーディングします。
2パフォーマンス
エスケープされたデータのすべてがデータベースに挿入されるわけではないため、このデータをすべてエスケープするとパフォーマンスが低下します。実行時にエスケープ関数 (addslashes() など) を呼び出す方が効率的です。
php.ini-dist はこれらのディレクティブをデフォルトで有効にしますが、php.ini-recommended は主にパフォーマンス上の理由から無効にします。
3.不便
コード:
すべてのデータをエスケープする必要があるわけではないため、エスケープすべきでない場所にエスケープされたデータが表示されると煩わしいことがよくあります。たとえば、フォームからメールを送信する場合、メール内に ' が大量に表示されると、これを修正するにはストリップスラッシュ() が必要になる場合があります。 ).
例
PHP環境変数magic_quotes_gpcの値を取得します。
構文:long get_magic_quotes_gpc(void);
戻り値: 長整数
関数の種類: PHPシステム関数
コンテンツの説明
この関数は、PHP環境に設定されている変数magic_quotes_gpc(GPC、Get/Post/Cookie)の値を取得します。 0 を返すとこの機能がオフになることを意味し、1 を返すとこの機能がオンになることを意味します。 magic_quotes_gpc が有効な場合、すべての ' (一重引用符)、" (二重引用符)、'' (バックスラッシュ)、およびヌル文字は、バックスラッシュを含むオーバーフロー文字に自動的に変換されます。
スラッシュを追加 -- バックスラッシュを使用して文字列を引用します
説明
データベースクエリステートメントなどの目的で、特定の文字の前にバックスラッシュを追加した文字列を返します。これらの文字は、一重引用符 (')、二重引用符 (")、バックスラッシュ ('')、および NUL (NULL 文字) です。
addslashes() の使用例は、データベースにデータを入力する場合です。たとえば、O'reilly という名前をデータベースに挿入するには、エスケープする必要があります。ほとんどのデータベースでは、エスケープ文字として '' を使用します (O'''reilly)。これにより、余分な '' を挿入せずにデータがデータベースに保存されます。 PHP ディレクティブ magic_quotes_sybase が on に設定されている場合、' の挿入は ' でエスケープされることを意味します。
例 1.addslashes() の例
コードは次のとおりです
$str = "あなたの名前はオライリーですか?"; | |
?>
|
この関数は、PHP 環境設定の変数 magic_quotes_gpc (GPC、Get/Post/Cookie) の値を取得します。 0 を返すとこの機能がオフになることを意味し、1 を返すとこの機能がオンになることを意味します。 magic_quotes_gpc がオンになっている場合、すべての ' (一重引用符)、" (二重引用符)、'' (バックスラッシュ)、およびヌル文字はバックスラッシュを含むオーバーフロー文字に自動的に変換されます。
コードは次のとおりです
関数html($str) { | $str = get_magic_quotes_gpc()?$str:addslashes($str); | $str;
要約は次のとおりです: 1. PHP の場合、magic_quotes_gpc=on、 入出力データベースの文字列データでは何もできません このとき入力データに対してaddslashes()を実行すると、 2. PHPのmagic_quotes_gpc=offの場合 入力データを処理するにはaddslashes()を使用する必要がありますが、出力のフォーマットにはstripslashes()を使用する必要はありません |