Tôi thực sự là một kỹ sư tại VIP, người thực hiện nhiều đánh giá mã :) Tôi đánh dấu rất nhiều việc bỏ trốn.
nhưng không thoát đầu ra
Không hoàn toàn, nó không thoát khỏi đầu ra, điều này gây ngạc nhiên cho hầu hết mọi người. Điều này là bởi vì nếu bạn là một quản trị viên siêu hạng, bạn có unfiltered_html
khả năng, vì vậy nó không thể thoát khỏi đầu ra. Thay vào đó, nó chạy qua wp_kses_post
đầu vào. Lý tưởng nhất là bạn sẽ loại bỏ khả năng đó mặc dù.
Đây là cách thực hiện tại thời điểm hiện tại:
function the_content( $more_link_text = null, $strip_teaser = false ) {
$content = get_the_content( $more_link_text, $strip_teaser );
/**
* Filters the post content.
*
* @since 0.71
*
* @param string $content Content of the current post.
*/
$content = apply_filters( 'the_content', $content );
$content = str_replace( ']]>', ']]>', $content );
echo $content;
}
Mặt khác, cơ chế lý tưởng để thoát khỏi mọi thứ đi qua the_content
bộ lọc là:
echo apply_filters( 'the_content', wp_kses_post( $content ) );
Bằng cách này, chúng tôi làm cho nội dung an toàn, sau đó chạy nó qua bộ lọc, tránh việc nhúng v.v ... bị loại bỏ.
Vậy tại sao lại trốn thoát
Điểm thoát là tạo HTML hợp lệ, bảo mật được thêm vào mà nó cung cấp chỉ là một hiệu ứng phụ đẹp.
Để ngăn chặn người dùng vô tình phá vỡ đánh dấu
Có nhiều lý do để trốn thoát, nhưng về cơ bản, bạn đang thực thi những kỳ vọng. Lấy mã sau:
<a href="<?=$url?>">
Chúng tôi hy vọng $url
có chứa một URL phù hợp cho một href
thuộc tính, nhưng nếu không thì nó là gì? Tại sao lại để nó có cơ hội, hãy thực thi nó:
<a href="<?=esc_url( $url )?>">
Bây giờ luôn luôn là một URL. Sẽ không có vấn đề gì nếu tin tặc đưa hình ảnh vào $url
hoặc nếu người dùng nhập sai trường hoặc có tập lệnh độc hại. Nó sẽ luôn là một URL hợp lệ vì chúng tôi đã nói nó sẽ là một URL. Chắc chắn đó có thể là một URL rất lạ, nhưng nó sẽ luôn đáp ứng kỳ vọng rằng một URL sẽ ở đó. Điều này rất tiện dụng, có thể là để xác thực đánh dấu, để bảo mật, v.v.
Đã nói rằng, trốn thoát không phải là xác nhận, thoát ra không phải là vệ sinh. Đó là những bước riêng biệt xảy ra tại các điểm khác nhau trong vòng đời. Thoát khỏi lực lượng để đáp ứng mong đợi, ngay cả khi nó mang lại cho họ để làm như vậy.
Đôi khi tôi thích nghĩ về việc trốn thoát như một trong những trò chơi của Nhật Bản với bức tường bọt khổng lồ với những đường cắt ra. Các thí sinh phải phù hợp với hình dạng con chó hoặc chúng bị loại bỏ, chỉ với mục đích của chúng tôi có laser và dao xung quanh lỗ. Bất cứ thứ gì còn lại ở cuối sẽ có hình con chó, và nó sẽ không tha thứ và nghiêm ngặt nếu bạn chưa có hình con chó.
Nhớ lại:
- vệ sinh sớm
- xác nhận sớm
- thoát muộn
- trốn thoát thường xuyên
Bảo mật là một bước gồm nhiều bước, nhiều lớp phòng thủ, thoát là một trong những lớp phòng thủ bên ngoài trên đầu ra. Nó có thể mang mã tấn công vào một trang web bị xâm nhập khiến nó trở nên vô dụng, ngăn chặn các khai thác mở và đảm bảo khách hàng của bạn không phá vỡ một trang web bằng cách đặt các thẻ vào một trường mà họ không nên. Nó không phải là một thay thế cho những thứ khác, và nó là công cụ bảo mật được sử dụng nhiều nhất trong sổ tay nhà phát triển.
Vì sao phải trốn nếu the_content
không? Nếu bạn có một trận lụt sắp tới, và 5 lỗ trên tường, nhưng chỉ có thời gian để sửa 3, bạn có nhún vai và sửa không? Hay bạn giảm thiểu rủi ro và giảm khu vực tấn công?
Có lẽ tôi có thể giúp sửa 2 lỗ cuối cùng với đoạn trích này:
add_filter( 'the_content' function( $content ) {
return wp_kses_post( $content );
}, PHP_INT_MAX + 1 );
Ở đây chúng tôi đặt mức độ ưu tiên thành số cao nhất có thể có trong PHP, sau đó thêm 1 để nó tràn vào số thấp nhất có thể có thể được biểu diễn. Bằng cách này, tất cả các lệnh gọi the_content
sẽ thoát giá trị trước bất kỳ bộ lọc nào khác. Cách này nhúng vv vẫn hoạt động, nhưng người dùng không thể lẻn vào HTML nguy hiểm thông qua cơ sở dữ liệu. Ngoài ra, xem xét loại bỏ unfiltered_html
khả năng khỏi tất cả các vai trò
wp_kses_post