Dlaczego powinienem używać esc_url?

12

To utrudnia moje kodowanie. Kodeks Wordpress uzasadnia użycie esc_url mówiąc niejasno o bezpieczeństwie. Ale czy to naprawdę jest warte kłopotów?

Na przykład, jaka jest ważna, praktyczna korzyść z bezpieczeństwa przy użyciu

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

zamiast

<?php echo home_url() ?>

PS: Nie mówię o tworzeniu motywów, ale o konkretnej stronie.

IXN
źródło

Odpowiedzi:

12

Jeśli sprawdzisz dokumentację dotyczącą sprawdzania poprawności danych, będzie ona mogła powiedzieć o tej funkcji:

Zawsze używaj esc_url do odkażania adresów URL (w węzłach tekstowych, węzłach atrybutów lub gdziekolwiek indziej). Odrzuca adresy URL, które nie mają jednego z dostarczonych protokołów na białej liście [...], eliminuje nieprawidłowe znaki i usuwa niebezpieczne znaki.

Masz - praktyczne korzyści bezpieczeństwa. Prawidłowy protokół, brak mrocznych znaków.

Odpowiedź na konieczność jest zdecydowanie twierdząca . Ucieczka z wyjścia jest najbardziej podstawową praktyką bezpieczeństwa.

Rarst
źródło
2
Z całym szacunkiem nie widzę, jak na przykład link domowy może stanowić zagrożenie bezpieczeństwa. Może te wytyczne dotyczą tworzenia motywów i nie dotyczą kodu „prywatnego”? W końcu może najlepiej zakodować adres domowy i inne linki w html i nie używać w ogóle php, jeśli istnieje zagrożenie bezpieczeństwa?
IXN
9
Znacznie bardziej produktywne jest konsekwentne i uniwersalne stosowanie praktyk bezpieczeństwa niż debata, czy każdy przypadek jest tego wart. :)
Rarst
7
Z drugiej strony zasób zasugerowany przez Codex ustanawia zasadę nr 3: Zaufaj WordPress . Wydaje się, że jest to zalecane, aby nie przesadzać z podstawowymi funkcjami wp home_url(), jeśli są używane we właściwym kontekście. Zgodnie z tym zaleceniem spodziewałbym home_urlsię przeprowadzić własną dezynfekcję.
Franco
3

cóż, wszystkie dane wprowadzane przez użytkowników powinny zostać oczyszczone ... Jeśli adres URL, który podajesz, nie jest danymi wprowadzanymi przez użytkownika (np. ustawienie strony przez osobę, której w pełni ufasz, wartości zapisane na stałe), możesz uwolnić się od esc-url.

ale gdybym mógł wstrzyknąć ten adres URL do Twojej witryny, mógłbym łatwo wstrzyknąć kod js lub kod przekierowania ... lub nawet kod po stronie serwera w niektórych sytuacjach.

może to prowadzić do przejęcia sesji, kradzieży kont użytkowników i innych złych opcji.

Edytować:

W twoim przykładzie esc_url( home_url( '/' ) );
działało na wartości częściowo zakodowanej! dlatego esc_urlmożna go wyeliminować.
To powiedziawszy, nadal nie rozumiem, dlaczego przeszkadza rozróżnienie między momentem zagrożenia, a czasem nie ma i ogólnie sugeruje zachowanie esc_url () dla każdej wartości.

Tomer W.
źródło
3
„Ustawienie witryny przez osobę, której ufasz”, wciąż jest dosłownie wprowadzane przez użytkownika. :)
Rarst,
@Rarst tak, jestem z tobą, ale był tak „zdegustowany” za pomocą esc_url, że byłem trochę bardziej wyrozumiały.
Tomer W
2

Inną rzeczą, o której należy pamiętać, esc_url()jest coś takiego jak. <a href="SANITIZE_THIS_URL">your_text</a>Jeśli zamierzasz użyć adresu URL w danych wyjściowych HTML, na przykład atrybutu href dla łącza lub atrybutu src dla elementu obrazu, powinieneś użyć esc_url().

esc_url_raw()dotyczy innych przypadków, w których chcesz mieć czysty adres URL, ale nie chcesz, aby encje HTML były kodowane. Więc każde użycie nie HTML (DB, przekierowanie) wykorzystałoby to.

esc_url_raw()Funkcja zrobi niemal tak samo jak esc_url(), ale nie będzie dekodować podmioty, co oznacza, że nie zastąpi & z & # 038 i tak dalej. Jak zauważył Mark, można bezpiecznie używać go esc_url_raw()w zapytaniach do baz danych, przekierowaniach i funkcjach HTTP, takich jak `wp_remote_get () ', aby uzyskać więcej informacji o esc_url_raw ()

MD MUSA
źródło
1

esc_url służy do tworzenia prawidłowego kodu HTML (nie do dezynfekcji danych wejściowych). Powinieneś tego używać zawsze, gdy nie masz 100% pewności, że to, co chcesz wydrukować, to poprawny kod HTML dla tego kontekstu.

Mateusz
źródło
Cała rodzina uciekających funkcji jest wyraźnie przeznaczona do dezynfekcji.
Rarst