カスタムビルドプラグインを持つ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;
}
私はこのフォーラムがプラグインをサポートしていないことを知っています、そして私は最初の開発者ではなく、問題を受け継いだだけなので、私は他の問題に取り組みたいと思います:
フォルダの名前を変更して上記のプラグインを削除すると、サイトに戻りますが、ダッシュボードのサイドバーナビゲーションのみが表示されます。それ以外は空白です。
プラグインをプラグインフォルダから削除せずに無効にする方法はありますか?空のダッシュボードの根本的な原因をトラブルシューティングするためのより良い方法はありますか?
ありがとうございます。
私の友人、それはひどく奇妙なプラグインです。
実際に開始する前に、この条件を破棄します-まったく何もしません:
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要求データで満たされる、自動的に入力されるスーパーグローバルです。そのため、 予約語 (より具体的には 事前定義変数 )と見なすことができます。 $_REQUEST
をgetApplications()
関数のパラメーターとして指定すると、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.php :define( 'WP_PLUGIN_DIR', 'thisPathDoesNotExist' );
で。この行を削除すると、プラグインのパスがデフォルト設定に戻ります。
Codexのエントリ WordPressでのデバッグ を参照してください。WordPressが提供するデバッグ機能の入門書と、デバッグを支援する優れたプラグインの短いリストを参照してください。最初のステップは、alwaysで、WP_DEBUG
のwp-config.php
定数を有効にします(可能な限り、実稼働環境でこれを行わないでください)。
define( 'WP_DEBUG', true );
WP_DEBUG
がfalse
(デフォルト)の場合、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;
}
最後の手段として、データベースからプラグインを無効にすることができます。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'の値を設定することによって、すべてのプラグインを無効にすることもできます。そうすれば、管理者インターフェースを使って必要なプラグインを有効にすることが簡単にできるはずです。