CỘNG ĐỒNG CÔNG NGHỆ THÔNG TIN VIỆT NAM

Bảo mật PHP Cyper Panel

0 Thành viên và 1 Khách đang xem chủ đề.

Đang duyệt NetworkEngineer

  • Administrator
  • Newbie
  • *****
    • Bài viết: 0
    • Số Lần: +1/-0
Bảo mật PHP Cyper Panel

PHP là một ngôn ngữ kịch bản phía máy chủ nguồn mở và nó phổ biến nhất và được sử dụng rộng rãi. LiteSpeed hoặc máy chủ web khác cung cấp quyền truy cập vào nội dung và tập tin thông qua HTTP hoặc HTTPS. Các máy chủ web có thể truy cập công khai, do đó chúng có các lỗ hổng bảo mật có thể xảy ra. Nếu PHP của bạn không được cấu hình đúng, nó có thể tạo ra nhiều vấn đề cho bạn. Vì vậy, PHP nên được cấu hình một cách thận trọng. Những kỹ thuật bảo mật này có thể được thực hiện với một vài dòng mã hoặc một số điều chỉnh nhỏ cho cài đặt ứng dụng của bạn. Sau đây là những thói quen tốt nhất mà lập trình viên có thể phát triển để cấu hình PHP an toàn.


1. SQL Injection

   SQL Injection là kỹ thuật hack được sử dụng phổ biến nhất bởi tin tặc để tương tác với phía cơ sở dữ liệu của ứng dụng web. Thông qua SQL, kẻ tấn công sử dụng đầy đủ các lỗ hổng bảo mật ứng dụng web và gửi các truy vấn không an toàn đến cơ sở dữ liệu. Các truy vấn này có thể sửa đổi hoặc thay đổi các bảng cơ sở dữ liệu hoặc xóa toàn bộ cơ sở dữ liệu. Đây là một lỗ hổng trong lớp cơ sở dữ liệu của ứng dụng PHP. Khi đầu vào của người dùng được lọc không chính xác, bất kỳ câu lệnh SQL nào cũng có thể được ứng dụng thực thi.

   Nếu đầu vào của người dùng được chèn mà không sửa đổi thành truy vấn SQL, thì ứng dụng sẽ trở nên dễ bị tổn thương đối với SQL Injection, như trong ví dụ sau:

Mã nguồn: You are not allowed to view links. Register or Login
$unsafe = $_POST['input'];

mysql_query("INSERT INTO `table` (`column`) VALUES ('$unsafe')");

   Đó là bởi vì người dùng có thể nhập một cái gì đó như value'); DROP TABLE table;  và truy vấn trở thành:

Mã nguồn: You are not allowed to view links. Register or Login
INSERT INTO `table` (`column`) VALUES('value'); DROP TABLE table;')
   Làm thế nào để ngăn chặn điều này:

   Sử dụng các câu lệnh được chuẩn bị và các truy vấn tham số.  Đây là các câu lệnh SQL được gửi đến và phân tích cú pháp bởi máy chủ cơ sở dữ liệu riêng biệt với bất kỳ tham số nào. Bằng cách này, kẻ tấn công không thể tiêm SQL độc hại.

   Sử dụng PDO (cho mọi trình điều khiển cơ sở dữ liệu được hỗ trợ):

Mã nguồn: You are not allowed to view links. Register or Login
$stmt = $pdo->prepare('SELECT * FROM employees WHERE name = :name');

$stmt->execute(array('name' => $name));

foreach ($stmt as $row) {
    // do something with $row

   Khi sử dụng PDO để truy cập cơ sở dữ liệu MySQL, các  câu lệnh chuẩn bị  thực không được sử dụng theo mặc định . Để khắc phục điều này bạn phải thiết lập PDO::ATTR_EMULATE_PREPARES, false. Tạo kết nối bằng PDO như thế này:

Mã nguồn: You are not allowed to view links. Register or Login
$dbConnection = new PDO('mysql:dbname=dbtest;host=127.0.0.1;charset=utf8', 'user', 'pass');

$dbConnection->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
$dbConnection->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

2. Luôn cập nhật PHP, phần mềm và hệ điều hành

   Luôn cập nhật PHP, phần mềm và hệ điều hành của bạn là một phần quan trọng để bảo mật ứng dụng web của bạn. PHP 7.3 là phiên bản an toàn và ổn định nhất. Tôi khuyên bạn nên nâng cấp ứng dụng web của mình lên phiên bản PHP mới nhất. Nếu bạn đang cài đặt PHP thông qua trình quản lý gói, bạn có thể sử dụng các lệnh sau:

Mã nguồn: You are not allowed to view links. Register or Login
# yum update
hoặc là
   
Mã nguồn: You are not allowed to view links. Register or Login
# apt-get update && apt-get upgrade
   Nếu bạn sử dụng CyberPanel, bạn chỉ cần sử dụng trình quản lý gói để nâng cấp các gói của mình và nó cũng sẽ nâng cấp các gói liên quan đến PHP nếu có bất kỳ nâng cấp nào.

3. Hạn chế quyền truy cập tập tin và thư mục

   Đảm bảo các tập tin và DocumentRoot của bạn được sở hữu bởi người dùng không phải root /home/website_name/public_html.

/home/website_name/public_html là thư mục con và DocumentRoot có thể sửa đổi bởi những người dùng khác. Root không bao giờ thực thi bất kỳ tập tin nào ngoài đó và không nên tạo tập tin trong đó.

   Bạn có thể thấy CyberPanel DocumentRoot trong một hình ảnh dưới đây:


   Đảm bảo quyền truy cập tập tin được đặt thành 0644 (chỉ đọc) trong /home/website_name/public_html:
   
Mã nguồn: You are not allowed to view links. Register or Login
# chmod -R 0644 /home/vietnetwork.vn/public_html/
   Đảm bảo tất cả các quyền của thư mục được đặt thành 0755 trong /home/website_name/public_html:
   
Mã nguồn: You are not allowed to view links. Register or Login
# find /home/vietnetwork.vn/public_html/ -type d -print0 | xargs -0 -I {} chmod 0755 {}
4. Cross-site scripting (XSS)

    XSS - Kịch bản chéo trang - là một lỗ hổng trong các ứng dụng web PHP, kẻ tấn công có thể khai thác để đánh cắp thông tin của người dùng. Cuộc tấn công thực sự vào nạn nhân xảy ra khi người dùng cuối truy cập trang và một số mã độc hại/không an toàn thực thi. Viết các PHP script an toàn hơn (xác nhận tất cả đầu vào của người dùng) để tránh các cuộc tấn công XSS.

   Kịch bản chéo trang cũng có thể được sử dụng để làm biến dạng ứng dụng web thay vì nhắm mục tiêu người dùng cuối.

   Cách phòng ngừa XSS

   Để giữ cho bản thân được bảo vệ khỏi cuộc tấn công XSS, bạn phải bảo vệ đầu vào của mình. Mã ứng dụng web PHP của bạn sẽ không bao giờ xuất dữ liệu nhận được dưới dạng đầu vào trực tiếp vào trình duyệt mà không kiểm tra mã đó không an toàn/mã độc.

5. Ghi log tất cả các lỗi PHP

   Đảm bảo rằng thông báo tập tin lỗi PHP của bạn không được hiển thị cho tất cả khách truy cập trang web. Bạn có thể sử dụng Trình soạn thảo PHP nâng cao CyberPanel để thực hiện những thay đổi này.
   
Mã nguồn: You are not allowed to view links. Register or Login
display_errors=Off
   Hãy ghi nhớ PHP cung cấp cho bạn rất nhiều thông tin về các đường dẫn, thư mục cơ sở dữ liệu và các thông tin nhạy cảm khác. Tôi khuyên bạn nên đặt tập tin ghi log lỗi tại chỗ để hiển thị lỗi trên trang web của bạn.

Mã nguồn: You are not allowed to view links. Register or Login
log_errors=On
error_log=/var/log/httpd/php_scripts_error.log

6. Không cho phép tải tập tin lên

   Tôi thực sự khuyên bạn nên chỉnh sửa cài đặt PHP bằng Trình chỉnh sửa PHP nâng cao CyberPanel và đặt lệnh sau để vô hiệu hóa tải tập tin lên vì lý do bảo mật:

Mã nguồn: You are not allowed to view links. Register or Login
file_uploads=Off
   Nếu khách hàng của bạn muốn tải tập tin lên ứng dụng PHP của bạn, hãy bật tính năng này lên upload_max_filesize bằng cách vào tập tin cấu hình PHP để PHP chấp nhận kích thước giới hạn của tập tin thông qua tải lên.
   
Mã nguồn: You are not allowed to view links. Register or Login
file_uploads=On
# user can only upload upto 2MB via php upload file
upload_max_filesize=2M

7. Cấu hình DocumentRoot

   Document Root là thư mục lưu các tập tin ứng dụng web PHP của bạn cho một tên miền. Tài liệu gốc của bạn phải được đặt trong /home/vietnetwork.vn/public_html. Public_html phục vụ trang index.php trong ứng dụng web PHP của bạn. Mục đích của việc làm cho thư mục public_html ẩn các tập tin nhạy cảm như .htaccess và tập tin ghi nhật ký lỗi trong thư mục tên miền của bạn để nó không thể truy cập công khai cho bất kỳ ai. Tôi thực sự khuyên bạn không nên lưu các tập tin nhạy cảm vào thư mục gốc của mình. Bạn có thể tạo một thư mục mới để lưu các tập tin đó.

8 Giả mạo yêu cầu trên nhiều trang web (CSRF)

   CSRF là một cuộc tấn công buộc người dùng cuối phải thực hiện các hành động không mong muốn trên ứng dụng web mà anh ấy/cô ấy hiện đang được xác thực. Với một chút trợ giúp của kỹ thuật (như gửi liên kết qua email / trò chuyện), kẻ tấn công có thể buộc người dùng ứng dụng web thực hiện các hành động do kẻ tấn công chọn. Khai thác CSRF thành công có thể thỏa hiệp dữ liệu và hoạt động của người dùng cuối trong trường hợp người dùng bình thường.     
   Nếu người dùng cuối được nhắm mục tiêu là tài khoản quản trị, điều này có thể làm tổn hại toàn bộ ứng dụng web.

   Thủ tục ngăn chặn CSRF

   Kiểm tra nếu yêu cầu có cookie phiên hợp lệ là không đủ. Chúng ta cần kiểm tra xem một mã định danh duy nhất có được gửi với mỗi yêu cầu HTTP được gửi đến ứng dụng hay không. CSRF yêu cầu KHÔNG có định danh duy nhất hợp lệ này. Lý do các yêu cầu CSRF sẽ không có số nhận dạng yêu cầu duy nhất này là ID duy nhất được hiển thị dưới dạng một trường ẩn trên trang và được thêm vào yêu cầu HTTP sau khi nhấn nút liên kết / nút. Kẻ tấn công sẽ không có kiến ​​thức về ID duy nhất này, vì nó là ngẫu nhiên và được hiển thị động trên mỗi liên kết, trên mỗi trang.

    Một danh sách được tuân thủ trước khi phân phối trang cho người dùng. Danh sách chứa tất cả các ID duy nhất hợp lệ được tạo cho tất cả các liên kết trên một trang nhất định. ID duy nhất có thể được lấy từ một trình tạo ngẫu nhiên an toàn như SecureRandom cho J2EE.
    Một ID duy nhất được thêm vào từng liên kết / biểu mẫu trên trang được yêu cầu trước khi được hiển thị cho người dùng.
    Duy trì danh sách ID duy nhất trong phiên người dùng, ứng dụng sẽ kiểm tra xem ID duy nhất được truyền với yêu cầu HTTP có hợp lệ cho một yêu cầu cụ thể không. Nếu ID duy nhất được truyền với yêu cầu HTTP là hợp lệ cho một yêu cầu đã cho.
    Nếu không có ID duy nhất, hãy chấm dứt phiên người dùng và hiển thị lỗi cho người dùng.

Phần kết luận

   Sau khi làm theo các bước này, ứng dụng web PHP của bạn sẽ được củng cố. Bạn sẽ hoàn thành mọi việc và có thể chạy các trang web PHP của bạn. Tuy nhiên, hãy lưu ý các lỗ hổng và các hoạt động độc hại của những kẻ tấn công được gây ra bằng cách không sử dụng các quy tắc lập trình thực hành tốt nhất. Nhiều công ty tốt cũng sử dụng các công cụ để kiểm tra các lỗ hổng bảo mật trong các ứng dụng web PHP. Tôi đã cố gắng bao gồm một số vấn đề bảo mật PHP. Có rất nhiều cách khác để làm cho ứng dụng PHP của bạn an toàn. Bạn nên tham khảo thêm các tài nguyên để bảo mật ứng dụng web của bạn.