ブログ移転作業中です。こんな記事まで移転する必要があるか悩みましたが、折角なので移転しました。今でも PHP 5.3 などは現役だと思います。
スポンサーリンク
PHP5.3 までは、php.ini などの設定でマジッククォートがオンの場合、全ての ‘ ( シングルクオート ) , ” ( ダブルクオート ), \ ( バックスラッシュ ) および NULL 文字はバックスラッシュで自動的にエスケープされます。この機能は、SQL インジェクションを防ぐために使用されていると思います。 しかし、以下の理由からマジッククオートは使用しないほうが良いです。
- PHP5.3 で非推奨となり、PHP5.4 では、マジッククオートは PHP から削除されたため移植性に影響がでる
- クォートしたくないものまでクォートされるので返って逆変換処理に労力を使うことがある
- データベースやライブラリが提供するクォート処理を利用したほうが良い
詳細は、下記を参照ください。
PHP5.4.0 以降も php.ini に設定等はできますし、関連する関数も存在します。しかし、例えば get_magic_quotes_gpc 関数などは設定値に関わらず PHP5.4.0 以降では常に FALSE をリターンします。
マジッククォートの無効化
マジッククォートを無効化するには php.ini を使用するのが一般的です。 また、php.ini の書き込み権限がない時は、.htaccess に設定することもできます。
php.ini の設定例
magic_quotes_gpc = Off ; Magic quotes for runtime-generated data, e.g. data from SQL, from exec(), etc. magic_quotes_runtime = Off ; Use Sybase-style magic quotes (escape ' with '' instead of \'). magic_quotes_sybase = Off
マジッククオートの代替処理 ( SQL クォート処理の実装例 )
SQL インジェクション対策としてクォート処理を実装するサンプルについては、 以下のリンクを参照ください。データベースごとにまとめてみました。
- [ PHP ] SQL のクォート ( Oracle, MySQL, SQL Server, DB2 )
- [ MySQL ] 入門編: 予約語をテーブル名やカラム名に使用する
- [ Oracle ] テーブル名やカラム名に SQL 予約語を使用する