XML-RPC là gì? Tại sao hạn chế sử dụng giao thức XML-RPC?

 

XML-RPC là gì?

XML-RPC là sử dụng giao thức WebService (soap) dùng XML để mã hóa và trao đổi dữ liệu (Remote Procedure Call XML) và có thể hỗ trợ các API của các CMS như WordPress APIBlogger APIMovable APIPingback API, MetaWeblog API,… Vậy ứng dụng của XMLRPC là gì?

XMLRPC là gì? XMLRPC.PHP Là một tính năng quan trọng trong WordPress, có chức năng kích hoạt quá trình chỉnh sửa nội dung từ xa
XMLRPC.PHP là một tính năng quan trọng trong WordPress, có chức năng kích hoạt quá trình chỉnh sửa nội dung từ xa

Vì WordPress không phải là hệ thống đóng hoàn toàn nên tính năng này được tạo ra để khi WordPress cần giao tiếp với các hệ thống bên ngoài. Ví dụ, khi người dùng muốn chỉnh sửa hoặc đăng tải một bài viết lên WordPress không bằng máy tính mà thông qua điện thoại. Khi đó, XMLRPC.PHP sẽ kích hoạt trạng thái liên kết giữa máy tính và điện thoại, cho phép người dùng thực hiện các chỉnh sửa.

Trong trường hợp bạn chưa hiểu rõ về WordPressMắt Bão mời bạn tham khảo bài viết: “WordPress là gì?“.

Lý do XMLRPC từng thông dụng là gì?

XMLRPC là gì? XMLRPC.PHP trước đây được sử dụng tương đối phổ biến trong việc truy cập và chỉnh sửa nội dung trang web
XMLRPC.PHP trước đây được sử dụng tương đối phổ biến trong việc truy cập và chỉnh sửa nội dung trang web

Trong những năm về trước, XMLRPC.PHP là một hệ thống được sử dụng tương đối phổ biến vì những tính năng đặc biệt của nó. Trong đó, nổi bật nhất là khả năng truy cập và chỉnh sửa nội dung trên WordPress mà không cần phải kết nối internet vì trước đây internet chưa phát triển như bây giờ nên việc truy cập mạng thường không mượt và mất nhiều thời gian.

Theo đó, tính năng của hệ thống này là tạo nên một trang web offline được kết nối với trang web chính. Khi người dùng chỉnh sửa và đăng tải nội dung xong, chỉ cần kích hoạt XMLRPC.PHP, bài viết sẽ được đăng tải lên web.

Tuy nhiên, trong tình hình hiện nay, với sự ra đời của những ứng dụng cho phép người dùng truy cập trang web bằng điện thoại ra đời cùng mạng lưới internet phát triển vượt trội, XMLRPC.PHP đã mất đi vị trí độc tôn và không còn được sử dụng phổ biến như trước nữa.

Ứng dụng của XMLRPC là gì?

xmlrpc là gì? XML-RPC bao gồm có 2 phần chính: XMLRPC server và XMLRPC client
XML-RPC bao gồm có 2 phần chính: XMLRPC server và XMLRPC client

Trong WordPress, XMLRPC gồm có 2 phần chính: XMLRPC server và XMLRPC client:

  • XMLRPC server là một web server, có chức năng nhận thông tin đã được mã hoá từ XMLRPC client.
  • XMLRPC client: là hệ thống sử dụng XML để mã hóa tham số, và gửi nội dung XML đã được mã hoá đó vào XMLRPC server.

Cách kích hoạt XMLRPC trong WordPress

XMLRPC là gì? Quá trình kích hoạt XMLRPC tương đối đơn giản
Quá trình kích hoạt XMLRPC tương đối đơn giản

Để kích hoạt XMLRPC trong WordPress, cần thực hiện 3 bước như sau:

  • Bước 1: Cài plugin “Control XMLRPC publishing
  • Bước 2:  Trên WordPress, chọn Settings ->Write -> Remote publishing with XMLRPC -> Enabled
  • Bước 3: Nhấn Save changes để lưu thay đổi. Vậy là XMLRPC đã được kích hoạt.

WordPress XMLRPC Server

XMLRPC server là một web server, có chức năng nhận thông tin đã được mã hoá
XMLRPC server là một web server, có chức năng nhận thông tin đã được mã hoá
  • Đăng ký hàm XMLRPC mới: Để tạo một hàm  XMLRPC mới, cần thực hiện các bước như sau:
add_filter( 'xmlrpc_methods', 'add_xml_rpc_methods' );
function add_xml_rpc_methods( $methods ) {
$methods['frs.helloWorld'] = 'hello_world'; //Where frs.helloWorld is the XML-RPC method name, and hello_world is the callback, namespace 'frs' for any you want.
return $methods;
}

Ở ví dụ trên, chúng ta đăng ký hàm helloWorld thuộc namespace mới frs, và khai báo lời gọi hàm callback hello_worldcho  hàm helloWorld.

Phần định nghĩa hàm callback. Xem ví dụ mẫu:

function hello_world($params){
global $wp_xmlrpc_server;
$arg1 = $params[1];
return "Hello ".$wp_xmlrpc_server->escape( $arg1 );
}

*Chú ý: Hàm cần trả về giá trị, giá trị này sẽ được lấy khi gọi hàm. Không sử dụng echo,print để xuất chuỗi ra màn hình.

  • Xóa hàm RPC: Phương pháp xóa hàm RPC cũng tương tự như đăng ký hàm:

Tương tự như cách tạo hàm, sử dụng xmlrpc_methods để xóa các hàm không mong muốn. Thêm vào functions.php

function mynamespace_remove_xmlrpc_methods( $methods ) {
unset( $methods['demo.addTwoNumbers'] );
unset( $methods['frs.helloWorld'] );
return $methods;
}
add_filter( 'xmlrpc_methods', 'mynamespace_remove_xmlrpc_methods');

XMLRPC Client

Chức năng của XMLRPC Client là truyền thông tin đã được mã hoá đến XMLRPC Server
Chức năng của XMLRPC Client là truyền thông tin đã được mã hoá đến XMLRPC Server

Tạo lớp xử lý gọi hàm từ XMLRPC Server

  • Bước 1: Kết nối với XMLRPC Server
  • Bước 2: Tạo lớp XMLRPC_Client với nội dung có sẵn
/*create XML-RPC PHP client*/
class XMLRPC_Client {
 
  private $url;
 
  function __construct( $url ) {
    $this->url = $url;
  }
 
  /**
   * Call the XML-RPC method named $method and return the results, or die trying!
   *
   * @param string $method XML-RPC method name
   * @param mixed ... optional variable list of parameters to pass to XML-RPC call
   *
   * @return array result of XML-RPC call
   */
  public function call() {
 
    // get arguments
    $params = func_get_args();
    $method = array_shift( $params );
 
    $post = xmlrpc_encode_request( $method, $params );
 
    $ch = curl_init();
 
    // set URL and other appropriate options
    curl_setopt( $ch, CURLOPT_URL,            $this->url );
    curl_setopt( $ch, CURLOPT_POST,           true );
    curl_setopt( $ch, CURLOPT_POSTFIELDS,     $post );
    curl_setopt( $ch, CURLOPT_RETURNTRANSFER, true );
 
    // issue the request
    $response = curl_exec( $ch );
    $response_code = curl_getinfo( $ch, CURLINFO_HTTP_CODE );
    $curl_errorno = curl_errno( $ch );
    $curl_error   = curl_error( $ch );
    curl_close( $ch );
 
    // check for curl errors
    if ( $curl_errorno != 0 ) {
      die( "Curl ERROR: {$curl_errorno} - {$curl_error}n" );
    }
 
    // check for server errors
    if ( $response_code != 200 ) {
      die( "ERROR: non-200 response from server: {$response_code} - {$response}n" );
    }
 
    return xmlrpc_decode( $response );
  }
}

Gọi hàm RPC

  • Bước 1: Kết nối tới XMLRPC Server
  • Bước 2: Truy cập XMLRPC_Client
  • Bước 3: Tạo instance trên XMLRPC_Client
  • Bước 4: Dùng hàm “//call method ” để tiến hành gọi hàm
//call method
$client = new XMLRPC_Client( "http://127.0.0.1:81/wordpress/xmlrpc.php" );
$available_methods = $client->call( 'system.listMethods' );
print_r( $available_methods );

Lợi ích của XMLRPC là bạn có thể gọi nhiều hàm trên một kết nối XMPRPC, như ở đây chúng ta có thể gọi tiếp hàm demo.sayHello .

$test= $client->call( 'demo.sayHello' );
print_r($test);

Tại sao không nên sử dụng XMLRPC?

Bởi xuất hiện nhiều hạn chế mà ngày nay XMLRPC không được khuyến khích sử dụng trên WordPress
Bởi xuất hiện nhiều hạn chế mà ngày nay XMLRPC không được khuyến khích sử dụng trên WordPress

Trước đây, XMLRPC được sử dụng phổ biến. Nhưng ngày nay, hệ thống này dần xuất hiện những hạn chế, cùng với đó là sự xuất hiện của những phần mềm mới, mà XMLRPC không còn được khuyến khích sử dụng. Trong đó, có 2 nguyên nhân chính mà chúng ta không nên sử dụng XMLRPC:

Khả năng bảo mật kém

Việc kích hoạt XMLRPC sẽ khiến trang web dễ dàng bị hacker xâm nhập
Việc kích hoạt XMLRPC sẽ khiến trang web dễ dàng bị hacker xâm nhập

Khuyết điểm lớn nhất của XMLRPC là độ bảo mật kém. Dẫn đến việc các hacker có thể tấn công trang web dễ dàng. Bằng việc sử dụng file xmlrpc.php, hệ thống tin tặc có thể dùng nhiều phương pháp khác nhau để có được mật khẩu truy cập trang web. Thậm chí, với hệ thống này, quá trình tấn công DdoS được thực hiện tương đối thường xuyên, khiến trang web hay bị down.

Vì thế khi sử dụng WordPress, nhiều người dùng thường vô hiệu hoá chức năng này để tránh tình trạng bị hacker xâm nhập thông qua XMLRPC.

Phần mềm khắc phục nhược điểm của XMLRPC là gì?

XMLRPC là gì? Sự ra đời của WordPress API đã khắc phục được những hạn chế của XMLRPC
Sự ra đời của WordPress API đã khắc phục được những hạn chế của XMLRPC

Hiện nay, WordPress API đang trong giai đoạn thử nghiệm. Và hệ thống API cũng có chức năng tương tự như XMLRPC, được hình thành thông qua việc code trực tiếp vào trong WordPress core.

Sự xuất hiện của API dự đoán sẽ hoàn toàn thay thế cho XMLRPC trong tương lai bởi tính năng bảo mật tốt cũng như khắc phục được mọi hạn chế mà XMLRPC đang mắc phải.

Cách biết XMLRPC.PHP đang bị tấn công là gì?

Việc kích hoạt XMLRPC sẽ khiến trang web của bạn dễ dàng bị tấn công hơn
Việc kích hoạt XMLRPC sẽ khiến trang web của bạn dễ dàng bị tấn công hơn

Để nhận biết website của bạn đang bị tấn công, cách đơn giản nhất chính là kiểm tra tệp tin access_log. Nếu phát hiện số lượng người truy cập tăng lên một cách đột biến thì đây chính là dấu hiệu cho việc trang web của bạn đang bị tấn công qua XMLRPC.

Ví dụ như:

xxx.xxx.xxx.xxx - - [15/Sep/2016:12:54:49 +0700] "POST /xmlrpc.php HTTP/1.1" 200 0 "-" "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.6) Gecko/20070725 Firefox/2.0.0.6"
xxx.xxx.xxx.xxx - - [15/Sep/2016:12:54:50 +0700] "POST /xmlrpc.php HTTP/1.1" 200 0 "-" "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.6) Gecko/20070725 Firefox/2.0.0.6"
xxx.xxx.xxx.xxx - - [15/Sep/2016:12:54:50 +0700] "POST /xmlrpc.php HTTP/1.1" 200 0 "-" "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.6) Gecko/20070725 Firefox/2.0.0.6"
xxx.xxx.xxx.xxx - - [15/Sep/2016:12:54:51 +0700] "POST /xmlrpc.php HTTP/1.1" 200 0 "-" "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.6) Gecko/20070725 Firefox/2.0.0.6"
xxx.xxx.xxx.xxx - - [15/Sep/2016:12:54:51 +0700] "POST /xmlrpc.php HTTP/1.1" 200 0 "-" "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.6) Gecko/20070725 Firefox/2.0.0.6"
xxx.xxx.xxx.xxx - - [15/Sep/2016:12:54:52 +0700] "POST /xmlrpc.php HTTP/1.1" 200 0 "-" "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8

Để giải quyết tình trạng này, một phương pháp hữu hiệu nhất chính là vô hiệu hóa XMLRPC đi. Vì khi cài đặt WordPressXMLRPC đã được cài đặt sẵn nên người dùng cần thực hiện một vài thao tác để tắt nó đi. Trên thực tế, có rất nhiều cách để tiến hành vô hiệu hóa giao thức này.

Cách vô hiệu XMLRPC

Có nhiều phương pháp khác nhau để vô hiệu hoá XMLRPC 
Có nhiều phương pháp khác nhau để vô hiệu hoá XMLRPC

Cách 1: Vô hiệu XMLRPC.PHP bằng Plugins

  • Bước 1: Truy cập WordPress dashboard 
  • Bước 2: Di chuyển đến mục Plugins -› Add New Disable XMLRPC -› plugin Disable XMLRPC
  • Bước 3: Kích hoạt plugin Disable XMLRPC để vô hiệu hoá XMLRPC
XMLRPC là gì? Tìm plugin Disable XML-RPC và cài đặt plugin như hình.
Tìm plugin Disable XML-RPC và cài đặt plugin như hình.

Tuy nhiên, một vấn đề có thể xảy ra khi tiến hành vô hiệu hoá XMLRPC bằng phương pháp này đó là khi xảy ra trường hợp những plugin khác cũng đang dùng một yếu tố của XMLRPC. Vì vậy, việc vô hiệu hóa plugin có thể sẽ khiến trang web của bạn ngừng hoạt động.

Để giải quyết tình trạng này, bạn có thể sử dụng phương pháp sau:

Cách 2: Sửa .htaccess

  • Bước 1: Truy cập tập tin .htaccess ở thư mục gốc của trang web (Trong trường hợp máy tính mua Web Hosting hoặc thuê máy chủ có cài đặt Apache)
  • Bước 2: Chèn đoạn code sau vào tệp tin:
# DISABLE XML RPC

<Files xmlrpc.php>

Order Deny,Allow

Deny from all

</Files>

#END

Cách 3: Trên NGINX

Trường hợp chưa biết về NGINX, bạn có thể tham khảo thêm bài viết: “NGINX là gì?

NGINX là một phần mềm web server mã nguồn mở, sử dụng kiến trúc hướng sự kiện (event-driven) không đồng bộ (asynchronous). Mục tiêu ban đầu để phục vụ HTTP cache nhưng sau được áp dụng vào reverse proxyHTTP load balancer và các giao thức truyền mail như IMAP4, POP3, và SMTP.

  • Bước 1: Truy cập tập tin cấu hình domain trên NGINX
  • Bước 2: Chèn đoạn code sau vào tệp tin trên:
location = /xmlrpc.php {

deny all;

access_log off;

log_not_found off;

}
  • Bước 3: Chọn service nginx restart  để khởi động lại NGINX

Khi thực hiện các dịch vụ thông qua kết nối internet, bảo mật chính là vấn đề quan trọng nhất. Vì vậy, sự bảo mật kém chính là hạn chế lớn nhất của XMLRPC. Người dùng WordPress cần lưu ý nên cài chế độ bảo mật tuyệt đối cũng như vô hiệu hóa XMLRPC khi không cần thiết để tránh tình trạng bị đánh cắp thông tin dữ liệu trên trang web.

Post a Comment

Mới hơn Cũ hơn