Sự khác biệt giữa esc_url () và esc_url_raw ()


9

http://core.trac.wordpress.org/browser/trunk/wp-includes/formatted.php#L2239

Tôi bối rối về việc khi nào nên sử dụng một trong hai.

Giả sử tôi có URL này : http://site.com/?getsomejavascript=1, được tạo động javascript:

  • nếu tôi bao gồm tập lệnh với esc_url(add_query_arg('apples', 420)), tôi nhận được http://site.com/?getsomejavascript=1&apples=420và nó bị hỏng vì những #038;tham chiếu đó

  • nếu tôi sử dụng, esc_url_raw(add_query_arg('apples', 420))tôi nhận được URL chính xác:http://site.com/?getsomejavascript=1&apples=420

nhưng trong tài liệu tôi phát hiện ra rằng esc_url_raw chỉ nên được sử dụng để thoát URL được chèn trong cơ sở dữ liệu ...

Câu trả lời:


10

Từ mục Codex để xác thực dữ liệu: URL :

esc_url( $url, (array) $protocols = null ) (kể từ 2.8)

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 (mặc định là http, https, ftp, ftps, mailto, news, irc, gopher, nntp, feed và telnet), loại bỏ các ký tự không hợp lệ và loại bỏ các ký tự nguy hiểm. Không dùng nữa kể từ 3.0: clean_url () Hàm này mã hóa các ký tự dưới dạng các thực thể HTML: sử dụng nó khi tạo tài liệu HTML hoặc XML (X). Mã hóa ký hiệu (&) và dấu ngoặc đơn (') dưới dạng tham chiếu thực thể số (&,').

esc_url_raw( $url, (array) $protocols = null ) (kể từ 2.8)

Để chèn một URL trong cơ sở dữ liệu. Hàm này không mã hóa các ký tự dưới dạng các thực thể HTML: sử dụng nó khi lưu trữ URL hoặc trong các trường hợp khác khi bạn cần URL không được mã hóa. Chức năng này có thể được sao chép trong hàm Clean_url cũ bằng cách đặt $ bối cảnh thành db.

Vì vậy, sự khác biệt chính xuất hiện là:

  1. esc_url()mã hóa các thực thể HTML, trong khi esc_url_raw()không
  2. esc_url()được dành cho đầu ra , trong khi esc_url_raw()được dành cho lưu trữ cơ sở dữ liệu

BIÊN TẬP:

Vì bạn đang mã hóa cứng (hoặc lưu / lưu trữ riêng biệt) URL thực tế từ chuỗi truy vấn và sau đó nối thêm chuỗi truy vấn qua [add_query_arg()][2], có thể tốt hơn là thoát chuỗi truy vấn được nối của bạn qua esc_js(), thay vì esc_url()?

Ví dụ:

add_query_arg( esc_js( 'apples' ), esc_js( '420' ), $myurl )

2
ok, nhưng esc_url()nó không hoạt động chính xác khi bạn có các đối số truy vấn trong một URL mà bạn muốn xuất ra
onetrickpony

Điều gì về việc sử dụng esc_js()để thoát chỉ dữ liệu được thêm thông qua add_query_arg()? Xem chỉnh sửa trong câu trả lời, ở trên.
Chip Bennett

Tôi đã không thử nó, nhưng điều đó không có ý nghĩa :) cả esc_js ('táo') hoặc 'táo' sẽ trở lại apples. Vấn đề nằm ở add_query_arg khi tham gia 'táo' với các đối số khác với&
onetrickpony

Sau đó, nếu dữ liệu được tin cậy (tức là tĩnh), tại sao lại thoát được?
Chip Bennett

Tôi không hoàn toàn chắc chắn rằng nó không an toàn để thoát khỏi nó. Về cơ bản, tôi bao gồm cả tập lệnh sử dụng một cái gì đó như<script type="text/javascript" src="<?= $_SERVER['REQUEST_URI'] ?>'/?javascriptcode=1"></script>
onetrickpony
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.