There is a plugin out there that does exactly this, including 4.7+:
https://ww.wp.xz.cn/plugins/disable-json-api/
** As of WordPress 4.7, the filter provided for disabling the REST API has been removed. However, this plugin will now forcibly return an authentication error to any API requests from sources who are not logged into your website, which will effectively still prevent unauthorized requests from using the REST API to get information from your website **
Is this a viable solution for you, or do you require further assistance?
Thread Starter
bnishi
(@bobbynishi)
Not quite. This doesn’t allow you to select roles/permission for which user can see the REST API scheme when logged in. So even “customer” and “subscribers” can see the JSON scheme.
For other web services this client has, they lock down web services (other REST APIs from other stacks) by IP (server to server) and by basic auth (client to server) or with Oauth 2 (SPA client App to server). I need to keep this implementation as uniform to their ecosystem as possible, using best practices, regardless of stack.
Also, exposing user information (“/wp-json/wp/v2/users”) by default on all WP websites through the REST API is a big no-no. A while back, there was an user exploit dictionary attack that started with pinging WordPress sites with the query ?author=1 or ?author=2, which are very often admins. Once the bots has a handful of low-id usernames to try against, they would hit the site a couple of dozen times a day for months. Often unnoticed, until they were in. Then via plugin or SQL injection, create a full admin user (if theirs wasn’t already). Finally they would add SEO malware to all the pages and create new views.
I can look at what this plugin is doing and write something to match our requirements, but security and authentication levels for this core REST api has lots of room for improvement.
Thread Starter
bnishi
(@bobbynishi)
Looking at the plugin and core, I was able to find a filter I can use. These seem to work for my purposes:
add_filter( 'rest_authentication_errors', array ( $this, 'authenticateServiceAccess') );
or
add_filter( 'rest_send_nocache_headers', array ( $this, 'authenticateServiceAccess') );
-
This reply was modified 9 years, 4 months ago by
bnishi.