マジッククォートはPHP スクリプト言語の機能で、文字列は渡される前に自動的にエスケープされます(特殊文字の前にバックスラッシュが付けられます)。これは、初心者が手動でエスケープする必要なく機能する SQL コマンドを記述できるようにするために導入されました。後に、経験の浅い開発者がSQL インジェクション攻撃に対して脆弱なコードを記述するのを防ぐことが目的であると説明されました。
この機能はセキュリティ上の懸念から、PHP 5.3.0 で正式に非推奨となり、PHP 5.4 では削除されました。[1]
コンセプト
PHP マニュアルの現在の改訂版では、マジック クォートの背後にある理論的根拠は「初心者が書いたコードが危険にならないようにするため」であると述べられています。[2]ただし、マジック クォートは元々 PHP 2 で msql の php.h コンパイル時設定として導入され、単一引用符のみをエスケープして「フォーム データを msql クエリに直接渡すのを容易にしました」。[3]元々は「セキュリティ機能ではなく、利便性機能」として意図されていました。[4] [5]
PHP 3 では、マジック クォートの使用範囲が拡張されました。ユーザーが入力したすべてのデータ内のシングル クォート、ダブル クォート、バックスラッシュ、および null 文字には、スクリプトに渡される前に、グローバル変数 、 、 でバックスラッシュが先頭に追加されます$_GET。$_REQUEST開発$_POST者$_COOKIEは、理論的には、文字列連結を使用して、ユーザーが入力したデータで安全な SQL クエリを構築できます。(これは、PHP 2 および PHP 3 が最新だったときに最も正確でした。主なサポート対象データベースでは 1 バイトの文字セットしか使用できなかったためです。)
批判
PHP 3 および 4 の新規インストールでは、マジック クォートはデフォルトで有効になっていますがmagic_quotes_gpc、設定ディレクティブで無効にすることもできます。マジック クォートの動作はバックグラウンドで行われ、すぐにはわからないため、開発者はマジック クォートの存在や、マジック クォートが引き起こす可能性のある問題に気付いていない可能性があります。PHP のドキュメントでは、いくつかの落とし穴が指摘されており、デフォルトで有効になっているにもかかわらず、マジック クォートを無効にすることを推奨しています。[6]
マジッククォートに関する問題は次のとおりです:
- ユーザーが入力するデータはすべてデータベースに挿入されるわけではありません。画面に直接表示されたり、セッションに保存されたり、保存前にプレビューされたりすることがあります。その結果、不要な場所にバックスラッシュが追加され、エンドユーザーに表示される可能性があります。このバグは、広く使用されているソフトウェアにも潜んでいることがよくあります。[7]
- ユーザーが提供し、データベース クエリで使用されるすべてのデータが、マジック クォートで保護されたソースから直接取得されるわけではありません。たとえば、ユーザーが提供した値がデータベースに挿入され、マジック クォートで保護され、その後データベースから取得されて、その後のデータベース操作で使用される場合があります。後者の使用はマジック クォートで保護されず、マジック クォートに依存することに慣れた初心者のプログラマーは、明示的に保護する必要があることに気付かない可能性があります。
- マジッククォートはPHPの関数が提供する汎用的な機能も使用しますが
addslashes()、これはUnicodeに対応しておらず、一部のマルチバイト文字エンコーディングでは依然としてSQLインジェクションの脆弱性の影響を受けます。mysql_real_escape_string()可能であれば、バインドされたパラメータを持つ準備されたクエリなどのデータベース固有の関数が推奨されます。[8] [9] - 多くのデータベース管理システムではバックスラッシュによる引用符のエスケープをサポートしていますが、標準では別の引用符の使用が求められています。マジック クォートは、バックスラッシュによる引用符のエスケープをサポートするように設定されていないデータベースに対しては保護を提供しません。
- アプリケーションがマジック クォートが有効になっていることを前提としてコーディングされ、その後マジック クォートが無効になっているサーバーに移動された場合、またはその逆の場合、移植性が問題になります。
- マジッククォートを追加し、その後適切な場所でそれを削除すると、わずかですが不要なパフォーマンスのオーバーヘッドが発生します。
- マジッククォートは、クロスサイトスクリプティング攻撃やSMTP ヘッダーインジェクション攻撃などの他の一般的なセキュリティ脆弱性からは保護しません。
2005年11月、PHPのコア開発者は、これらの問題のため、マジッククォート機能をPHP 6から削除することを決定しました。[10] PHP 6の開発が行き詰まり、代わりに5.xブランチで開発が継続されたため、この機能はPHP 5.3.0で非推奨となり、5.4で削除されました。[1]
その他のアプローチ
- Perl [11]やRuby [12]などの一部の言語では、データ汚染を伴うアプローチが選択されます。このアプローチでは、ユーザー入力などの信頼できないソースからのデータは「汚染されている」とみなされ、通常は検証またはエンコード後に明示的に信頼できるとマークされるまで、危険な操作には使用できません。このコンテキストではSQLクエリの構築が「危険」と見なされるため、プログラマーは問題に対処する必要があります。汚染によって問題が解決されるわけではありませんが、問題があるインスタンスが強調表示され、プログラマーが適切に解決できるようになります。
- ジョエル・スポルスキーは、データが安全か安全でないかを示すハンガリー記法を使用することを提案した。 [13]
- 最新のデータベース エンジンとライブラリは、パラメーター化されたクエリを使用して、SQL コマンドとは別にデータをデータベースに渡すため、クエリを構築する前にデータをエスケープする必要性が大幅に軽減されます。
参照
参考文献
- ^ ab 「マジッククォート」。PHP マニュアル。PHP.net。2014年 1 月 17 日閲覧。
- ^ 「PHP:マジッククォートを使用する理由」。PHP ドキュメント。2007年 2 月 19 日閲覧。
- ^ 「php.h ファイルで MAGIC_QUOTES 変数が定義されている場合、これらの引用符は自動的にエスケープされ、フォーム データを msql クエリに直接渡すことが容易になります」 。2011年 3 月 27 日取得。
- ^ 「Magic Quotes は、熟練した PHP プログラマーにさえも理解されることが多い」。
- ^ 「Re: [PHP3] what are magic_quotes?」PHP-dev メーリングリスト1999-08-27 2011-01-17閲覧。
- ^ 「PHP:マジッククォートを使用しない理由」PHP ドキュメント. 2007 年 2 月 19 日閲覧。
- ^ 「コメントを編集するときに引用符が二重にエスケープされる」。WordPress問題追跡。2007年 2 月 19 日閲覧。
- ^ Chris Shiflett. 「addslashes() と mysql_real_escape_string()」。2007 年 2 月 19 日閲覧。
- ^ MySQL AB. 「リリース 5.0.22 の変更点 (2006 年 5 月 24 日)」。MySQL 5.0 リファレンス マニュアル。2007 年 2 月 22 日時点のオリジナルからアーカイブ。2007年 2 月 19 日閲覧。
- ^ PHP Group (2005-11-12). 「PHP 開発者会議議事録」. 2007-02-19に閲覧。
- ^ Dan Ragle (2006-04-18). 「Perl の Taint モードの紹介」. webreference.com . 2007-03-21閲覧。
- ^ 「Ruby を金庫に閉じ込める」。プログラミング Ruby。2009年 5 月 30 日時点のオリジナルよりアーカイブ。2014年 5 月 21 日閲覧。
- ^ Joel Spolsky (2005-05-11). 「間違ったコードを間違って見えるようにする」Joel on Software: Painless Software Management 。2007-02-19に閲覧。
外部リンク
- マジッククォートに関する PHP マニュアル
