41

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')たが効果がありませんでした。

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

4

13 に答える 13

41

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

-

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

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

編集

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

これが意味することは、これを行うには.htaccessファイルを使用する必要があるということです-または-魔法の引用符の効果を逆転させるスクリプトを実装します。このようなもの

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 );
}
于 2009-02-05T17:54:04.667 に答える
30

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

更新: 今日、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);
}
?>
于 2009-02-06T13:34:21.477 に答える
20

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

htaccess ファイルを使用してマジック クォートをオフにできない場合 (Pete Bailey によって既に与えられた理由により)、次のようにします。

  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時間を誰かが節約できることを願っています!

于 2012-05-10T12:27:04.303 に答える
10

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

したがって、Apache は正しく、サーバー エラーが発生します。PHP モジュールが読み込まれない限り、Apache は 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 を指定する必要があります。

于 2009-02-07T01:24:40.437 に答える
2

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);
}

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

于 2010-01-17T02:50:24.130 に答える
1

私はこれに答えるのが遅れていることを知っていますが、私はほとんどの回答を読みまし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 エラーを回避するために、常にこれを行うことを習慣にしようとしています。後は、ピーター・ベイリーが言ったことを適用するだけです。

于 2012-11-19T04:57:21.970 に答える
1

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

于 2011-07-25T12:07:26.740 に答える
0

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

それらをオフにできない場合は、魔法の引用符がオンかオフかに関係なく、入力をエスケープする次のようなものを常に使用できます。

//using mysqli

public function escapeString($stringToBeEscaped) {

    return $this->getConnection()->real_escape_string(stripslashes($stringToBeEscaped));
}
于 2009-02-05T17:52:58.960 に答える
0
  1. AddType行を削除しても機能しますか?なぜそれが魔法の引用符をオフにすることに関連しているのかよくわかりません。

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

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

于 2009-02-05T17:54:01.797 に答える
0

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 );
}

それはより防御的です。

于 2009-02-06T13:06:23.170 に答える
0

どう$_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); 
}
于 2011-04-05T12:57:43.650 に答える
-1

オフにできない場合は、次のようにします。

get_magic_quotes_gpc() ? $_POST['username'] : mysql_real_escape_string($_POST['username']);

適切な形式でデータベースに配置されます。

于 2009-02-05T18:28:40.057 に答える