Hướng dẫn why is php unsecured? - tại sao php không được bảo mật?

Bảo mật hệ thống là một vấn đề vô cùng quan trọng cần được lưu ý trong quá trình lập trình. Việc sử dụng các hàm không bảo mật có thể dẫn tới trang web dễ bị hack hơn, dữ liệu người dùng bị ảnh hưởng. Ở blog này, mình sẽ chỉ ra một số vấn đề thường gặp trong lập trình php và cách magento phòng tránh những vấn đề này khi sử dụng.

Magento là một nền tảng được xây dựng cho nhiều lập trình viên, chính vì vậy nó đã thiết kế nhiều hàm dựng sẵn đảm bảo tính bảo mật cho hệ thống. Chúng ta cần sử dụng qua bộ framework đó thay vì dùng các hàm php thuần. Điều đó sẽ giúp code chúng ta bảo mật hơn và tuân theo đúng chuẩn code của Magento.

Bài viết này mình sẽ chỉ ra một số các Best Practice về bảo mật đã được Magento khuyến cáo trên trang Devdocs của Magento. Đây là những hàm cơ bản mà mọi lập trình viên Magento 2 cần phải biết để code có thể bảo mật hơn và tránh những vấn đề không đáng có trong quá trình sử dụng website.

Tránh Sử dụng hàm serialize/unserialize

Chi tiết mọi người có thể xem ở:

https://owasp.org/www-community/vulnerabilities/PHP_Object_Injection

PHP Object Injection là một lỗ hổng bảo mật xảy ra khi đầu vào do người dùng cung cấp không được làm sạch đúng cách trước khi được chuyển đến hàm unserialize () trong PHP. Vì PHP cho phép serialize đối tượng, những kẻ tấn công có thể chuyển các chuỗi đặc biệt đến một lệnh gọi unserialize () dễ bị tấn công. là một lỗ hổng bảo mật xảy ra khi đầu vào do người dùng cung cấp không được làm sạch đúng cách trước khi được chuyển đến hàm unserialize () trong PHP. Vì PHP cho phép serialize đối tượng, những kẻ tấn công có thể chuyển các chuỗi đặc biệt đến một lệnh gọi unserialize () dễ bị tấn công.

Ví dụ dưới đây cho thấy một lớp PHP có phương thức __destruct có thể khai thác bằng lỗ hổng PHP Object InjectionPHP Object Injection

class Example1{   public $cache_file;
{
  public $cache_file;

  function __construct()   {      // some PHP code...   }
  {
     // some PHP code...
  }

  function __destruct()   {      $file = "/var/www/cache/tmp/{$this->cache_file}";      if (file_exists($file)) @unlink($file);   }}
  {
     $file = "/var/www/cache/tmp/{$this->cache_file}";
     if (file_exists($file)) @unlink($file);

  }
}

// some PHP code...$user_data = unserialize($_GET['data']);// some PHP code...
$user_data = unserialize($_GET['data']);
// some PHP code...

Trong ví dụ này, kẻ tấn công có thể xóa một tệp tùy ý thông qua tấn côn, ví dụ: yêu cầu URL sau:

http://testsite.com/vuln.php?data=O:8:"Example1":1:{s:10:"cache_file";s:15:"../../index.php";}

Khi sử dụng hàm unserialize, do data truyền vào có chứa đoạn giá trị đã serialize của object Example1, => khi unserialize, hàm __destruct() của class Example1 được gọi, giá trị cache_file = ../../index.php

Việc này dẫn tới logic trong hàm _destruct sẽ tiến hành unlink và xóa file này ra khỏi code.

Dùng qua framework của Magento đã hỗ trợ ở đây khuyến cáo nên dùng class vendor/magento/framework/Serialize/Serializer/Json.php thay vì class vendor/magento/framework/Serialize/Serializer/Serialize.php

/** * @inheritDoc* @since 101.0.0 */public function serialize($data){    $result = json_encode($data);    if (false === $result) {        throw new \InvalidArgumentException("Unable to serialize value. Error: " . json_last_error_msg());    }    return $result;}
* @inheritDoc
* @since 101.0.0
*/
public function serialize($data)
{
   $result = json_encode($data);
   if (false === $result) {
       throw new \InvalidArgumentException("Unable to serialize value. Error: " . json_last_error_msg());
   }
   return $result;
}

/** * @inheritDoc* @since 101.0.0 */public function unserialize($string){    $result = json_decode($string, true);    if (json_last_error() !== JSON_ERROR_NONE) {        throw new \InvalidArgumentException("Unable to unserialize value. Error: " . json_last_error_msg());    }    return $result;}
* @inheritDoc
* @since 101.0.0
*/
public function unserialize($string)
{
   $result = json_decode($string, true);
   if (json_last_error() !== JSON_ERROR_NONE) {
       throw new \InvalidArgumentException("Unable to unserialize value. Error: " . json_last_error_msg());
   }
   return $result;
}

Magento ở đây dùng unserialize và serialize dưới dạng dùng function json_encode và json_decode. Điều này sẽ không gặp phải vấn đề về bảo mật nêu trên.

Cách này khuyến cáo được dùng hơn class vendor/magento/framework/Serialize/Serializer/Serialize.php. Vì class này vẫn dùng hàm unserialize của php, chỉ có thêm param

Magento ở đây dùng unserialize và serialize dưới dạng dùng function json_encode và json_decode. Điều này sẽ không gặp phải vấn đề về bảo mật nêu trên.['allowed_classes' => false]);

Magento ở đây dùng unserialize và serialize dưới dạng dùng function json_encode và json_decode. Điều này sẽ không gặp phải vấn đề về bảo mật nêu trên.

Magento ở đây dùng unserialize và serialize dưới dạng dùng function json_encode và json_decode. Điều này sẽ không gặp phải vấn đề về bảo mật nêu trên.

Cách này khuyến cáo được dùng hơn class vendor/magento/framework/Serialize/Serializer/Serialize.php. Vì class này vẫn dùng hàm unserialize của php, chỉ có thêm param

Magento ở đây dùng unserialize và serialize dưới dạng dùng function json_encode và json_decode. Điều này sẽ không gặp phải vấn đề về bảo mật nêu trên.

Cách này khuyến cáo được dùng hơn class vendor/magento/framework/Serialize/Serializer/Serialize.php. Vì class này vẫn dùng hàm unserialize của php, chỉ có thêm param

Hướng dẫn why is php unsecured? - tại sao php không được bảo mật?

Magento ở đây dùng unserialize và serialize dưới dạng dùng function json_encode và json_decode. Điều này sẽ không gặp phải vấn đề về bảo mật nêu trên.

Cách này khuyến cáo được dùng hơn class vendor/magento/framework/Serialize/Serializer/Serialize.php. Vì class này vẫn dùng hàm unserialize của php, chỉ có thêm param

vendor/magento/framework/Encryption/EncryptorInterface.php

Magento ở đây dùng unserialize và serialize dưới dạng dùng function json_encode và json_decode. Điều này sẽ không gặp phải vấn đề về bảo mật nêu trên.

srand - Có thể gây ra vấn đề đoán được các dãy số tiếp theo sinh ra bởi hàm srand

mt_srand - Function này không được mã hóa bảo mật .

Hãy đăng ký nhận tin để là người đầu tiên đọc bài viết mới nhất từ chúng tôi nhé

Thank you! Your submission has been received!

Oops! Something went wrong while submitting the form.