PHP cung cấp các hàm dựng sẵn _______ 29 _______ và htmlspecialchars[]
để mã hóa các ký tự có vấn đề trong đầu ra và để ngăn chặn các lỗ hổng XSS
Sự khác biệt là trong khi htmlspecialchars[]
chỉ mã hóa một nhóm nhỏ các ký tự [&
, ,
'
nếu đặt ENT_QUOTES
và "
nếu không đặt htmlentities[]
0] thì htmlentities[]
mã hóa bất kỳ ký tự nào có thực thể HTML tương đương
Điều này làm cho việc sử dụng hàm htmlentities[]
sau đây với ENT_QUOTES
trở thành cách dễ dàng nhất để mã hóa bất kỳ ký tự có vấn đề nào trong một biến do người dùng kiểm soát để ngăn chặn các cuộc tấn công XSS trong các ngữ cảnh phổ biến nhất
$escaped = htmlentities[$user_controlled_variable, ENT_QUOTES | ENT_HTML5, 'UTF-8'];
Có thể đạt được nhiều kiểm soát chi tiết hơn bằng cách sử dụng các thư viện cung cấp khả năng khử trùng HTML, chẳng hạn như HTML Purifier. Tùy thuộc vào khung bạn đang sử dụng, hãy đảm bảo tuân thủ các kỹ thuật thoát html được đề xuất áp dụng cho khung cụ thể
giao hưởng
Twig là công cụ mẫu được Symfony sử dụng để tự động mã hóa tất cả đầu ra có nguồn gốc từ các biến cho ngữ cảnh HTML. Mã hóa HTML được sử dụng bất cứ khi nào bạn kết xuất một biến trên trang Twig e. g. htmlentities[]
4 nhưng lọc để mã hóa cho các ngữ cảnh khác có thể được sử dụng. Mã hóa HTML mặc định cũng mã hóa dấu ngoặc đơn và dấu ngoặc kép, giúp sử dụng an toàn trong hầu hết các ngữ cảnh
Ngữ cảnhVí dụ ngữ cảnhCơ chế mã hóa cành láHTML Bodyhtmlentities[]
5Mã hóa HTML [mặc định]Thuộc tính HTMLhtmlentities[]
6Mã hóa thuộc tính HTMLTham số URLhtmlentities[]
7Nên sử dụng mã hóa URL để thoát khỏi thành phần con URICSShtmlentities[]
8Mã hóa CSS thoát khỏi mọi thứ ngoại trừ chữ và sốJavaScripthtmlentities[]
6htmlentities[]
6Mã hóa JavaScript
Bộ lọc Twig htmlspecialchars[]
1 vô hiệu hóa bất kỳ mã hóa nào và không được sử dụng khi hiển thị dữ liệu do người dùng kiểm soát
Người giới thiệu
PHP - htmlentities - Chuyển đổi tất cả các ký tự có thể áp dụng thành thực thể HTML Symfony - Twig escape filter OWASP - Code Review Guide OWASP - Cross-Site Scripting Prevention Cheat Sheet HTML Purifier
Lỗ hổng XSS là một trong những vấn đề bảo mật phổ biến nhất trên web. Thật không may, ngay cả khi các công nghệ phát triển mới đã cố gắng hết sức để loại bỏ lỗ hổng này, nó vẫn tồn tại trong tất cả các ứng dụng cũ và mới hơn. Để ngăn chặn lỗ hổng XSS trong bất kỳ công nghệ phát triển nào, thông tin đầu vào của người dùng phải được lọc trước khi hiển thị trong ứng dụng web
Trong bài viết này, tôi sẽ giải thích chi tiết, cách chính xác để ngăn chặn lỗ hổng cụ thể này trong mã PHP của bạn. Tôi sẽ cung cấp cho bạn các ví dụ thực tế về cách bạn sẽ làm điều này trong mọi khung phát triển PHP phổ biến. Dưới đây là danh sách các framework đó
- PHP
- ấu trùng
- giao hưởng
- MãĐánh Lửa
- BánhPHP
- Nhiên liệuPHP
- Zend
Trước khi chúng ta bắt đầu tìm hiểu sâu hơn về cách khắc phục và ngăn chặn lỗ hổng này, tôi xin đưa ra một vài thông tin mà tôi chắc rằng hầu hết mọi người chưa biết về tác động của lỗ hổng XSS
Nếu bạn đã quen với lỗ hổng này và chỉ muốn hiểu cách khắc phục nó trong công nghệ mà bạn đang làm việc, thì hãy bỏ qua đoạn sau và đi thẳng đến công nghệ bạn muốn. Nhưng, hãy tin tôi, tôi rất khuyến khích bạn tiếp tục đọc. Tôi khá chắc chắn rằng bạn không biết về những thông tin sau
XSS là một lỗ hổng bao gồm đưa mã Javascript độc hại vào một trang web hợp pháp. Lỗ hổng này xảy ra khi mã không lọc đầu vào của người dùng trước khi hiển thị chúng trên một trang hợp pháp
Lỗ hổng XSS có thể được tìm thấy trong ba loại
- XSS được lưu trữ
- XSS được phản ánh
- Dựa trên XSS DOM
Sự khác biệt lớn giữa ba loại này là trong XSS được lưu trữ, dữ liệu người dùng được lưu trong cơ sở dữ liệu trái với các lỗ hổng XSS được phản ánh và dựa trên DOM. Bây giờ, đối với XSS được phản ánh và các lỗ hổng XSS dựa trên DOM, sự trì hoãn có liên quan đến luồng dữ liệu
Trong XSS dựa trên DOM, trình duyệt xử lý toàn bộ luồng dữ liệu bị nhiễm độc từ nguồn đến phần chìm trái ngược với XSS được phản ánh
Bây giờ, khi tôi hỏi hầu hết khách hàng và sinh viên của mình, tác động của lỗ hổng này là gì, họ liên tục nói với tôi, những thứ như đánh cắp thông tin người dùng, kiểm soát ứng dụng và những thứ như thế này, và chỉ có thế. Thật không may, đây không phải là tất cả những gì lỗ hổng này có thể làm. Trong một số trường hợp, tác động có thể trở nên tồi tệ như chiếm quyền kiểm soát máy chủ hoặc máy khách
Điều đó không dễ chấp nhận, nhưng hãy tin tôi, đó là sự thật. Nếu bạn muốn một số ví dụ thực tế về điều này, thì tôi thực sự khuyên bạn nên xem bài đăng trên blog của tôi về tác động thực sự của 10 lỗ hổng OWASP TOP
Bây giờ bạn đã biết mức độ nguy hiểm của lỗ hổng này, hãy xem cách chúng tôi có thể khắc phục nó
Cách ngăn chặn tấn công XSS trong PHP
Trước khi chúng ta nói về cách khắc phục lỗ hổng này trong các khung công tác PHP, trước tiên hãy xem cách chúng ta có thể khắc phục nó trong mã nguồn PHP thuần túy
Để khắc phục lỗ hổng XSS trong mã nguồn PHP, bạn cần lọc đầu vào của người dùng bằng cách sử dụng htmlspecialchars, với các tham số ENT_QUOTES và ‘UTF-8’
Đây là một ví dụ về mã dễ bị tổn thương
Để khắc phục lỗ hổng này, hầu hết mọi người viết đoạn mã sau
Thật không may, đây không phải là cách chính xác để khắc phục lỗ hổng này. Việc sử dụng htmlspecialchars không có tham số chính xác có thể bị bỏ qua bằng một số kỹ thuật nâng cao, điều đó có nghĩa là lỗ hổng bảo mật sẽ vẫn còn trong ứng dụng
Để sửa mã này, tất cả những gì bạn cần làm là lọc đầu vào của người dùng bằng cách sử dụng htmlspecialchars với các tham số sau
Ngay cả ví dụ sau cũng dễ bị tấn công và cần hàm htmlspecialchars
Đây là cách khắc phục
Sử dụng htmlspecialchars với các tham số cần thiết sẽ không phải lúc nào cũng bảo vệ mã php của bạn và bạn sẽ cần kết hợp nó với các chức năng khác
Đây là một ví dụ về tình huống như vậy
”>Click here
Cách ngăn chặn tấn công XSS trong Laravel
Laravel là một trong những framework PHP phổ biến nhất và hầu hết các client mà tôi từng làm việc đều sử dụng nó để tạo các ứng dụng web. Do đó, tôi có thể tìm thấy nhiều tình huống có thể xảy ra lỗ hổng XSS, ngay cả khi khung này đã bảo vệ ứng dụng khỏi các cuộc tấn công như vậy
Trên thực tế, cách {{ $data }} hiển thị đầu vào của người dùng không phải lúc nào cũng an toàn ngay cả khi kỹ thuật này lọc các thẻ HTML
Đây là một số tình huống mà mã laravel dễ bị tấn công
- Khi tạo một URL động
Khi bạn đang tạo một URL động và đưa nó vào thuộc tính “href” của thẻ “a”, sử dụng đầu vào của người dùng như thế này
________số 8_______Trong trường hợp này, ngay cả khi bộ lọc bảo vệ {{ }} biến $userData, kẻ tấn công vẫn có khả năng chèn mã Javascript độc hại không bao gồm bất kỳ thẻ html nào để khai thác lỗ hổng. Tôi sẽ không đưa ra một ví dụ về khai thác như vậy bởi vì đó không phải là mục đích của bài viết này
Đây là cách bạn có thể sửa mã này
Click here
- Sử dụng {. dữ liệu $. } Tuyên bố
Laravel đưa ra tuyên bố này, để cung cấp cho các nhà phát triển khả năng hiển thị dữ liệu với các thẻ HTML bên trong. Tuy nhiên, nếu đầu vào của người dùng được hiển thị bằng câu lệnh này, thì anh ta sẽ có thể chèn mã javascript độc hại
Đừng bao giờ cung cấp cho người dùng khả năng gửi các thẻ HTML và hiển thị chúng. Nếu bạn muốn một cái gì đó như thế này để có thể định dạng văn bản hoặc …, thì hãy tạo các thẻ ảo của riêng bạn và sau đó chuyển đổi chúng trong khi lọc dữ liệu người dùng giữa các thẻ đó
- Khi sử dụng một chỉ thị tùy chỉnh
Laravel cũng cung cấp khả năng tạo chỉ thị của riêng bạn như sau
public function boot[]
{
Blade::directive['testDirective', function [$userInput] {
return "";
}];
}
Mã này dễ bị XSS vì dữ liệu người dùng được hiển thị trực tiếp mà không có bất kỳ bộ lọc nào. Để khắc phục sự cố này, bạn sẽ cần sử dụng htmlspecialchars[] với các tham số cần thiết và nếu bạn đang sử dụng dữ liệu người dùng trong URL thì hãy kết hợp nó với hàm urlencode[]
Đây là một ví dụ
0- Khi sử dụng thuộc tính sự kiện
Như bạn đã thấy trong một. href, lỗ hổng XSS vẫn tồn tại. Trong một tình huống tổng quát hơn, nếu bạn sử dụng một số thông tin đầu vào của người dùng mà không lọc trong thuộc tính sự kiện như ví dụ sau
1Sau đó, mã sẽ vẫn dễ bị tổn thương ngay cả khi bạn sử dụng kỹ thuật {{ }} để hiển thị đầu vào của người dùng. Để ngăn lỗ hổng XSS trong tình huống này, bạn cần lọc đầu vào của người dùng trước khi sử dụng
Tuy nhiên, tình trạng này rất khó sửa và cũng rất hiếm khi tìm thấy ở một mã nào đó. Tôi thực sự khuyên bạn không nên cung cấp cho người dùng khả năng đưa trực tiếp đầu vào của mình vào một thuộc tính chẵn như ví dụ trước
Cách ngăn chặn cuộc tấn công XSS trong Symfony
Để ngăn chặn lỗ hổng XSS trong ứng dụng dựa trên Symfony, đầu vào của người dùng cần được thoát trước khi được hiển thị trên một trang web hợp pháp. Khung này cung cấp nhiều kỹ thuật để ngăn chặn lỗ hổng XSS như laravel và chúng ta sẽ thấy điều này trong các đoạn tiếp theo
Để tạo một trang html, Symfony cung cấp hai loại mẫu
- mẫu cành cây
Cái đầu tiên và cái được khuyên dùng nhiều nhất là Cành cây. Trong các mẫu Twig, theo mặc định, các đầu ra được lọc trước khi được đưa vào trang HTML. Cái nào bảo vệ mã nguồn khỏi mọi lỗ hổng XSS có thể xảy ra. Tuy nhiên, khung cung cấp một cách để tắt bộ lọc này trong trường hợp nhà phát triển đã tin tưởng đầu ra. Đây là một ví dụ
2Để có thể sử dụng kỹ thuật này, bạn cần chắc chắn 100% rằng nội dung trong bài viết. biến cơ thể đã được lọc
- mẫu PHP
Thật không may, tùy chọn thoát này không được bật theo mặc định trong các mẫu PHP. Vì vậy, viết đoạn mã sau
3Làm cho ứng dụng dễ bị XSS
Để khắc phục lỗ hổng này, bạn cần thoát biến $name bằng cách sử dụng hàm escape[] trước khi hiển thị nó. Đây là một ví dụ
4Hàm thoát theo mặc định giả định rằng bạn đang hiển thị dữ liệu này trong ngữ cảnh HTML. Nếu bạn xem qua các lỗ hổng XSS đã thảo luận của PHP hoặc Laravel, bạn sẽ nhận thấy rằng ngay cả khi sử dụng htmlspecialchars[], mã nguồn vẫn dễ bị tổn thương nếu dữ liệu được sử dụng trong một số loại thuộc tính. Do đó, để bảo vệ mã nguồn của bạn trong những tình huống như vậy, bạn sẽ cần thay đổi các tham số chức năng tùy thuộc vào ngữ cảnh của dữ liệu
Dưới đây là một ví dụ về việc sử dụng dữ liệu người dùng trong mã Javascript
5Cách ngăn chặn tấn công XSS trong CodeIgniter
CodeIgniter là một khung công tác PHP mạnh, nhẹ và phổ biến với dung lượng nhỏ. Nó được tạo ra cho các nhà phát triển, những người cần một bộ công cụ cơ bản và thanh lịch để xây dựng các ứng dụng web đầy đủ tính năng. Để ngăn chặn cuộc tấn công XSS trong ứng dụng web Codeigniter, tham số thứ hai “True” cần được thêm vào tất cả thông tin đầu vào của người dùng trong khi truy xuất chúng
Tuy nhiên, trong hầu hết các trường hợp, các nhà phát triển không biết hoặc quên tham số thứ hai này, điều này khiến ứng dụng dễ bị lỗ hổng XSS
Đây là một ví dụ về mã nguồn dễ bị tấn công
6hiển thị biến bài đăng "tên" trực tiếp cho người dùng, làm cho mã này dễ bị lỗ hổng XSS. Trên thực tế, rất dễ khắc phục sự cố này trong Codeigniter. Tất cả những gì bạn cần làm là thêm tham số thứ hai như đã đề cập trước đó
Dưới đây là một ví dụ về cách sửa mã này
7Thêm tham số TRUE, yêu cầu Codeigniter lọc đầu vào của người dùng trước khi đưa nó vào trang web HTML. Ngoài ra, Codeigniter cung cấp một cách lọc dữ liệu dễ dàng hơn nhiều [nhưng không được đề xuất]. Trên thực tế, lớp đầu vào cung cấp khả năng trực tiếp tự động hóa quá trình lọc trong tất cả các ứng dụng web của bạn bằng cách đặt biến global_xss_filtering thành true
Để làm điều đó, tất cả những gì bạn cần làm là sửa đổi tệp trong đường dẫn
ứng dụng/cấu hình/cấu hình. php
Bằng cách thay đổi giá trị của biến global_xss_filtering thành TRUE như sau
8Trên thực tế, bạn có thể nhận thấy rằng trong phần Codeigniter, tôi không nói về vấn đề thuộc tính, điều mà tôi đã nói trong các framework khác. Lý do đằng sau điều này là cách Codeigniter hoạt động và cách chức năng của nó được phát triển khiến nó thực sự an toàn ngay cả trong những tình huống đó
Tôi đã thực hiện một kỹ thuật đảo ngược nhỏ đối với mã nguồn Codeigniter và đây là những gì tôi đã khám phá ra
Bằng cách theo dõi quá trình thực thi hàm get[], post[] và các hàm nhập của người dùng khác, tôi nhận thấy rằng họ gọi hàm xss_clean[]. Hàm này là một phần của lớp có tên Bảo mật
Bằng cách phân tích lớp này và chức năng này, tôi đã phát hiện ra rằng chức năng này không hoạt động như chức năng lọc của khung khác. Ở đây, chức năng thực hiện một số hành động chính xác trên đầu vào của người dùng để chỉ lọc dữ liệu nguy hiểm. Do đó, chức năng này sẽ bảo vệ ứng dụng của bạn trước các kỹ thuật tấn công như vậy
Lớp này thực sự cung cấp các biện pháp bảo vệ khác cho các lỗ hổng khác mà tôi sẽ giải thích trong các bài viết tiếp theo và nó đáng được phân tích
Cách ngăn chặn tấn công XSS trong CakePHP
CakePHP là một trong những framework PHP tốt trong ngành và tôi thực sự may mắn khi được làm việc với một số nhà phát triển giỏi làm việc với nó. Một số nhà phát triển đó đã nói với tôi rằng khuôn khổ thực sự tự động lọc đầu vào của người dùng để chúng tôi không cần phải thực hiện điều đó
Thành thật mà nói, tôi không biết CakePHP thực hiện điều này như thế nào và tôi có thể thực hiện kỹ thuật đảo ngược khung để tìm câu trả lời chi tiết cho câu hỏi của mình, nhưng hiện tại, hãy dựa vào những gì tôi chắc chắn về
Đây là một ví dụ về mã nguồn CakePHP dễ bị tấn công
9Bây giờ, để bảo mật mã nguồn này, tất cả những gì bạn cần làm là gọi hàm h[]. Chức năng này chịu trách nhiệm lọc đầu vào của người dùng và làm cho nó an toàn
Dưới đây là một ví dụ về cách khắc phục sự cố này
0Tuy nhiên, chức năng này sử dụng htmlspecialchars[] để lọc dữ liệu mà như chúng ta đã thảo luận trong các phần trước, vẫn có thể dễ bị tiêm thuộc tính. Vì vậy, đừng ngần ngại thêm nhiều chức năng để lọc dữ liệu này tùy thuộc vào tình huống
Cách ngăn chặn cuộc tấn công XSS trong FuelPHP
Fuel PHP Framework là một trong những PHP framework đơn giản và nhanh nhất được sinh ra từ những khái niệm tốt nhất của các framework trước đó. Điều đó có nghĩa là các nhà phát triển của khuôn khổ này cũng quan tâm đến tính bảo mật của mã nguồn được sản xuất. Để ngăn chặn các cuộc tấn công XSS trên các khung FuelPHP, nên sử dụng chức năng xss_clean[] khi đầu vào của người dùng được hiển thị
Trên thực tế, bạn thậm chí có thể tự động hóa quy trình này bằng cách thay đổi tham số “bảo mật” tồn tại trong đường dẫn sau. ứng dụng/cấu hình/cấu hình. php to
1Tùy chọn lọc tự động đầu vào không được bật theo mặc định
Tuy nhiên, công nghệ tự động này không thực sự được khuyến khích, vì hiệu suất của ứng dụng web của bạn sẽ giảm xuống. Tôi thực sự khuyên khách hàng của mình sử dụng hàm xss_clean, để chỉ lọc dữ liệu người dùng sẽ được hiển thị ở đâu đó
Đây là một mã dễ bị tổn thương trông giống như trong FuelPHP
2Mã này dễ bị tấn công XSS vì đầu vào của người dùng được hiển thị trực tiếp mà không có bất kỳ bộ lọc nào
Để sửa mã này, tất cả những gì bạn cần làm là gọi hàm xss_clean[] như ví dụ sau
3Hàm xss_clean thực sự hoạt động giống như hàm Codeigniter xss_clean, có nghĩa là vấn đề về thuộc tính cũng sẽ không tồn tại ở đây
Cách ngăn chặn tấn công XSS trong Zend
Zend cũng là một framework PHP nổi tiếng có sẵn dưới dạng một dự án mã nguồn mở. Zend giới thiệu thoát theo ngữ cảnh dựa trên các quy tắc được đánh giá ngang hàng, cho phép các nhà phát triển thoát khỏi đầu ra và bảo vệ chống lại XSS và các lỗ hổng khác
Để ngăn chặn cuộc tấn công XSS trong Zend, đầu vào của người dùng cần được thoát bằng một trong các chức năng sau tùy thuộc vào ngữ cảnh
- thoátHtml
- thoátHtmlAttr
- thoátJs
- thoátCss
- url thoát
Các chức năng đó là một phần của lớp thoát có tên Zend\Escaper\Escaper. Tùy thuộc vào vị trí hiển thị dữ liệu người dùng mà bạn nên sử dụng đúng chức năng. Dưới đây là một số ví dụ về cách sử dụng này
- mã dễ bị tổn thương
4- Sử dụng đúng chức năng
5- mã dễ bị tổn thương
6- Sử dụng đúng chức năng
7Cá nhân tôi thực sự thích cách nhóm Zend xử lý vấn đề này. Việc chia bộ lọc thành nhiều trường hợp không có tác động đáng chú ý đến việc thực thi mã nguồn. Ngoài ra, tập trung vào các kỹ thuật khai thác có thể được sử dụng thực sự không phải là một ý tưởng hay, vì không ai biết liệu một kỹ thuật mới có thể xuất hiện trong tương lai hay không.
Tôi không nói rằng các giải pháp được đề xuất bởi các khuôn khổ khác, không hoạt động, nhưng đối với tôi, giải pháp Zend là giải pháp tốt nhất
Tôi thực sự đã cố gắng hết sức để bao gồm tất cả các khung công tác PHP phổ biến nhất để giúp mọi người bảo mật các ứng dụng của họ. Tuy nhiên, nếu bạn thấy rằng tôi có thể bỏ lỡ một số khung công tác PHP khác, vui lòng để lại nhận xét bên dưới và tôi sẽ rất sẵn lòng bổ sung khung công tác này 😉
Được viết bởi. z. Oualid
Đánh giá nó
1 2 3 4 5
Thông tin về các Tác giả
Z. Oualid
Tôi là Chuyên gia An ninh mạng, tôi đã làm việc với nhiều công ty trên toàn cầu để bảo mật các ứng dụng và mạng của họ. Tôi được chứng nhận OSCP và OSCE, đây là những chứng chỉ kỹ thuật khó và được công nhận nhất trong ngành an ninh mạng. Tôi cũng là một hacker có đạo đức được chứng nhận [CEH]. Tôi hy vọng bạn thích bài viết của tôi. ]
Bài trước
hôm nay17 tháng 3, 2021
insert_link chia sẻ
An ninh mạng Z. Oualid
KPI bảo mật ứng dụng web là gì?An ninh mạng là một trong những công việc quan trọng nhất trong một công ty. Thật không may, hầu hết mọi người không biết cách giải thích và bảo vệ khía cạnh này. Để có thể bảo vệ