PHPでは、 get_magic_quotes_gpcは、 magic_quotes_gpc構成アイテムが有効になっているかどうかをチェックする関数です。 MAGIC_QUOTES_GPCは、SQL注入攻撃を防ぐために、フォーム入力、URL、またはCookieからデータを自動的にエスケープするためにかつて使用されていた時代遅れのPHP設定です。ただし、マルチバイト文字エンコード(UTF-8など)では、 get_magic_quotes_gpcの処理は、特に英語以外の文字セットでは、予期しない問題を引き起こす可能性があります。
get_magic_quotes_gpcは、phpのmagic_quotes_gpc設定を確認し、 trueまたはfalseを返します。 MAGIC_QUOTES_GPCがオンに設定されている場合、PHPは$ _GET 、 $ _POST 、および$ _COOKIEからのデータを自動的にエスケープします。これは、すべての単一の引用( ' )、二重引用符( " )、バックスラッシュ( \ )がバックスラッシュ( \\ )で自動的に逃げられることを意味します。
MAGIC_QUOTES_GPCは、しばしばマルチバイト文字エンコード(UTF-8など)を扱う際に予想外の結果につながる可能性があります。 UTF-8エンコーディングは複数のバイトを使用して文字を表現しますが、 MAGIC_QUOTES_GPCの処理は主にシングルバイト文字セットを対象としています。
フォーム入力に漢字「Hello」が含まれているとします。 MAGIC_QUOTES_GPCが有効になっている場合、文字エンコードされたバイトストリームの中央にバックスラッシュをいくつかのバイトに挿入し、文字列が「You \ ok」または「you \ ok」になります。
MAGIC_QUOTES_GPCは、初期のSQL注入を防ぐように設計されていましたが、PHPの継続的な開発により、この構成は多くの問題をもたらすため推奨されなくなりました。
マルチバイトの文字エンコードを正しく処理しません。
余分なエスケープ文字を追加し、開発者が入力データを処理するときに余分な反転を行います。
最新のデータベースクエリの場合、準備されたステートメントを使用すると、 MAGIC_QUOTES_GPCに依存せずにSQLインジェクションを効果的に防ぐことができます。
したがって、PHP 5.4.0の後、 MAGIC_QUOTES_GPCは完全に放棄され、PHP 7.0.0で完全に削除されました。
まず、 MAGIC_QUOTES_GPCが無効になっていることを確認してください。 PHP構成ファイル( PHP.ini )をチェックすることで無効にすることができます。
<span><span><span class="hljs-attr">magic_quotes_gpc</span></span><span> = </span><span><span class="hljs-literal">Off</span></span><span>
</span></span>さらに、PHPコードでget_magic_quotes_gpc()を使用して、設定が現在有効になっているかどうかを判断することもできます。有効にすると、逃げた文字を手動で削除できます。
<span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-title function_ invoke__">get_magic_quotes_gpc</span></span><span>()) {
</span><span><span class="hljs-variable">$_GET</span></span><span> = </span><span><span class="hljs-title function_ invoke__">array_map</span></span><span>(</span><span><span class="hljs-string">'stripslashes'</span></span><span>, </span><span><span class="hljs-variable">$_GET</span></span><span>);
</span><span><span class="hljs-variable">$_POST</span></span><span> = </span><span><span class="hljs-title function_ invoke__">array_map</span></span><span>(</span><span><span class="hljs-string">'stripslashes'</span></span><span>, </span><span><span class="hljs-variable">$_POST</span></span><span>);
</span><span><span class="hljs-variable">$_COOKIE</span></span><span> = </span><span><span class="hljs-title function_ invoke__">array_map</span></span><span>(</span><span><span class="hljs-string">'stripslashes'</span></span><span>, </span><span><span class="hljs-variable">$_COOKIE</span></span><span>);
}
</span></span>フォーム入力を処理するときは、クライアントとサーバーが同じ文字エンコードを使用していることを確認し、UTF-8が推奨されます。これは、HTMLドキュメントで文字セットを指定することで実行できます。
<span><span><span class="hljs-tag"><<span class="hljs-name">meta</span></span></span><span> </span><span><span class="hljs-attr">charset</span></span><span>=</span><span><span class="hljs-string">"UTF-8"</span></span><span>>
</span></span>同時に、PHPでMB_CONVERT_ENCODING関数を使用して、文字エンコードの一貫性を確保します。
<span><span><span class="hljs-variable">$input</span></span><span> = </span><span><span class="hljs-title function_ invoke__">mb_convert_encoding</span></span><span>(</span><span><span class="hljs-variable">$input</span></span><span>, </span><span><span class="hljs-string">'UTF-8'</span></span><span>, </span><span><span class="hljs-string">'auto'</span></span><span>);
</span></span>SQLインジェクション攻撃を防ぐには、自動的に逃げるためにMAGIC_QUOTES_GPCに依存する代わりに、常に準備されたSQLステートメントを使用する必要があります。この方法は、エンコーディングの問題を解決するだけでなく、SQL注入を効果的に防止します。
PDOまたはmysqliを使用して、準備されたステートメントを実装してください。
<span><span><span class="hljs-comment">// 使用PDO</span></span><span>
</span><span><span class="hljs-variable">$stmt</span></span><span> = </span><span><span class="hljs-variable">$pdo</span></span><span>-></span><span><span class="hljs-title function_ invoke__">prepare</span></span><span>(</span><span><span class="hljs-string">"SELECT * FROM users WHERE username = :username"</span></span><span>);
</span><span><span class="hljs-variable">$stmt</span></span><span>-></span><span><span class="hljs-title function_ invoke__">bindParam</span></span><span>(</span><span><span class="hljs-string">':username'</span></span><span>, </span><span><span class="hljs-variable">$username</span></span><span>, PDO::</span><span><span class="hljs-variable constant_">PARAM_STR</span></span><span>);
</span><span><span class="hljs-variable">$stmt</span></span><span>-></span><span><span class="hljs-title function_ invoke__">execute</span></span><span>();
</span><span><span class="hljs-comment">// 使用MySQLi</span></span><span>
</span><span><span class="hljs-variable">$stmt</span></span><span> = </span><span><span class="hljs-variable">$mysqli</span></span><span>-></span><span><span class="hljs-title function_ invoke__">prepare</span></span><span>(</span><span><span class="hljs-string">"SELECT * FROM users WHERE username = ?"</span></span><span>);
</span><span><span class="hljs-variable">$stmt</span></span><span>-></span><span><span class="hljs-title function_ invoke__">bind_param</span></span><span>(</span><span><span class="hljs-string">"s"</span></span><span>, </span><span><span class="hljs-variable">$username</span></span><span>);
</span><span><span class="hljs-variable">$stmt</span></span><span>-></span><span><span class="hljs-title function_ invoke__">execute</span></span><span>();
</span></span>get_magic_quotes_gpcおよびmagic_quotes_gpcは、最新のPHP開発では推奨されなくなりました。マルチバイト文字エンコードの処理のために、データの正確性とセキュリティを確保するために、脱出とキャラクターエンコーディングの一貫性に特別な注意を払う必要があります。最善のことは、 Magic_Quotes_GPCを無効にし、準備されたSQLステートメントなどの最新の入力検証方法を使用し、均一な文字エンコード(UTF-8など)を使用して、文字化けされたキャラクターや不必要な脱出の問題を避けることです。