Hướng dẫn dùng 5678910 trong PHP

A breakdown by groups with excess:

function array_chunk_greedy[$arr, $count]{
    $arr = array_chunk[$arr, $count];
    if[[$k = count[$arr]-1] > 0]{
        if[count[$arr[$k]] < $count]{
            $arr[$k-1] = array_merge[$arr[$k-1], $arr[$k]];
            unset[$arr[$k]];
        }
    }
    return $arr;
}

$arr = range[1, 13];
$arr = array_chunk_greedy[$arr, 4];

print_r[$arr];

[1,2,3,4,5,6,7,8,9,10,11,12,13] —> [1,2,3,4] [5,6,7,8] [9,10,11,12,13]

More examples:

[1,2,3,4,5,6,7,8,9,10,11,12] —> [1,2,3,4] [5,6,7,8] [9,10,11,12]
[1,2,3,4,5,6,7,8,9,10,11,12,13] —> [1,2,3,4] [5,6,7,8] [9,10,11,12,13]
[1,2,3,4,5,6,7,8,9,10,11,12,13,14] —> [1,2,3,4] [5,6,7,8] [9,10,11,12,13,14]
[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15] —> [1,2,3,4] [5,6,7,8] [9,10,11,12,13,14,15]
[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16] —> [1,2,3,4] [5,6,7,8] [9,10,11,12] [13,14,15,16]

Example report:

$arr = range[1, 45];
$arr = array_chunk_lazy[$arr, 10];

$arr = array_map[function[$sub_value] {
            return implode['
', $sub_value];
        }, $arr];

function array_chunk_greedy[$arr, $count]{
    $arr = array_chunk[$arr, $count];
    if[[$k = count[$arr]-1] > 0]{
        if[count[$arr[$k]] < $count]{
            $arr[$k-1] = array_merge[$arr[$k-1], $arr[$k]];
            unset[$arr[$k]];
        }
    }
    return $arr;
}
0

function array_chunk_greedy[$arr, $count]{
    $arr = array_chunk[$arr, $count];
    if[[$k = count[$arr]-1] > 0]{
        if[count[$arr[$k]] < $count]{
            $arr[$k-1] = array_merge[$arr[$k-1], $arr[$k]];
            unset[$arr[$k]];
        }
    }
    return $arr;
}
1

function array_chunk_greedy[$arr, $count]{
    $arr = array_chunk[$arr, $count];
    if[[$k = count[$arr]-1] > 0]{
        if[count[$arr[$k]] < $count]{
            $arr[$k-1] = array_merge[$arr[$k-1], $arr[$k]];
            unset[$arr[$k]];
        }
    }
    return $arr;
}
2

function array_chunk_greedy[$arr, $count]{
    $arr = array_chunk[$arr, $count];
    if[[$k = count[$arr]-1] > 0]{
        if[count[$arr[$k]] < $count]{
            $arr[$k-1] = array_merge[$arr[$k-1], $arr[$k]];
            unset[$arr[$k]];
        }
    }
    return $arr;
}
3

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 ở:

//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.

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 Injection

class Example1
{
  public $cache_file;

  function __construct[]
  {
     // some PHP code...
  }

  function __destruct[]
  {
     $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...

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:

//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 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

$result = unserialize[$string, ['allowed_classes' => false]];

allowed_classes là false để tránh vấn đề về bảo mật.

Không nên dùng hàm eval

Hàm eval cho phép chạy lệnh php. Vì vậy hacker có thể truyền đoạn code php vào để thực thi. Ví dụ nếu để eval thực thi đoạn lệnh người dùng truyền vào từ request thì sẽ rất nguy hiểm. Do đó, ta không nên dùng hàm eval[]. Hàm này là hàm bị cấm sử dụng trong Magento 2.

Dùng phương thức bảo mật cao hơn MD5

md5 : MD5 đang là phương thức mã hóa yếu nhất. Không nên sử dụng để cho password hoặc các dữ liệu nhạy cảm. Lý do là phương thức mã hóa MD5 đã cũ và lỗi thời. MD5 chỉ nên sử dụng để kiểm tra tính toàn vẹn của dữ liệu thay vì lưu trữ password hoặc data nhạy cảm.

SHA vs MD5

 

Ngoài ra, nếu để trong magento 2, có thể sử dụng class sẵn có trong magento để thực hiện điều này thay vì sử dụng hàm thuần. Đó là hàm encryption có sẵn của magento 2.

Chủ Đề