2012-04-17 14 views
10

Co należy zrobić, aby zawartość atrybutu href: kodowanie HTML lub URL?jak kodować atrybut href w HTML

<a href="???">link text</a> 

Z jednej strony, ponieważ atrybut href zawiera URL, powinienem użyć kodowania URL. Z drugiej strony wstawiam ten URL do HTML, więc musi być zakodowany w HTML.

Proszę, pomóżcie mi przezwyciężyć tę sprzeczność.

Dzięki.


EDIT:

Oto sprzeczność. Załóżmy, że w adresie URL mogą znajdować się znaki "<" i ">". Kodowanie URL nie ucieknie od nich, więc wewnątrz atrybutu href zostaną zarezerwowane znaki HTML, co jest niezgodne ze standardem. Kodowanie HTML będzie usuwać znaki "<" i ">", a kod HTML będzie prawidłowy, ale później pojawią się nieoczekiwane znaki "&" w adresie URL (jest to zarezerwowany znak dla adresu URL, jest używany jako ogranicznik parametrów ciągu zapytania) .

Reserved URL characters tworzy nadzbiór reserved HTML characters z wyjątkiem "<" i ">" zarezerwowanych dla HTML, ale nie dla adresu URL.


EDIT 2:

myliłam znaków '<' i '>', są one faktycznie procent uciekł przez kodowania URL. Jeśli tak, to kodowanie URL jest w tym przypadku wystarczające, nieprawdaż?

+1

Próbowałeś czegoś tak daleko? –

+2

Ten "wypróbowany czegokolwiek" mem staje się głupi. W przypadku odzyskiwania po błędzie przeglądarki dużą część kodowania danych stanowi ochrona przed problemami bezpieczeństwa. Jak powinieneś powiedzieć, że masz rację, jeśli coś próbujesz? Załóżmy, że każdy pakiet testów bezpieczeństwa ma wystarczające pokrycie? Jest to całkowicie uzasadnione pytanie o podstawową technikę. – Quentin

+0

Quentin ma mniej więcej rację, ale pozostaje pytanie, jakie sytuacje mogą być sprzeczne? Czy możesz pokazać przykład? Czy wypróbowałeś oba rozwiązania i czy oni obaj pracowali, czy oboje nie działają? –

Odpowiedz

10

Skonstruuj adres URL jak zwykle. Postępuj zgodnie z zasadami tworzenia adresów URL. Zakoduj dane, które w nim umieszczasz.

Następnie skonstruuj HTML jak zwykle. Postępuj zgodnie z zasadami konstruowania HTML. Zakoduj dane w miarę ich umieszczania.

tj. Wykonać obie (ale we właściwej kolejności).

Nie wykluczają się wzajemnie, więc nie ma sprzeczności.

Na przykład (jest to uproszczony przykład, który przyjmuje dane w $ _GET jest poprawna i istnieje, nie rób tego w realnym świecie):

$search_term = $_GET['q']; 
$page = $_GET['page']; 
$next_page = $page + 1; 
$next_page_url = 'http://example.com/search?q=' . urlencode($search_term) . '&page=' . urlencode($page); 
$html = '<a href="' . htmlspecialchars($next_page_url) . '">link text</a>'; 
+0

Dzięki, Quentin, mam twój punkt widzenia. Ale nie jestem całkiem pewien dwóch rzeczy. 1) Co by się stało, gdyby htmlspecialchars() faktycznie coś zakodowało? Jeśli tak, w adresie URL pojawią się znaki "&", co nie jest dozwolone. 2) Czy kodowanie URL może zostawić po sobie niektóre zastrzeżone znaki HTML? Myślę, że tak nie jest. –

+0

Nie ma "&" wewnątrz adresu URL. W kodzie HTML znajduje się '&'. Kod HTML zostanie przeanalizowany, a znak '&' pojawi się w DOM. Jeśli skopiujesz/wkleisz źródło HTML atrybutu do przeglądarki, to zostanie ono przerwane, ale nie powinieneś tego robić. Byłoby to również złamane, jeśli zapisałeś adres URL w pliku tekstowym, spakowałeś go gzipem, a następnie skopiuj/wkleiłeś binarną zawartość skompresowanego pliku na pasku adresu. – Quentin

+0

Nie pamiętam listy znaków, które są/nie są zakodowane w adresach URL u góry mojej głowy. Z pewnością adresy URL mogą zawierać znaki (takie jak '&'), które mają specjalne znaczenie w HTML (i które nie powinny być kodowane urlenowo, jeśli chcesz, aby miały specjalne znaczenie w adresie URL, jak na przykładzie, który dałem). – Quentin