Chức năng PHP nào có thể giúp ngăn chặn Cross Site Scripting

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" 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[]6
htmlentities[]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

1

Sau đó, 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

3

Là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ụ

4

Hà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

5

Cá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

6

hiể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

7

Thê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

8

Trê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

9

Bâ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

0

Tuy 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

1

Tù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

2

Mã 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

3

Hà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
7

Cá 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ẻ

    e-mail

    Thoát

    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ệ

    Chức năng nào sẽ giúp ngăn chặn chéo

    Làm sạch HTML . Kiểu dáng sẽ không được hiển thị. Trong những trường hợp này, nên sử dụng HTML Sanitization. HTML Sanitization sẽ loại bỏ HTML nguy hiểm khỏi một biến và trả về một chuỗi HTML an toàn.

    chữ thập là gì

    Các cuộc tấn công Cross-Site Scripting [XSS] là một dạng tấn công tiêm nhiễm, trong đó các tập lệnh độc hại được đưa vào các ứng dụng web đáng tin cậy . XSS thường được chèn qua một trang web bằng siêu liên kết hoặc biểu mẫu web. Mã được chèn có thể được sử dụng thông qua bất kỳ ngôn ngữ phía máy khách nào như JavaScript, PHP, HTML.

    Chính sách nào sau đây giúp ngăn chặn chéo

    Chính sách bảo mật nội dung [CSP] là một tiêu chuẩn W3C được giới thiệu để ngăn chặn Cross-Site Scripting [XSS], clickjacking và các cuộc tấn công khác do tiêm mã vào một trang web

    Mã hóa URL có ngăn XSS không?

    Không có phương pháp mã hóa nào có thể ngăn chặn điều đó, bạn nên cố gắng chặn các lược đồ URI javascript cùng với tất cả các lược đồ URI khác sẽ cho phép XSS ở đó, chẳng hạn như dữ liệu. và đốm màu. Ví dụ. Hành động được đề xuất là không phản ánh trực tiếp đầu vào của người dùng vào một liên kết

    Chủ Đề