2011-02-01 14 views
7

Mam problem, z którym nigdy wcześniej się nie spotkałem i myślę, że ma on coś wspólnego z konfiguracją Apache, której nie jestem zbyt dobrze zaznajomiony.apache: zignorowane umlauty w ciągu zapytania (URL) prowadzą do 403

Najpierw jest skrypt php z formularzem wyszukiwania. formularz jest przesyłany za pośrednictwem POST.

to lista wyników wyszukiwania. tutaj oryginalne zapytanie jest przekazywane jako część adresu URL, np .: search.php? id = 1234 & query = foo. to też działa - tak długo, jak długo nie ma przesłuchiwanych znaków (äöüä ...).

tak szybko, jak to przegłosów w zapytaniu, w pierwszej części, która przesyła ciąg kwerendy jak działa POST, ale przepuszczenie (urlencoded) w adresie URL prowadzi do 403.

tak:

  • search.php?id=1234&query=bar działa
  • search.php?id=1234&query=b%E4r prowadzi do 403 (% E4 = "A" UTF-8 urlencoded)
  • search.php?id=1234&query=b%C3%A4r prowadzi do 403% C3 (% = A4 "A" UTF-8 urlencoded)
  • przesyłając umlauty poprzez POST działa

Przekonwertowałem aplikację z iso-8859-1 na utf-8, ale to nie miało znaczenia.

Sprawdziłem również to na mojej lokalnej maszynie, tutaj działa bezbłędnie - zgodnie z oczekiwaniami.

konfiguracja zdalnego serwera (gdzie nie działa):

Apache/2.2.12 (Ubuntu),
Wersja PHP 5.2.10-2ubuntu6.7, Suhosin patch 0.9.7, poprzez CGI/FastCGI

lokalna konfiguracja (tu tych samych prac):

Apache/2.2.8 (Win32) PHP/5.3.5
PHP w wersji 5 .3.5 przez mod_php

Czy ktoś ma pomysł, dlaczego zdalny apache/php-cgi nie akceptuje poprawnie zakodowanych w oknie urla?

Dodatkowe informacje: Próbowałem też utworzyć plik statyczny z umlaut w jego imieniu, a zarówno /t%C3%A4st.php i /täst.php dostać serwowane bez problemu. täst.php?foo=täst kończy się niepowodzeniem.

uwaga: ?foo=%28, gdzie 28% to "(" działa również

+0

pedantyczny, wiem, ale "ß" nie ma umlautów ... – Stephen

+0

zmartwiony :) jak nazywa się ten zestaw znaków specjalnych? – stefs

+2

czy masz moduł mod_security-like z kilkoma zepsutymi regułami? Czy dzieje się tak również z każdą inną postacią niż ascei? – arnaud576875

Odpowiedz

1

Apache nie ucieka, że ​​przeglądarka nie

Trzeba użyć urlencode i urldecode, aby uniknąć problemów z tym.. rodzaj znaków:

Niektóre przeglądarki, takie jak stary Netscape, wysyłają adres URL w formie pisemnej, z 8-bitowymi znakami.Inne, w szczególności MSIE, kodują adres URL jako UTF-8 przed wysłaniem go na serwer sieciowy, tak więc 8-bitowa postać pojawia się jako dwie litery, z których pierwsza ma zestaw 8 bitów. W nagłówkach żądań ani w żadnym miejscu nie ma wskazania, że ​​adres URL jest zakodowany w UTF-8.

+0

jestem tego świadomy. ale podejrzewam, że niektóre ustawienia apache/źle skonfigurowany mod zabezpieczeń blokują żądania, jeśli w adresie URL są pewne znaki. – stefs

+0

Innym problemem jest urldecode, który powinien być wykonywany automatycznie w php, więc nie powinno to powodować problemu, jakkolwiek jeśli twoja serwletka z serwerem 403 musi być apache, jeśli dostanie się do php i zepsuje błąd będzie 500, 403 powiedzmy, że apache nie może załadować pliku tak jak w przypadku ciągów pobierania, to musi być reguła ustawiona na serwerze apache –

Powiązane problemy