Heim > Fragen und Antworten > Hauptteil
Ich habe versucht, die Sicherheit meiner Wordpress-Seite zu verbessern, und habe dabei festgestellt, dass die WP-REST-API standardmäßig aktiviert ist (ab WP 4.4, wenn ich mich richtig erinnere).
Wie kann ich es sicher deaktivieren?
„Sicher“ bedeutet hier, dass es keine unbeabsichtigten Nebenwirkungen verursacht, z. B. dass keine anderen WP-Kernfunktionen beeinträchtigt werden.
Eine Möglichkeit besteht darin, .htaccess
zu verwenden, um die Regeln neu zu schreiben, aber überraschenderweise habe ich keine „offiziellen“ Anweisungen dafür gefunden.
Jede Hilfe oder jeder Rat ist sehr willkommen :)
Update: Plugins von Drittanbietern sind nicht die Lösung, nach der ich suche. Obwohl ich weiß, dass es viele Tools gibt, die diese Aufgabe lösen können, enthalten sie viele zusätzliche Funktionen, die die Website verlangsamen können. Ich hoffe, dass es für dieses Problem eine einzeilige Lösung ohne den zusätzlichen Aufwand eines Plugins gibt.
Update 2: Dies ist die offizielle Meinung von WordPress: https://developer.wordpress.org/rest-api/using-the-rest-api/frequently-asked-questions/#can-i-disable-the-rest-api p>
Demnach hofft das WordPress-Team, dass zukünftige WP-Funktionen auf der neuen REST-API basieren. Das bedeutet, dass es keine sichere Möglichkeit gibt, die REST-API zu deaktivieren.
Wir hoffen nur, dass es genügend Sicherheitsexperten gibt, die für die WP-Sicherheit verantwortlich sind.
Update 3:
Im WordPress-API-Handbuch ist eine Problemumgehung verfügbar: Sie können eine Authentifizierung für alle Anfragen verlangen
Dadurch wird sichergestellt, dass der anonyme Zugriff auf die REST-API der Website deaktiviert ist und nur authentifizierte Anfragen gültig sind.
P粉4784456712024-01-11 15:20:53
接受的答案会禁用未经身份验证的用户的所有 API 调用,但现在很多插件都依赖于此 API 的功能。
禁用所有调用将导致意外的网站行为,在我使用此代码时也发生过这种情况。
例如,ContactForm7 使用此 API 将联系信息发送到数据库(我认为)并进行 ReCaptcha 验证。
我认为最好为未经身份验证的用户禁用某些(默认)端点,如下所示:
// Disable some endpoints for unauthenticated users add_filter( 'rest_endpoints', 'disable_default_endpoints' ); function disable_default_endpoints( $endpoints ) { $endpoints_to_remove = array( '/oembed/1.0', '/wp/v2', '/wp/v2/media', '/wp/v2/types', '/wp/v2/statuses', '/wp/v2/taxonomies', '/wp/v2/tags', '/wp/v2/users', '/wp/v2/comments', '/wp/v2/settings', '/wp/v2/themes', '/wp/v2/blocks', '/wp/v2/oembed', '/wp/v2/posts', '/wp/v2/pages', '/wp/v2/block-renderer', '/wp/v2/search', '/wp/v2/categories' ); if ( ! is_user_logged_in() ) { foreach ( $endpoints_to_remove as $rem_endpoint ) { // $base_endpoint = "/wp/v2/{$rem_endpoint}"; foreach ( $endpoints as $maybe_endpoint => $object ) { if ( stripos( $maybe_endpoint, $rem_endpoint ) !== false ) { unset( $endpoints[ $maybe_endpoint ] ); } } } } return $endpoints; }
这样,现在打开的唯一端点是由插件安装的端点。
有关您网站上活动的端点的完整列表,请参阅https://YOURSITE.com/wp-json/
您可以根据您的要求随意编辑 $endpoints_to_remove
数组。
如果您有自定义帖子类型,请确保将它们全部添加到列表中。
就我而言,我还将默认端点前缀从 wp-json
更改为 mybrand-api
。这应该对发出数千个暴力请求的机器人起到威慑作用。
这是我所做的:
// Custom rest api prefix (Make sure to go to Dashboard > Settings > Permalinks and press Save button to flush/rewrite url cache ) add_filter( 'rest_url_prefix', 'rest_api_url_prefix' ); function rest_api_url_prefix() { return 'mybrand-api'; }
P粉5123632332024-01-11 12:47:36
根据作者最初的问题,我选择了来自 WordPress 官方建议的选项 2(https://developer.wordpress.org/rest-api/using-the-rest-api/frequently-asked-questions /#can-i-disable-the-rest-api)。因此,只需放入你的functions.php,只让登录的用户使用其余的API(但只需交叉检查原始链接,以防我的代码块过时;)): 更新(2021年10月1日):
add_filter( 'rest_authentication_errors', function( $result ) { // If a previous authentication check was applied, // pass that result along without modification. if ( true === $result || is_wp_error( $result ) ) { return $result; } // No authentication has been performed yet. // Return an error if user is not logged in. if ( ! is_user_logged_in() ) { return new WP_Error( 'rest_not_logged_in', __( 'You are not currently logged in.' ), array( 'status' => 401 ) ); } // Our custom authentication check should have no effect // on logged-in requests return $result; });