Mã PHP dễ bị tấn công XSS

Ngăn chặn các lỗ hổng Cross-site Scripting (XSS) trong tất cả các ngôn ngữ yêu cầu hai cân nhắc chính. loại vệ sinh được thực hiện trên đầu vào và vị trí mà đầu vào đó được chèn vào. Điều quan trọng cần nhớ là cho dù đầu vào được lọc tốt đến đâu; . Yêu cầu lọc phụ thuộc nhiều vào ngữ cảnh mà dữ liệu được chèn vào. Ngăn chặn XSS với dữ liệu được chèn vào giữa các phần tử HTML rất đơn giản. Mặt khác, việc ngăn XSS bằng dữ liệu được chèn trực tiếp vào mã JavaScript khó hơn đáng kể và đôi khi là không thể

Vệ sinh đầu vào

Đối với phần lớn các ứng dụng PHP, htmlspecialchars() sẽ là người bạn tốt nhất của bạn. htmlspecialchars() được cung cấp không có đối số sẽ chuyển đổi các ký tự đặc biệt thành các thực thể HTML, bên dưới hiển thị các chuyển đổi được thực hiện

'&' (ampersand) becomes '&'
'"' (double quote) becomes '"'
'<' (less than) becomes '<'
'>' (greater than) becomes '>'

Độc giả mắt đại bàng có thể nhận thấy điều này không bao gồm dấu ngoặc đơn. Vì lý do này, chúng tôi khuyên rằng htmlspecialchars() luôn được sử dụng với 'ENT_QUOTES' để đảm bảo các trích dẫn đơn sẽ được mã hóa. Dưới đây hiển thị chuyển đổi đối tượng trích dẫn đơn

"'" (single quote) becomes ''' (or ')  

htmlspecialchars() so với htmlentities()

Một chức năng khác tồn tại gần giống với htmlspecialchars(). Tuy nhiên, htmlenities() thực hiện khử trùng chức năng tương tự đối với các ký tự nguy hiểm, mã hóa tất cả các thực thể ký tự khi có sẵn. Điều này có thể dẫn đến mã hóa quá mức và khiến một số nội dung hiển thị không chính xác nếu bộ ký tự thay đổi

dải_tags()

strip_tags() KHÔNG nên được sử dụng riêng cho việc làm sạch dữ liệu. strip_tags() xóa nội dung giữa các thẻ HTML và không thể ngăn các trường hợp XSS tồn tại trong các thuộc tính thực thể HTML. strip_tags() cũng không lọc hoặc mã hóa các dấu ngoặc góc đóng không được ghép nối. Kẻ tấn công có thể kết hợp điều này với các điểm yếu khác để đưa JavaScript đầy đủ chức năng vào trang. Chúng tôi khuyến nghị rằng chỉ nên sử dụng strip_tags() cho mục đích chức năng đã định của nó. để xóa các thẻ hoặc nội dung HTML. Trong những trường hợp này, đầu vào phải được chuyển qua htmlspecialchars() sau khi sử dụng strip_tags()

dấu gạch chéo()

addlashes() thường được dùng để thoát đầu vào khi được chèn vào các biến JavaScript. một ví dụ đã được biểu diễn ở dưới

http://www.example.com/view.php?name=te"st
[...]

As we can see, addslashes() adds a slash in attempt to prevent an attacker from terminating the variable assignment and appending executable code. This works, sort of, but has a critical flaw. Most JavaScript engines will construct code segments from open and closed "; displayname(var);

Đối với trình duyệt, mã được đưa vào là một đoạn mã hoàn toàn mới và chứa JavaScript hợp lệ

Trường hợp mã hóa thực thể không thành công

Trước đây chúng ta đã nói về những cân nhắc đối với vị trí của dữ liệu và sẽ xem xét một số ví dụ trong đó mã hóa thực thể bằng htmlspecialchars() là không đủ. Một trong những ví dụ phổ biến nhất về điều này là khi dữ liệu được chèn vào trong thẻ hoặc thuộc tính thực tế của một phần tử

Thuộc tính sự kiện HTML. HTML có một số thành phần có thuộc tính cho phép gọi JavaScript sau một sự kiện cụ thể. Ví dụ: thuộc tính onload có thể thực thi JavaScript khi một đối tượng HTML được tải

Đây chỉ là một trong nhiều tình huống hơi hiếm khi cần phải lọc cực kỳ nghiêm ngặt. Để có cái nhìn sâu hơn về nhiều tình huống tiêm nhiễm và các phương pháp ngăn chặn chúng, hãy xem Bảng gian lận ngăn chặn XSS của OWASP

Thư viện PHP của bên thứ ba

Virtue Security không đưa ra khuyến nghị hoặc cung cấp bất kỳ bảo hành nào cho các sản phẩm hoặc phần mềm của bên thứ ba; . Dưới đây là các dự án có thể hỗ trợ nhà phát triển xây dựng danh sách trắng phù hợp

Trình lọc HTML – http. //htmlbộ lọc. org/
PHP Anti-XSS – https. //mã số. Google. com/p/php-antixss/
htmLawed – http. //www. tin sinh học. org/phplabware/internal_utilities/htmLawed/

Những điều khác cần nhớ

Một nguyên tắc nhỏ tuyệt vời để thực hiện đơn giản là không chèn dữ liệu do người dùng kiểm soát trừ khi nó cần thiết một cách rõ ràng để ứng dụng hoạt động. Thật ngạc nhiên khi thấy các lỗ hổng XSS tồn tại vì các tham số được chèn vào các nhận xét HTML hoặc JavaScript. Điều này không chỉ không phục vụ mục đích chức năng nào cho ứng dụng mà còn có thể gây ra các lỗ hổng bảo mật nghiêm trọng

PHP có dễ bị tấn công XSS không?

XSS thường được chèn qua trang web bằng cách sử dụ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. Một cuộc tấn công XSS đơn giản sẽ xảy ra trên một trang web có lỗ hổng chấp nhận dữ liệu đầu vào của người dùng thông qua tham số GET và hiển thị dữ liệu trên trang web .

Bảo vệ chống lại XSS trong PHP là gì?

Sử dụng hàm htmlspecialchars() – Hàm htmlspecialchars() chuyển đổi các ký tự đặc biệt thành các thực thể HTML. Đối với phần lớn các ứng dụng web, chúng tôi có thể sử dụng phương pháp này và đây là một trong những phương pháp phổ biến nhất để ngăn chặn XSS. Quá trình này còn được gọi là Thoát HTML.

Ngôn ngữ nào dễ bị XSS?

Các cuộc tấn công XSS có thể xảy ra trong VBScript, ActiveX, Flash và thậm chí cả CSS . Tuy nhiên, chúng phổ biến nhất trong JavaScript, chủ yếu là do JavaScript là nền tảng cho hầu hết các trải nghiệm duyệt web.

XSS có phải là một lỗ hổng không?

Tập lệnh chéo trang (còn được gọi là XSS) là một lỗ hổng bảo mật web cho phép kẻ tấn công xâm phạm các tương tác mà người dùng có với một ứng dụng dễ bị tấn công. Nó cho phép kẻ tấn công phá vỡ chính sách gốc giống nhau, được thiết kế để tách biệt các trang web khác nhau với nhau.