禁用 WordPress 的 JSON REST API 功能代码增安全

目前网络上个人博客、企业网站和小型商务网站都可以使用 WordPress建站,因为其官方的更新及时、第三方的插件和主题丰富,让这个程序功能变得越来越丰富多样,但是随着不断的升级更新功能,同时也会增加程序的负担和不安全因素。

wordpress禁用REST API

例如 WordPress 从 4.4 版本开始新增的 JSON REST API 功能,通过这个 REST API 可以很轻松的获取网站的数据,其本身可应用于其他网站、手机 APP 或小程序等;但对于一般的网站是没有这个需要的,反而会拖累网站的速度。

重要的是 REST API 采用 GET 请求方式,这就为 DDOS 攻击提供了一个新的攻击途径,所以我们应尽可能的禁用REST API这些不必要的功能需求,并且去掉 head 里面输出 wp-json 链接。重视 WordPress安全也是很有必要。

WordPress系统是默认开放 REST API,也就是说,除了以 HTML格式输出内容,还可以以 JSON格式输出文章/用户/评论等数据。如果你已经部署好 WordPress,就可以通过对应的链接得到 JSON格式的数据。

链接格式示例:

  • 文章列表 你的域名/wp-json/wp/v2/posts
  • 页面列表 你的域名/wp-json/wp/v2/pages
  • 用户列表 你的域名/wp-json/wp/v2/users

由此可见,如果网站想为其他设备提供数据接口服务,就可以直接使用,没有开发成本。但如果你的网站没有这个需求就会增加不必要的安全隐患了。

如果不想自己的网站开放 REST API,则可以通过安装插件 Disable REST API 或 Disable WP REST API来禁用这个功能。安装启用后,除了已经登陆的管理员,其他用户无权限访问数据。

还有就是用纯代码的方法,完全禁用 REST API 功能和移除 head 里面 wp-json 链接的办法。

直接将以下代码添加到主题的 functions.php 文件中即可禁用 JSON REST API :

  1. // 屏蔽 REST API
  2. if ( version_compare( get_bloginfo( 'version' ), '4.7', '>=' ) ) {
  3. function lxtx_disable_rest_api( $access ) {
  4. return new WP_Error( 'rest_api_cannot_acess', '无访问权限', array( 'status' => rest_authorization_required_code() ) );
  5. }
  6. add_filter( 'rest_authentication_errors', 'lxtx_disable_rest_api' );
  7. } else {
  8. // Filters for WP-API version 1.x
  9. add_filter( 'json_enabled', '__return_false' );
  10. add_filter( 'json_jsonp_enabled', '__return_false' );
  11. // Filters for WP-API version 2.x
  12. add_filter( 'rest_enabled', '__return_false' );
  13. add_filter( 'rest_jsonp_enabled', '__return_false' );
  14. }
  15. // 移除头部 wp-json 标签和 HTTP header 中的 link
  16. remove_action('template_redirect', 'rest_output_link_header', 11 );
  17. remove_action('wp_head', 'rest_output_link_wp_head', 10 );
  18. remove_action('xmlrpc_rsd_apis', 'rest_output_rsd');

这样在访问 wp-json 的链接时就会提示无权限了~

此外,对于 WP 4.7 以上版本,还有种通过 rest_api_init 这个钩子来禁用 REST API 的方法,大家也可以尝试并改造下。

  1. /*禁用未登录的用户*/
  2. add_filter( 'rest_api_init', 'lxtx_rest_only_for_authorized_users', 99 );
  3. function lxtx_rest_only_for_authorized_users($wp_rest_server){
  4. if ( !is_user_logged_in() ) {
  5. wp_die('非法操作!');
  6. }
  7. }

推荐还有另一种代码方法也可以:

  1. //完全禁用wp-json
  2. function disable_rest_api( $access ) {
  3. return new WP_Error( '无访问权限', 'Soooooryyyy', array(
  4. 'status' => 403
  5. ) );
  6. }
  7. add_filter( 'rest_authentication_errors', 'disable_rest_api' );
  8. //移除顶部wp-json禁用REST API
  9. add_filter('json_enabled', '__return_false' );
  10. add_filter('json_jsonp_enabled', '__return_false' );
  11. add_filter('rest_enabled', '__return_false');
  12. add_filter('rest_jsonp_enabled', '__return_false');
  13. remove_action( 'wp_head', 'rest_output_link_wp_head', 10 );
  14. remove_action('template_redirect', 'rest_output_link_header', 11 );

最后,如果你的网站不需要配合其他网站、手机 APP 或小程序等输出 JSON格式文章/用户/评论等数据,为了 wordpress安全最好还是禁用 JSON REST API 功能。

 

转载请注明链接地址:荐爱小站 » 禁用 WordPress 的 JSON REST API 功能代码增安全

赞 (1) 赏 !

觉得文章有用就打赏一下吧,赠人玫瑰手有余香!

支付宝扫一扫打赏

微信扫一扫打赏