Dziś napisał do mnie d3d!k z prośbą o rejestrację na pewnym forum, na którym jestem technicznym adminem. Zaproszenie otrzymał i kilka minut później przekazał mi tekst błędu występującego na nim. I tutaj zaczyna się sens mojego wpisu…
Błąd jest standardowym bugiem występującym w phpBB by Przemo w wersji 1.12.5. Polega on na tym, że w wypadku przekazywania parametru mode w pliku memberlist.php w postaci tablicy otrzymujemy błąd argumentu funkcji htmlspecialchars w stylu:
Warning: htmlspecialchars() expects parameter 1 to be string, array given in /home/adres
Dzieje się tak z prostego powodu. Funkcja powyższa w podstawowej formie przyjmuje jeden parametr, który musi być string-iem. W wypadku kiedy chcielibyśmy przekazać tablicę musielibyśmy każdy z jej elementów np. poprzez wpuszczenie w pętlę przefiltrować. Skrypt, a dokładniej jego autorzy nie przewidzieli takiej opcji.
D3d!k dał mi też pewien rodzaj zabezpieczenia. Nie wdając się w dyskusję na temat jego formy, powiem tylko, że nie było one prawidłowe. Pozbawiało skrypt w tym elemencie jakiegokolwiek zabezpieczenia.
Moja propozycja jest następująca. A mianowicie, należy znaleźć w pliku memberlist.php:
if ( isset($HTTP_GET_VARS['mode']) || isset($HTTP_POST_VARS['mode']) )
{
$mode = ( isset($HTTP_POST_VARS['mode']) ) ? htmlspecialchars($HTTP_POST_VARS['mode']) : htmlspecialchars($HTTP_GET_VARS['mode']);
}
else
{
$mode = 'joined';
}
Po czym zamienić na:
if ( (isset($HTTP_GET_VARS['mode']) || isset($HTTP_POST_VARS['mode'])) && ( is_array($HTTP_POST_VARS['mode']) || is_array($HTTP_GET_VARS['mode']) ) )
{
$mode = 'joined';
}
else if ( isset($HTTP_GET_VARS['mode']) || isset($HTTP_POST_VARS['mode']) )
{
$mode = ( isset($HTTP_POST_VARS['mode']) ) ? htmlspecialchars($HTTP_POST_VARS['mode']) : htmlspecialchars($HTTP_GET_VARS['mode']);
}
else
{
$mode = 'joined';
}
Doszedł jak widać jeden warunek. Sprawdza on czy został ustawiony parametr mode jednej z tablic superglobalnych $_POST lub $_GET po czym dodatkowo sprawdza czy którakolwiek z nich jest tablicą. Jeśli tak to ustawia $mode na standardową opcję. Jeśli nie, tzn. że przekazywana nie jest tablica i dalej sprawdza już wg. starej instrukcji.
Podziękowania dla d3d!ka za ukazanie błędu.
Także z tego miejsca chciałbym Wam życzyć Wesołych Świąt, hucznego Sylwestra, a także pomyślności w nowym – już 2008 roku. A powyżej macie drobny prezent.
Zapraszam do zapoznania się także z powiązanymi artykułami:
Wpis ten został opublikowany dnia:
poniedziałek, 24 Grudzień 2007 o godzinie 12:41
w działach Bugtrack, PHP, phpBB.
Możesz śledzić rozwój tematu, w tym odpowiedzi dla tego artykułu poprzez kanał informacyjny RSS 2.0.
Możesz także zostawić swój komentarz lub trackbackować ze swojej własnej strony.
[...] w wigilię roku poprzedniego opisywałem rozwiązanie drobnego problemu z przekazywaniem tablic w jednym z plików forum phpBB by Przemo. Co [...]