Wykrywanie języka przeglądarki

0

Ten krótki skrypt PHP wykrywa język przeglądarki i odsyła użytkownika odpowiednio do polskiej lub angielskiej wersji strony WWW. Czy nie ma w nim żadnych luk bezpieczeństwa?

<?php
  # Rozpoznaj język wykorzystywanej przeglądarki
  $lang = $_SERVER["HTTP_ACCEPT_LANGUAGE"];
  if ($lang && strpos ($lang, "PL")) {
    header ("Location: http://manna5.c1.biz/index_pl.htm");
  } else {
    header ("Location: http://manna5.c1.biz/index_en.htm");
  }
?>
2

Ten kod, na moje oko, chyba nawet nie będzie działał.

Jeśli przyjmiemy, że luką bezpieczeństwa będzie zawał deva, który będzie to czytał to ma luki.
Jak widzę tego jeżyka to mi słabo. Zamień to na jakieś lang czy coś podobnego.

Tutaj masz przykład użycia z nutką rozszerzalności:
https://stackoverflow.com/questions/3770513/detect-browser-language-in-php

1

@Manna5:

Zakładając, że wszystkie strony-córki są w PHP, a widząc ciężkie poty jakie idą z autora, to mix kodu i zawartości w pehapowej kaszance, to kiepsko to widzę.
Po niewielkim czasie będzie np kod rozbieżny w wersjach językowych. A to jest zagrożenie dla projektu.

Dasz kopię strony tłumaczowi do przerobienia np na ukraiński ??? Będzie tłumaczył miesiąc ... ile w tym czasie się rozwinie kod w silniku strony, kto to naniesie?

W profesjonalnej informatyce to się robi zupełnie inaczej - takie pomysły to były w drugiej połowie lat 1990-tych

1

No bardziej bezpiecznie byłoby korzystać z https.

0

No bardziej bezpiecznie byłoby korzystać z https.

Chodzi mi o bezpieczeństwo samego skryptu. Poza tym sama strona jest statyczną stroną z danymi kontaktowymi, użytkownik nie wprowadza tam żadnych danych, które potencjalnie można by szyfrować.

1

Chodzi Tobie o samo bezpieczeństwo.
Ogólnie w serwerach http request ma zazwyczaj limit do kilku/kilkunastu/kilkudziesięciu KB.
Dla przykładu w apachu masz LimiRequest... .

Faktycznie jakby ktoś się uparł to może wysyłać ten header maksymalnej wielkości spowalniając pracę serwera.
Takie działanie powinno być blokowane nie tyle na samej warstwie http co na poziomie IDS/IPS (jeśli pole ma więcej niż ... to odrzuć request i bloknij prewencyjnie).
Jednak tanie hostingi pewnie nie mają czegoś takiego więc wtedy, taka sytuacja jest możliwa.

Skrypt ze strony, którą podałem z substr niweluje ten problem, natomiast u Ciebie jest przeszukiwanie zmiennej do znalezienia, więc w tym wypadku może powodować to problemy z wydajnością przy DOSzeniu serwera takimi requestami.

2
ZrobieDobrze napisał(a):

W profesjonalnej informatyce to się robi zupełnie inaczej - takie pomysły to były w drugiej połowie lat 1990-tych

Więc powiem Ci, że w profesjonalnych serwisach tak się robi... bo wersje językowe to wcale nie musi być jedynie kwestia tłumaczeń, Strony mogą mieć inne zestawy informacji na różnych wersjach językowych. Np. dla wersji EN może być dostępna jakaś grupa usług, których dla odbiorcy z PL nie ma... I nie ma to wszystko nic wspólnego z tłumaczeniami, które mogą być przechowywane gdziekolwiek indziej.

0

@malencki: Wreszcie jakaś sensowna uwaga. Z tego co zrozumiałem, to chodzi o to żeby ograniczyć długość łańcucha, np. tak?

<?php
  # Rozpoznaj język wykorzystywanej przeglądarki
  $lang = substr ($_SERVER["HTTP_ACCEPT_LANGUAGE"], 0, 100);
  if ($lang && strpos ($lang, "PL")) {
    header ("Location: http://manna5.c1.biz/index_pl.htm");
  } else {
    header ("Location: http://manna5.c1.biz/index_en.htm");
  }
?>
0
katakrowa napisał(a):
ZrobieDobrze napisał(a):

W profesjonalnej informatyce to się robi zupełnie inaczej - takie pomysły to były w drugiej połowie lat 1990-tych

Więc powiem Ci, że w profesjonalnych serwisach tak się robi... bo wersje językowe to wcale nie musi być jedynie kwestia tłumaczeń, Strony mogą mieć inne zestawy informacji na różnych wersjach językowych. Np. dla wersji EN może być dostępna jakaś grupa usług, których dla odbiorcy z PL nie ma...

Robi, owszem, robi, ale znów - to w innym segmencie cenowym. Wtedy są to zespoły, które opanują wspólny / indywidualny kod.

Choć z tym opanowaniem jest różnie, np ebay w wersjach narodowych ma odmienne implementacje szczegółów zupełnie nie mających nic wspólnego z odmiennością biznesu (dostępność filtrów). Od daty ctrc-c ctrl-v żyją prawdopodobnie odrębnie, przynajmniej znaczne fragmenty.

... I nie ma to wszystko nic wspólnego z tłumaczeniami, które mogą być przechowywane gdziekolwiek indziej.

Złote słowa.

ZrobieDobrze napisał(a):

... ile w tym czasie się rozwinie kod w silniku strony, kto to naniesie?

Lub nie w kodzie silnika, przyjmijmy że dla zarządu korpo to im lata, ale w html/css, czyli inne odczucie użytkownika, design graficzny - a to już dla korpo ludków temat gorący

(Ktoś przypomni ten film, co cały zarząd naciska na developera, aby zrobił zielone elementy, ale w kolorze czerwonym, z manipulacyjnym podkreślaniem "To czy potrafisz sobie dać radę" )

1
Manna5 napisał(a):

Ten krótki skrypt PHP wykrywa język przeglądarki i odsyła użytkownika odpowiednio do polskiej lub angielskiej wersji strony WWW. Czy nie ma w nim żadnych luk bezpieczeństwa?

<?php
  # Rozpoznaj język wykorzystywanej przeglądarki
  $lang = $_SERVER["HTTP_ACCEPT_LANGUAGE"];
  if ($lang && strpos ($lang, "PL")) {
    header ("Location: http://manna5.c1.biz/index_pl.htm");
  } else {
    header ("Location: http://manna5.c1.biz/index_en.htm");
  }
?>

Twój skrypt jedyne co robi to odczytuje request header, i odpowiada odpowiednim response headerem. Więc tutaj nie ma nic co ktoś mógłby "wykraść" lub zepsuć.

4

Należałoby zacząć od tego, że kod ten jest błędny, ponieważ nagłówek HTTP_ACCEPT_LANGUAGE może zawierać listę języków, wraz ze wskaźnikiem preferencji, na przykład:
Accept-Language: en; q=1.0, pl; q=0.5, de; q=0.5

Taka wartość nagłówka mówi, że preferowany jest język angielski, ale akceptowalny jest również polski i niemiecki. Twój kod patrzy tylko na to, czy polski jest gdzieś na liście i jeżeli tak, to serwuje polski - nawet w wypadku, gdy znajduje się on na samym końcu tejże listy i użytkownik wolałby angielski.

0

@Sensacyjny Sebastian: Generalnie tak, lecz na ogół przeglądarki podają jeden język - ten wybrany w ustawieniach przeglądarki.

1 użytkowników online, w tym zalogowanych: 0, gości: 1