Jaka jest różnica między esc_html, esc_attr, esc_html_e i tak dalej?

13

Dostałem opinię od ochroniarza, który zwrócił uwagę, że powinienem użyć poprawnego ucieczki od danych wejściowych użytkownika w moim kodzie. Przeprowadziłem więc badania i znalazłem funkcje ucieczki.

Jaka jest różnica między nimi? Kiedy powinienem używać esc_html()i kiedy esc_attr()? A kiedy powinienem używać tych funkcji _e()na końcu?

baldrick
źródło
1
Czy przeczytałeś dokumentację ?
Jacob Peattie,
2
Tak i to jeszcze bardziej mnie zdezorientowało :(
baldrick

Odpowiedzi:

21

esc_html()unika ciągu, aby nie był analizowany jako HTML. Znaki takie <&lt;na przykład konwertowane na. Będzie to wyglądać tak samo dla czytnika, ale oznacza to, że jeśli wyświetlana jest wartość, <script>to nie będzie interpretowana przez przeglądarkę jako rzeczywisty znacznik skryptu.

Użyj tej funkcji, ilekroć wyprowadzana wartość nie powinna zawierać HTML.

esc_attr()unika ciągu, dzięki czemu można go bezpiecznie używać w atrybucie HTML, class=""na przykład. Zapobiega to wyrwaniu się wartości atrybutu HTML. Na przykład, jeśli wartość wynosi "><script>alert();</script>i próbujesz wyprowadzić ją w atrybucie HTML, zamknie bieżący znacznik HTML i otworzy znacznik skryptu. To jest niebezpieczne. Po usunięciu wartości nie będzie w stanie zamknąć atrybutu HTML oraz oznaczyć i wygenerować niebezpiecznego kodu HTML.

Użyj tej funkcji, gdy wyprowadzasz wartość wewnątrz atrybutu HTML.

esc_url() unika ciągu, aby upewnić się, że jest to prawidłowy adres URL.

Użyj tej funkcji, gdy wypisujesz wartość wewnątrz atrybutu href=""lub src="".

esc_textarea()ucieka z wartości, aby można było bezpiecznie używać jej w <textarea>elemencie. Poprzez ucieczkę wartości za pomocą tej funkcji zapobiega ona <textarea<zamykaniu <textarea>elementu i wysyłaniu własnego kodu HTML przez wartość wyprowadzaną wewnątrz a .

Użyj tej funkcji, gdy wyprowadzasz wartość wewnątrz <textarea>elementu.

esc_html()a esc_attr()także wersje kończące się __(), _e()a _x(). Są one przeznaczone do wyprowadzania ciągów podlegających tłumaczeniu.

WordPress posiada funkcje __(), _e()a _x()na wpisywanie tekstu, który może być tłumaczone. __() zwraca ciąg do przetłumaczenia, _e() powtarza ciąg do przetłumaczenia i _x()zwraca ciąg do tłumaczenia w danym kontekście. Prawdopodobnie widziałeś ich wcześniej.

Ponieważ niekoniecznie można ufać plikowi tłumaczenia, który zawiera bezpieczne wartości, użycie tych funkcji podczas wyprowadzania łańcucha do przetłumaczenia gwarantuje, że wyprowadzane ciągi nie mogą powodować tego samego problemu opisanego powyżej.

Używaj tych funkcji przy wysyłaniu ciągów do przetłumaczenia.

Jacob Peattie
źródło
2
Należy pamiętać, że domyślnie nie ma różnicy pomiędzy esc_htmli esc_attrstosowany jest ten sam kod (oni po prostu mają inny nieużywany filtr): wordpress.stackexchange.com/questions/264698/...
baptx
4

esc_htmlbyłby używany wewnątrz html, na przykład między <p>tagiem

<p><?php echo esc_html( $some_variable ); ?></p>

esc_attr byłby używany do zmiany wartości atrybutów w tagach HTML takich jak:

<p my-attribute="<?php echo esc_attr( $some_variable ); ?>"></p>

zastosowanie _edo końca służy do używania go z domenami tekstowymi i automatycznie wyświetli dla ciebie echo, np .:

<p><?php esc_html_e( 'some-text', 'text-domain' ); ?></p>

<p my-attribute="<?php esc_attr_e( 'some-text', 'text-domain' ); ?>"></p>

oprócz tego _eistnieje również to, __co robi to samo, _eale nie echo, więc możesz zapisać go w zmiennej.

jrmd
źródło
2
_esłuży nie tylko do echa, ale także do lokalizacji. Dlatego powinien być używany tylko wtedy, gdy ciąg znaków jest przekazywany do funkcji i powinien zawierać domenę tekstową. Twój ostatni przykład niewłaściwie go używa.
Jacob Peattie,
@JacobPeattie mój zły, zaktualizuję ... EDYCJA Naprawiono
jrmd