web-dev-qa-db-ja.com

共有ホスティングでマジッククオートを無効にする方法は?

PHPの魔法の引用符を無効にします。 php.iniにアクセスできません。

_php_flag magic_quotes_gpc off_を.htaccessファイルに追加しようとすると、500内部サーバーエラーが発生します。これは私の.htaccessファイルがどのように見えるかです:

_AddType x-mapp-php5 .php
php_flag magic_quotes_gpc off
_

その後、ini_set('magic_quotes_gpc', 'O')を使用しようとしましたが、効果はありませんでした。

魔法の引用符をオフにするにはどうすればよいですか?

41
John

マニュアル に従って、共有ホスティングにカスタムphp.iniをインストールできます。mod_phpは使用されないため、php_valueディレクティブはエラーになります。 suexec/FastCGIのセットアップでは、どのような場合でもWebスペースごとにphp.iniを持つのが一般的です。

-

O(大文字のo)はiniフラグを設定するのに有効な値ではないと思います。 true/false、1/0、または「on」/「off」の値を使用する必要があります。

ini_set( 'magic_quotes_gpc', 0 );   // doesn't work

[〜#〜] edit [〜#〜]

ini設定のリスト を確認した後、magic_quotes_gpcはPHP_INI_PERDIR設定(4.2.3以降)であることがわかります。つまり、ini_set()(のみ)で変更することはできません。 PHP_INI_ALL設定はini_set()で変更できます)

つまり、.htaccessファイルを使用してこれを行う必要があります-OR-魔法の引用符の効果を逆にするスクリプトを実装します。

if ( in_array( strtolower( ini_get( 'magic_quotes_gpc' ) ), array( '1', 'on' ) ) )
{
    $_POST = array_map( 'stripslashes', $_POST );
    $_GET = array_map( 'stripslashes', $_GET );
    $_COOKIE = array_map( 'stripslashes', $_COOKIE );
}
42
Peter Bailey

Php_flagがあなたに500 Internal Server Errors、 PHPマニュアル には、マジッククォートがオンになっているかどうかを検出し、実行時にスーパーグローバルから削除する例があります。投稿された他のものとは異なり、これは再帰的であり、配列から引用符を正しく削除します。

更新:今日、気づいたのは、代わりにスーパーグローバルへの参照を使用するPHPマニュアルに次のコードの新しいバージョンがあることです。

古いバージョン:

<?php
if (get_magic_quotes_gpc()) {
    function stripslashes_deep($value)
    {
        $value = is_array($value) ?
                    array_map('stripslashes_deep', $value) :
                    stripslashes($value);

        return $value;
    }

    $_POST = array_map('stripslashes_deep', $_POST);
    $_GET = array_map('stripslashes_deep', $_GET);
    $_COOKIE = array_map('stripslashes_deep', $_COOKIE);
    $_REQUEST = array_map('stripslashes_deep', $_REQUEST);
}
?>

新しいバージョン:

<?php
if (get_magic_quotes_gpc()) {
    $process = array(&$_GET, &$_POST, &$_COOKIE, &$_REQUEST);
    while (list($key, $val) = each($process)) {
        foreach ($val as $k => $v) {
            unset($process[$key][$k]);
            if (is_array($v)) {
                $process[$key][stripslashes($k)] = $v;
                $process[] = &$process[$key][stripslashes($k)];
            } else {
                $process[$key][stripslashes($k)] = stripslashes($v);
            }
        }
    }
    unset($process);
}
?>
30
Powerlord

これにより、ローカルphp.iniファイルを作成するときに「クラス 'PDO'が見つかりません」という問題が解決します。

Htaccessファイルを使用してマジッククォートをオフにできない場合(ピートベイリーによって既に与えられた理由のため):

  1. テキストファイルを作成する
  2. 名前を「php.ini」に変更します
  3. 行を追加する

    magic_quotes_gpc =オフ
    magic_quotes_runtime =オフ
    magic_quotes_sybase =オフ
    extension = pdo.so
    extension = pdo_mysql.so

  4. スクリプトを実行しているディレクトリに保存します。

更新:新しいphp.iniファイルのコピーを1つだけ作成する場合は、ルート.htaccessファイルに次の行を追加します。

SetEnv PHPRC /path/to/site/root/public_html/php.ini

明らかに、iniファイルをまだ存在しないこの場所に移動する必要があります。

それが私をちょうど連れて行った2時間を誰かを救うことを願っています!

20
gonzo

.htaccessファイル内のphp_flagとphp_valueは技術的には正しいですが、PHPはApacheモジュールとしてのみインストールされます。共有ホストでは、このような設定はほとんどありません。PHPは、セキュリティに関連する理由により(サーバーの隣人をファイルから遠ざけるため)CGIとして実行され、phpsuexecがApacheユーザーの代わりに 'you'としてスクリプトを実行する方法です。

したがって、Apacheは正しいサーバーエラーを提供します。PHPモジュールがロードされていない限り、php_flagの意味を認識しません。CGIバイナリはApacheに対して外部プログラムであり、 Apache内から構成しないでください。

良いニュースのために:ディレクトリごとの設定をセットアップして、そこに「php.ini」という名前のファイルを置き、そこに同じものを使用して指示を設定することができますシステムのメインphp.iniのような構文。 PHPマニュアル は、設定可能なすべてのディレクティブをリストします。PHP_INI_PERDIRまたはPHP_INI_ALLでマークされたディレクティブを設定できますが、サーバー全体のphp.iniでPHP_INI_SYSTEMでマークされたディレクティブを設定できるのはシステム管理者だけです。

このようなphp.iniディレクティブはサブディレクトリに継承されないため、独自のphp.iniを指定する必要があります。

10
djn

======================================= MY SOLUTION ========= ===================(php.iniの名前をphp5.iniに変更)

そして上部(!)にこれらを追加します:

_magic_quotes_gpc = Off
magic_quotes_runtime = Off
magic_quotes_sybase = Off
extension=pdo.so
extension=pdo_mysql.so
_

次に、.htaccessで、これを(上部に)追加します。

_SetEnv PHPRC /home/your_path/to/public_html/php5.ini
_

追伸_/home/your_path/to/_を正しく変更します(典型的な.phpファイルから<?php phpinfo(); ?>コマンドを実行すると、そのパスを確認できます。)

5
T.Todua

PHP 5.3+を実行している場合、これはトリックを実行します。ページの最上部に配置します。

if (get_magic_quotes_gpc() === 1)
{
    $_GET = json_decode(stripslashes(json_encode($_GET, JSON_HEX_APOS)), true);
    $_POST = json_decode(stripslashes(json_encode($_POST, JSON_HEX_APOS)), true);
    $_COOKIE = json_decode(stripslashes(json_encode($_COOKIE, JSON_HEX_APOS)), true);
    $_REQUEST = json_decode(stripslashes(json_encode($_REQUEST, JSON_HEX_APOS)), true);
}

キー、値、および多次元配列を処理します。

2
Alix Axel

ホスティングプロバイダーがcpanelを使用している場合、php.iniをWebディレクトリにコピーして、magic_quotes_gpc = offで編集できます。

1
Adnan Anwar

私はこれに答えるのが遅れていることを知っていますが、ほとんどの答えを読みましたが、多くは素晴らしいものでしたが、 djnは実際に説明しましたwhy この500 Internal Server Error

彼の説明は100%正確でしたが、これは<IfModule>でそれらを常にラップする必要がある理由の完璧な例です。これは、.htaccessでこれらのフラグを設定できないという実際の問題を解決することはできませんが、少なくとも500エラーを防止します

<IfModule mod_php5.c>
    # put all of your php_flags here, for example:
    php_flag magic_quotes_gpc off
</IfModule>

または、古いバージョンでは<IfModule mod_php.c>などになります。

そのような500エラーを避けるために、私は常にこれを行うことから習慣を作ろうとします。その後、適用します Peter Baileyが言ったこと

1
Yes Barry

BaileyPの答えはすでにかなり良いですが、代わりにこの条件を使用します。

if(function_exists('get_magic_quotes_gpc') && get_magic_quotes_gpc() === 1){
  $_POST = array_map( 'stripslashes', $_POST );
  $_GET = array_map( 'stripslashes', $_GET );
  $_COOKIE = array_map( 'stripslashes', $_COOKIE );
}

より防御的です。

0
middus

$_SERVER

if (get_magic_quotes_gpc() === 1) {

    $_GET = json_decode(stripslashes(json_encode($_GET, JSON_HEX_APOS)), true);
    $_POST = json_decode(stripslashes(json_encode($_POST, JSON_HEX_APOS)), true);
    $_COOKIE = json_decode(stripslashes(json_encode($_COOKIE, JSON_HEX_APOS)), true);
    $_REQUEST = json_decode(stripslashes(json_encode($_REQUEST, JSON_HEX_APOS)), true); 
    $_SERVER = json_decode( stripslashes(json_encode($_SERVER,JSON_HEX_APOS)), true); 
}
0
ZoRNdYuKe

ホスティングプロバイダーごとにこれを行うための手順が異なるため、フォーラムで質問するか、サポートリクエストを提出します。

それらをオフにできない場合は、マジッククオートのオン/オフに関係なく入力をエスケープするこのようなものを常に使用できます。

//using mysqli

public function escapeString($stringToBeEscaped) {

    return $this->getConnection()->real_escape_string(stripslashes($stringToBeEscaped));
}
0
Philip Morton
  1. AddType行を削除しても機能しますか?なぜそれが魔法の引用符をオフにすることに関連するのか、私にはよくわかりません。

  2. PHPがmod_phpで実行されていない場合、htaccessは機能しません。CGIとして機能しますか?

これはあなたのホスティング会社のためのものです。

0
Philip Reynolds