Tại sao tôi nên sử dụng esc_url?


12

Điều này làm cho mã hóa của tôi khó khăn. Wordpress codex lý do việc sử dụng esc_url bằng cách nói mơ hồ về bảo mật. Nhưng nó có thực sự đáng giá?

Ví dụ, lợi ích bảo mật thiết thực, quan trọng bằng cách sử dụng là gì

<?php echo esc_url( home_url( '/' ) ); ?>

thay vì

<?php echo home_url() ?>

PS: Tôi không nói về phát triển chủ đề, mà là về một trang web cụ thể.

Câu trả lời:


12

Nếu bạn kiểm tra tài liệu về Xác thực dữ liệu, nó sẽ theo sau để nói về chức năng:

Luôn sử dụng esc_url khi vệ sinh URL (trong các nút văn bản, nút thuộc tính hoặc bất kỳ nơi nào khác). Từ chối các URL không có một trong các giao thức được liệt kê trong danh sách trắng [...], loại bỏ các ký tự không hợp lệ và xóa các ký tự nguy hiểm.

Ở đó bạn có nó - lợi ích bảo mật thực tế. Giao thức hợp lệ, không có ký tự mờ.

Câu trả lời về sự cần thiết là chắc chắn . Thoát khỏi đầu ra là thực hành bảo mật cơ bản nhất.


2
Với tất cả sự tôn trọng, tôi không thể thấy cách liên kết nhà chẳng hạn có thể gây ra rủi ro bảo mật. Có lẽ những hướng dẫn này là để tạo chủ đề và không áp dụng cho mã "riêng tư"? Rốt cuộc, có lẽ tốt nhất là mã hóa địa chỉ nhà và các liên kết khác trong html và hoàn toàn không sử dụng php nếu có rủi ro bảo mật?
IXN

9
Việc áp dụng các thực tiễn bảo mật một cách nhất quán và phổ biến sẽ hiệu quả hơn nhiều so với tranh luận nếu mỗi trường hợp đều có giá trị. :)
Rarst

7
Mặt khác, một tài nguyên được đề xuất bởi Codex thiết lập Quy tắc số 3: Tin tưởng WordPress . Điều này dường như khuyến nghị chống lại quá mức các chức năng cốt lõi của wp như home_url(), nếu được sử dụng trong bối cảnh thích hợp của chúng. Theo khuyến nghị này, tôi đã dự kiến ​​sẽ home_urlthực hiện vệ sinh riêng của mình.
Franco

3

tốt, tất cả đầu vào của người dùng nên được vệ sinh ... Nếu url bạn tiêm không phải là đầu vào của người dùng (ví dụ: cài đặt trang bởi một người mà bạn hoàn toàn tin tưởng, các giá trị được mã hóa cứng) thì bạn có thể tự giải thoát khỏi url thoát.

nhưng nếu tôi có thể tiêm url đó vào trang web của bạn, tôi có thể dễ dàng tiêm mã js hoặc mã chuyển hướng ... hoặc thậm chí mã phía máy chủ trong một số trường hợp.

điều này có thể dẫn đến chiếm quyền điều khiển phiên và tài khoản người dùng của bạn bị đánh cắp và các tùy chọn xấu khác.

Biên tập:

Trong ví dụ của bạn, esc_url( home_url( '/' ) );
nó hoạt động trên một giá trị bán cứng! do đó esc_urlcó thể được loại bỏ.
Điều đó nói rằng tôi vẫn không thấy lý do tại sao phải phân biệt sự khác biệt giữa khi có mối đe dọa và khi không có và nói chung sẽ đề nghị giữ esc_url () cho mọi giá trị.


3
"Cài đặt trang bởi người bạn tin tưởng" vẫn là đầu vào của người dùng. :)
Rarst

@Rarst yeah, tôi với bạn, nhưng anh ấy rất "ghê tởm" khi sử dụng esc_url, tôi đã tha thứ hơn một chút.
Tomer W

2

Một điều nữa phải được lưu ý trong đầu esc_url()là về một cái gì đó như. Nếu <a href="SANITIZE_THIS_URL">your_text</a>bạn sẽ sử dụng URL trong đầu ra HTML của mình, như thuộc tính href cho liên kết hoặc thuộc tính src cho thành phần hình ảnh, bạn nên sử dụng esc_url().

esc_url_raw()dành cho các trường hợp khác mà bạn muốn có một URL sạch, nhưng bạn không muốn các thực thể HTML được mã hóa. Vì vậy, bất kỳ việc sử dụng không phải HTML (DB, redirect) sẽ sử dụng điều này.

Các esc_url_raw()chức năng sẽ làm được khá nhiều giống như esc_url(), nhưng nó sẽ không tổ chức giải mã, có nghĩa là nó sẽ không thay thế & với & # 038 và vân vân. Như Mark đã chỉ ra, nó an toàn khi sử dụng esc_url_raw()trong các truy vấn cơ sở dữ liệu, chuyển hướng và các hàm HTTP, chẳng hạn như `wp_remote_get () 'để biết thêm thông tin về esc_url_raw ()


1

esc_url được sử dụng để tạo HTML hợp lệ (không vệ sinh đầu vào). Bạn nên sử dụng điều này bất cứ lúc nào bạn không chắc chắn 100% rằng những gì bạn muốn xuất là một HTML hợp lệ cho bối cảnh đó.


Tất cả các chức năng thoát hiểm rõ ràng là để vệ sinh.
Hết
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.