web-dev-qa-db-ja.com

アップグレード後にダッシュボードが消える

カスタムビルドプラグインを持つWPおよびMySQLの1つのサイトへの最近のアップグレードに続いて致命的エラーが発生します。

致命的なエラー:549行目の/home/mysitexyz/public_html/wp-content/plugins/employment_application/employment_application.phpで自動グローバル変数_REQUESTを再割り当てできません

これが問題のコードです。

function getApplications($_REQUEST) {
    global $wpdb;
    $sql = "SELECT * FROM employment_applications";
    if($_REQUEST['s'] != '') {

    }
    $sql .= " WHERE applicant_name LIKE '%" . $_REQUEST['s']  . "%'";
//echo "SQL: $sql<BR>"; 
    $applications = $wpdb->get_results($sql);
    $wpdb->show_errors();
    //$errors = $wpdb->print_error();
    $error = $wpdb->last_error;     
    if($error != '') {
        echo '<div class="alert alert-error">' . $error . '</div>';
    }
    //print_r($applications);
    return $applications;
}

私はこのフォーラムがプラグインをサポートしていないことを知っています、そして私は最初の開発者ではなく、問題を受け継いだだけなので、私は他の問題に取り組みたいと思います:

フォルダの名前を変更して上記のプラグインを削除すると、サイトに戻りますが、ダッシュボードのサイドバーナビゲーションのみが表示されます。それ以外は空白です。

enter image description here

プラグインをプラグインフォルダから削除せずに無効にする方法はありますか?空のダッシュボードの根本的な原因をトラブルシューティングするためのより良い方法はありますか?

ありがとうございます。

2
fmz

私の友人、それはひどく奇妙なプラグインです。


プロローグ

実際に開始する前に、この条件を破棄します-まったく何もしません:

if($_REQUEST['s'] != '') {

}

しかし、実際には、おそらく、元のプラグイン開発者は、$_REQUEST['s']が設定されていない場合に関数から抜け出すことで、この条件式が実際にsomethingを行うことを意図していました(これを参照)そのような場合、関数はほとんど何もしません):

function getApplications( $_REQUEST ) {
    if( empty( $_REQUEST['s'] ) ) {
        return false;
    }

    global $wpdb;
    $sql = "SELECT * FROM employment_applications";

    ...

    return $applications;
}

致命的なエラー

まず、致命的なエラー。 PHP内の$_REQUESTは、PHPがHTTP要求データで満たされる、自動的に入力されるスーパーグローバルです。そのため、 予約語 (より具体的には 事前定義変数 )と見なすことができます。 $_REQUESTgetApplications()関数のパラメーターとして指定すると、PHPに最初の引数を$_REQUESTとして参照するように指示されますが、スーパーグローバルはPHP5でローカルにスコープできません。 PHPは、コードをスーパーグローバル、つまりエラーの再割り当てを試みていると解釈します(これが変更された特定のバージョンはわかりませんが、PHP4でパラメーターとしてスーパーグローバルを使用できました) 。

getApplications()関数がwithargumentsで呼び出される場合、パラメータの名前を適切なフローを維持し、$_REQUESTスーパーグローバルの再割り当てを避けます。

function getApplications( $request ) {
    if( empty( $request['s'] ) )
        return false;

    global $wpdb;
    $sql = "SELECT * FROM employment_applications";
    $sql .= " WHERE applicant_name LIKE '%" . $request['s']  . "%'";

    $applications = $wpdb->get_results( $sql );
    $wpdb->show_errors();
    $error = $wpdb->last_error;

    if($error != '') {
        echo '<div class="alert alert-error">' . $error . '</div>';
    }

    return $applications;
}

getApplications()関数がwithout引数を呼び出した場合(orは常に$_REQUESTを引数として、つまりgetApplications( $_REQUEST )、パラメーターを完全に削除し、$_REQUESTスーパーグローバルを直接使用します。

function getApplications() {
    if( empty( $_REQUEST['s'] ) )
        return false;

    global $wpdb;
    $sql = "SELECT * FROM employment_applications";
    $sql .= " WHERE applicant_name LIKE '%" . $_REQUEST['s']  . "%'";

    $applications = $wpdb->get_results( $sql );
    $wpdb->show_errors();
    $error = $wpdb->last_error;

    if($error != '') {
        echo '<div class="alert alert-error">' . $error . '</div>';
    }

    return $applications;
}

おそらく、ソリューションは2つのうちの後者になります。


ダッシュボード外のプラグインを無効にする

これについてはさまざまな方法がありますが、最も一般的なものをいくつか次に示します。

  • active_pluginsオプションの変更(永続)

    • データベース:

      PHPMyAdminまたは生のSQLを使用して、wp_optionsテーブル内でoption_nameフィールドがactive_pluginsフィールドである行を見つけ、option_valueフィールドを変更します。 これはシリアル化された値です ですので、手動でシリアル化されたデータに変更を加える方法がわからない場合は、値を非シリアル化し、変更を加えてから再シリアル化する必要がありますそれをフィールドに戻します。または、option_valueのコンテンツを削除すると、すべてのプラグインが無効になります(ただし、プラグインの実装によっては、非アクティブ化フックが起動しない場合があります)。

      または、 シリアル化対応の検索および置換ツール を使用できます。

    • PHP:

      deactivate_plugins()関数 または オプションAPI必須プラグイン で使用します。使用する必要のあるプラグインは常に「アクティブ」と見なされ、他のすべてのプラグインの前にロードされます。これにより、サイトの大部分にアクセスできない場合でもコードを実行するための便利なエントリポイントが提供されます。

  • active_pluginsを無効にします(「取り消し可能」)

    これは、本質的に(ルート)プラグインフォルダーの名前を変更するのと同じトリックです。 active_pluginsで、WordPressは、プラグインルートに対する各プラグインのプライマリファイルの場所を記録します( 定数WP_PLUGIN_DIR )。 WP_PLUGIN_DIRを変更することで、WordPressにプラグインの追跡を強制的に強制し、プラグインのロードに失敗させ、プラグインが存在しないかのようにリクエストを効果的に処理し、active_pluginsオプションをそのまま残すことができますデータベース内。 wp-config.phpdefine( 'WP_PLUGIN_DIR', 'thisPathDoesNotExist' );で。この行を削除すると、プラグインのパスがデフォルト設定に戻ります。


「トラブルシューティングのより良い方法」

Codexのエントリ WordPressでのデバッグ を参照してください。WordPressが提供するデバッグ機能の入門書と、デバッグを支援する優れたプラグインの短いリストを参照してください。最初のステップは、alwaysで、WP_DEBUGwp-config.php定数を有効にします(可能な限り、実稼働環境でこれを行わないでください)。

define( 'WP_DEBUG', true );

WP_DEBUGfalse(デフォルト)の場合、WordPressは、大部分の警告とエラーを抑制します。

また、開発マシンで Xdebug を使用して、非常に便利なスタックトレース、フォーマットされたvar_dump()s、リモートデバッグ、きれいな色(特に)にすばやくアクセスすることを強くお勧めします。


セキュリティに関する注意

ここでこの行を調べてみましょう。

$sql .= " WHERE applicant_name LIKE '%" . $_REQUEST['s']  . "%'";

$_REQUESTはHTTPリクエストデータで満たされているため、この行は、リクエストからデータキーsを直接取得し、それをSQLクエリにドロップしています。 これは重大なセキュリティホールであり、サイトをSQLインジェクションにさらす可能性がありますgetApplications()関数の実行をもたらすサイトの任意の部分にアクセスできる人は、単に?s=whateverをURLに追加して独自のクエリを実行できます設計。適切なエスケープがないことは、攻撃者がこのクエリを使用してemployment_applicationsテーブルの外部のデータにアクセスする可能性さえあることを意味します。

抽象化および/または検証されていない場合、ユーザーから提供されたすべてのデータは、少なくとも次のようにエスケープする必要があります。

$sql = "SELECT * FROM employment_applications";
$sql .= " WHERE applicant_name LIKE '%" . esc_sql( like_escape( $_REQUEST['s'] ) ) . "%'";
$applications = $wpdb->get_results( $sql );

または

$querystring = "SELECT * FROM employment_applications WHERE applicant_name LIKE '%%%s%%'";
$applications = $wpdb->get_results( $wpdb->prepare( $querystring, $_REQUEST['s'] ) );

Data Validation および SQLインジェクション攻撃に対するクエリの保護 のCodexエントリに、WordPressのデータセキュリティの簡単な紹介を参照する必要があります。


エピローグ

上記のすべてを考慮して、変更されたコードは次のようになるはずです。

function getApplications() {
    if( empty( $_REQUEST['s'] ) )
        return false;

    global $wpdb;
    $querystring = "SELECT * FROM employment_applications WHERE applicant_name LIKE '%%%s%%'";
    $applications = $wpdb->get_results( $wpdb->prepare( $querystring, $_REQUEST['s'] ) );
    $wpdb->show_errors();
    $error = $wpdb->last_error;

    if( ! empty( $error ) ) {
        echo '<div class="alert alert-error">' . $error . '</div>';
    }

    return $applications;
}
1
bosco

最後の手段として、データベースからプラグインを無効にすることができます。MySQLに慣れている場合に役立つ記事へのリンクです。

http://perishablepress.com/quickly-disable-or-enable-all-wordpress-plugins-via-the-database/

MySQLに慣れていないのであれば、OS Xには Sequel Proなどのツールを使用することをお勧めします。 wp_optionsテーブル内の 'active_plugins'フィールドを探すためのPHPMyAdmin 。直列化されたオブジェクトの中のどこかにあなたのプラグインがあるでしょう、ただそれとそのインデックス( "i":4の前の部分)を削除して保存してください。

空の文字列( '')で 'active_plugins'の値を設定することによって、すべてのプラグインを無効にすることもできます。そうすれば、管理者インターフェースを使って必要なプラグインを有効にすることが簡単にできるはずです。

1
macguru2000