PHP cho đến nay là ngôn ngữ lập trình phía máy chủ được sử dụng rộng rãi nhất. Các mối đe dọa bảo mật xung quanh các ứng dụng PHP đã được đưa tin vì PHP chiếm hơn 80% internet với hơn 10 triệu trang web được xây dựng. Không có gì ngạc nhiên khi với lượng sử dụng lớn như vậy, PHP cũng là một trong những ngôn ngữ được nhắm mục tiêu và khai thác nhiều nhất, như thể hiện trong số liệu thống kê dưới đây
nguồn. https. // thông tin chi tiết. xúc xắc. com/2019/11/27/lập trình-ngôn ngữ-vulnerabilities/
Một trong những lý do chính khiến các ứng dụng PHP thường dễ bị tổn thương là do các thực hành mã hóa an toàn không được tuân thủ trong quá trình phát triển PHP trên toàn bộ ứng dụng. Các lỗ hổng phổ biến như SQL injection, Cross-site scripting, data tampering, v.v. , có thể tránh được chỉ bằng cách thêm một vài dòng mã để bảo vệ ứng dụng và dữ liệu máy chủ
Trong bài viết này, chúng tôi sẽ đề cập đến các lĩnh vực mà nhà phát triển web cần tập trung vào để bảo mật tốt hơn các ứng dụng PHP của họ
Luôn cập nhật PHP
Đầu tiên và quan trọng nhất, các nhà phát triển nên sử dụng bản phát hành ổn định mới nhất của PHP trong các ứng dụng của họ. Điều này là do các bản phát hành mới thường chứa các bản vá bảo mật và bản sửa lỗi cho các lỗ hổng bảo mật đã biết có thể bị kẻ thù khai thác nếu không được cập nhật kịp thời
Hạn chế các tệp nhạy cảm
Khi triển khai ứng dụng PHP trên máy chủ trực tiếp, hãy đảm bảo di chuyển tất cả ứng dụng, tệp cấu hình và các tệp nhạy cảm cần thiết khác vào một thư mục không thể truy cập công khai [xem lại quyền của thư mục/tệp]. Ví dụ: cấu trúc thư mục có thể theo như ví dụ dưới đây
app/ config/ parameters.yml src/ public/ index.php style.css
Làm như vậy khiến kẻ tấn công khó truy cập thông tin nhạy cảm bên ngoài thư mục gốc.
Bật chứng chỉ SSL
Đối với tất cả các ứng dụng web, lưu lượng được gửi đến và đi từ các máy chủ web phải được mã hóa bằng chứng chỉ TLS/SSL. Điều này có nghĩa là toàn bộ ứng dụng phải sử dụng giao thức HTTPS để kẻ tấn công không thể rò rỉ hoặc đánh cắp thông tin nhạy cảm
Định cấu hình gốc tài liệu đúng cách
Thư mục gốc của tài liệu cho các ứng dụng PHP phải được đặt thành /var/www/html cho các hệ thống Linux và C. \inetpub\wwwroot cho hệ thống Windows. Làm như vậy sẽ đảm bảo rằng tất cả các tệp PHP nhạy cảm và các tệp khác chứa biến môi trường và thông tin xác thực cơ sở dữ liệu, chẳng hạn như. htaccess và. env không truy cập được
Tắt lỗi dài dòng và bật ghi nhật ký
Thông báo lỗi dài dòng là một trong những lý do khiến kẻ tấn công có được thông tin có giá trị về trang web, giúp kẻ tấn công tiến hành các cuộc tấn công tiếp theo. Bất cứ khi nào một ứng dụng được triển khai trên máy chủ trực tiếp, hãy đảm bảo tắt tất cả lỗi chi tiết và thay vào đó hiển thị lỗi tùy chỉnh.
display_errors=Off
Ngoài ra, hãy định cấu hình ứng dụng để ghi nhật ký tất cả các thông báo lỗi để các nhóm liên quan có thể xem qua nhật ký để phát hiện mọi điểm bất thường hoặc các cuộc tấn công thành công cũng như không thành công
log_errors=On error_log=/var/log/httpd/php_application_errors.log
Triển khai mã hóa URL
Luôn sử dụng các hàm tích hợp PHP như urlencode[] để mã hóa an toàn tất cả các chuỗi được sử dụng để tạo URL. Điều này có thể có lợi trong việc trốn tránh các cuộc tấn công sử dụng biểu tượng và các ký tự khác
Không tin tưởng vào đầu vào của người dùng
Phần lớn các cuộc tấn công PHP xảy ra do các nhà phát triển tin tưởng đầu vào của người dùng và xử lý hoặc phân tích cú pháp trực tiếp vào tệp PHP. Khi làm như vậy, mã độc cũng được xử lý dẫn đến những bất ngờ khó chịu, cái mà chúng tôi gọi là khai thác
Các nhà phát triển web PHP nên làm việc với giả định rằng tất cả các đầu vào đến từ phía máy khách đều độc hại và do đó phải được khử trùng ngay khi chúng đến. Vệ sinh đầu vào phải là quy trình tiếp theo ngay lập tức sau khi nhận được đầu vào.
Tương tự, đầu vào của người dùng cũng được hiển thị trong ứng dụng dưới dạng đầu ra. Dữ liệu đầu ra này cũng cần được làm sạch trước khi hiển thị và hiển thị trên ứng dụng. Không giống như khử trùng đầu vào, khử trùng đầu ra nên được thực hiện càng muộn càng tốt để đảm bảo rằng dữ liệu đầu ra không bị sửa đổi tại bất kỳ thời điểm nào sau khi khử trùng
Nguyên tắc ngón tay cái là làm sạch đầu vào càng sớm càng tốt và mã hóa đầu ra
Vệ sinh, xác nhận và thoát
Ba thuật ngữ làm sạch, xác thực và thoát được thấy rất phổ biến khi nói về mã hóa an toàn, nhưng mỗi thuật ngữ này có nghĩa là gì
Thẩm định
Xác thực có nghĩa là kiểm tra xem ứng dụng có nhận đúng loại dữ liệu đầu vào hay không. Ví dụ: nếu ứng dụng đang hỏi tuổi của một người, thì chỉ nhận các giá trị số nguyên và không có bảng chữ cái hoặc ký hiệu nào trong đầu vào. Các hàm PHP như is_numeric[] có thể được sử dụng tại đây
vệ sinh
Khử trùng có nghĩa là loại bỏ hoặc loại bỏ các ký tự nguy hiểm tiềm ẩn khỏi đầu vào. Chẳng hạn như loại bỏ dấu nháy đơn [‘] để ngăn chặn việc tiêm SQL hoặc dấu ngoặc nhọn [ < , >] để ngăn chặn các cuộc tấn công XSS
bỏ trốn
Thoát có nghĩa là chuyển đổi dữ liệu có hại thành dữ liệu vô hại. Ví dụ: nếu bất kỳ kẻ tấn công nào thêm
$search = $_GET[‘search’] ?? . $search;
echo ‘Search results for ‘.$search;
// Điều này có thể được giảm thiểu bằng cách sử dụng hàm htmlspecialchars
$search = htmlspecialchars[$search, ENT_QUOTES, 'UTF-8'];
. $search;
Trong đoạn mã trên, các hàm như ENT_QUOTES có thể được sử dụng để thoát khỏi dấu ngoặc đơn và dấu ngoặc kép để kẻ tấn công không thể phá vỡ cú pháp và thực thi tập lệnh
Thảo luận về mối quan tâm của bạn ngày hôm nay
LIÊN HỆ CHÚNG TÔI
tiêm SQL
Như đã thảo luận ở trên, tấn công SQL injection rất phổ biến trong tập lệnh PHP và có thể tránh được bằng cách sử dụng các truy vấn được tham số hóa hoặc các câu lệnh SQL đã chuẩn bị sẵn
$sql = "SELECT username, password FROM users WHERE id = :id"; $sth = $dbh->prepare[$sql, [PDO::ATTR_CURSOR => PDO::CURSOR_FWDONLY]]; $sth->execute[[':id' => $id]]; $users = $sth->fetchAll[];
duyệt thư mục
Duyệt thư mục hoặc dấu chấm, dấu chấm, dấu gạch chéo [. /] các cuộc tấn công có thể tiết lộ thông tin và tệp nhạy cảm trong thư mục máy chủ web. Những cuộc tấn công này có thể được giảm thiểu bằng cách sử dụng sau đây
// Check if the string contains parent directory if [strstr[$_GET['page'], '../'] !== false] { throw new \Exception["Directory traversal attempt!"]; } // Check for remote file inclusions if [strstr[$_GET['page'], 'file://'] !== false] { throw new \Exception["Remote file inclusion attempt!"]; } // Use whitelists of web pages that are only allowed to be included $allowed = ['home', 'blog', 'contact', 'services']; $page = [in_array[$page, $allowed]] ? $page : 'home'; echo file_get_contents['../pages/'.$page.'.php'];
Sử dụng kết hợp các hàm basename[] và realpath[], nhưng điều này không giúp bạn giải quyết các vấn đề về LFI [Local File Inclusion].
tiêm lệnh
Việc thực thi các lệnh không đáng tin cậy có thể trực tiếp dẫn đến việc làm hỏng máy chủ web. Đảm bảo không tin tưởng bất kỳ lệnh nào không quen thuộc
exec['rm -rf '.$GET['path']];
tiêm mã
Các chức năng như eval[] nên tránh bằng mọi giá, vì chúng có thể được sử dụng để thực thi mã tùy ý. Nếu điều này là không thể tránh khỏi thì hãy đảm bảo khử trùng đầu vào đúng cách trước khi sử dụng hàm eval[] của PHP
eval['include '.$_GET['path']];
Hơn nữa, để tránh các cuộc tấn công chèn mã, bạn cần tắt các chức năng trong cấu hình PHP cho phép xử lý trực tiếp đầu vào hoặc tương tác với phần phụ trợ. Các ví dụ về hàm nguy hiểm này là exec[], shell_exec[], passthru[] và system[].
Lưu trữ mật khẩu
Tất cả mật khẩu được lưu trữ hoặc sử dụng trong ứng dụng phải được mã hóa hoặc băm. Hàm password_hash[] có thể được sử dụng cho việc này. Băm mật khẩu đảm bảo rằng ngay cả khi mật khẩu bị rò rỉ, kẻ thù không thể tiết lộ giá trị thực của mật khẩu
Lỗi và đăng nhập
Như đã đề cập ở trên, các lỗi chi tiết cung cấp cho kẻ tấn công cái nhìn sâu sắc về ứng dụng và có thể được sử dụng để tiến hành các cuộc tấn công tiếp theo. Luôn tắt hiển thị lỗi và đảm bảo ghi lại tất cả các lỗi trong một tệp riêng
; Disable displaying errors to screen display_errors = off ; Enable writing errors to server logs log_errors = on
Phiên bản PHP được tiết lộ
Các phiên bản PHP được hiển thị theo mặc định trong cấu hình PHP trong các tiêu đề HTML, tuy nhiên, cách tốt nhất là ẩn các phiên bản này. Nếu kẻ tấn công biết phiên bản công nghệ, họ có thể tìm thấy các lỗ hổng được tiết lộ công khai liên quan đến phiên bản đó và sử dụng khai thác trên ứng dụng
________số 8Bao gồm tệp từ xa [RFI]
Quyền truy cập vào các tệp từ xa phải bị vô hiệu hóa để kẻ tấn công không thể tải các tệp được lưu trữ trên máy chủ của chúng vào trang web. Trong một cuộc tấn công RFI [Bao gồm tệp từ xa], kẻ tấn công có thể bao gồm các tệp của chính chúng và hiển thị chúng trong ngữ cảnh của ứng dụng
; disabled opening remote files for fopen, fsockopen, file_get_contents and similar functions allow_url_fopen = 0 ; disabled including remote files for require, include and similar functions allow_url_include = 0
Cấu hình phiên người dùng
Có một số lĩnh vực trong quản lý phiên cần được xem xét khi viết mã bảo mật
- Cho phép sử dụng cookie phiên với ID phiên duy nhất
display_errors=Off0
- Kích hoạt cookie chỉ là http, để mã JS độc hại không thể đánh cắp cookie
display_errors=Off1
- Đặt giá trị miền cookie, thay vì sử dụng ký tự đại diện
display_errors=Off2
- Bật cookie an toàn để cookie chỉ được truyền qua HTTPS
display_errors=Off3
Tải lên tập tin an toàn
Tải lên các tệp do người dùng cung cấp là một tính năng mà hầu như tất cả các ứng dụng đều có. Các tệp này phải được tải lên một cách an toàn để không có tệp thực thi độc hại hoặc tập lệnh PHP nào được tải lên máy chủ web
Các tệp phải được xác thực bằng các loại mime
display_errors=Off4
Và tải lên. php nên là
display_errors=Off5
Tóm lại, đây là lời khuyên để tải lên tệp an toàn
- Hạn chế các loại tệp được chấp nhận để tải lên, sử dụng danh sách cho phép thay vì danh sách chặn – kiểm tra phần mở rộng tệp và chỉ cho phép tải lên một số định dạng tệp nhất định
- Đảm bảo trình quét phần mềm độc hại được định cấu hình để quét nội dung trước khi lưu và chia sẻ nội dung đã tải lên. Điều này sẽ xác minh nội dung không độc hại hoặc được tải lên dưới định dạng tệp sai để tránh các loại tệp tải lên
- Kiểm tra các phần mở rộng kép, các tệp không có tên tệp, chẳng hạn như. htaccess web. cấu hình, v.v.
- Cân nhắc đổi tên các tệp đã tải lên và không cho phép thực thi/thay đổi quyền
Thảo luận về mối quan tâm của bạn ngày hôm nay
LIÊN HỆ CHÚNG TÔI
Sự kết luận
Thực tiễn bảo mật PHP là một chủ đề rộng lớn và chúng tôi mới chỉ xem xét bề nổi. Cuối cùng, trách nhiệm của các nhà phát triển PHP là tạo mã không chỉ đáp ứng các yêu cầu kinh doanh mà còn an toàn và có khả năng chống lại các cuộc tấn công mạng. Các nhà phát triển của bạn không bao giờ nên tin tưởng đầu vào của người dùng và giữ các vấn đề bảo mật như bao gồm tệp từ xa, XSS, CSRF, SQLi, mã hóa URL, v.v. trong tâm trí của bạn.
Ngoài ra, hãy xem xét việc xem xét mã bảo mật cùng với các hoạt động kiểm tra thâm nhập được thực hiện trên các ứng dụng PHP của bạn. Hãy liên hệ để xác thực độc lập các biện pháp kiểm soát bảo mật ứng dụng của bạn trước khi quá muộn
Thử nghiệm thâm nhập ứng dụng web
Hướng dẫn phân tích phần mềm độc hại. Các loại & Công cụ
23/10/2022
Đọc thêm "dấu chân kỹ thuật số. Tất cả về dấu vết điện tử và cách để lại dấu vết kỹ thuật số tối thiểu
13/10/2022
Đọc thêm "Sự khác biệt giữa Giám sát mạng và Giám sát an ninh mạng
10/05/2022
Đọc thêm "Mục lục
Thẻ
activedirectory vi phạm kiến trúc api Tuân thủ Bảo mật đám mây cyberessentials an ninh mạng Mã hóa gdpr cứng hóa chung mới nhất office365 owasp mật khẩu pcidss pentest phòng chống lừa đảo bảo mật redteaming rủi ro đánh giá rủi ro giảm thiểu rủi ro doanh nghiệp xã hội kỹ thuật các mối đe dọa chuỗi cung ứng Mẹo ứng dụng web