2008-09-24 13 views
29

Mamy kilku programistów prosi o allow_url_fopen, aby być włączone na naszym serwerze. Jaka jest norma w tych czasach i czy włączono libcurl, czy istnieje naprawdę dobry powód, aby na to zezwolić?Czy powinienem zezwolić na "allow_url_fopen" w PHP?

Środowisko jest: Windows 2003, PHP 5.2.6, FastCGI

+0

Nie zrobiłbym tego. W tym samym czasie, większość ataków opartych na PHP zakłada, że ​​host używa Linuksa, dlatego niektóre z nich i tak ulegają awarii. – tacone

Odpowiedz

14

pewno warto allow_url_include ustawiony na OFF, który łagodzi wiele ryzyk allow_url_fopen również.

Ale ponieważ nie wszystkie wersje PHP mają allow_url_include, najlepszą praktyką dla wielu jest wyłączanie fopen. Podobnie jak w przypadku wszystkich funkcji, rzeczywistość jest taka, że ​​jeśli nie potrzebujesz jej do swojej aplikacji, wyłącz ją. Jeśli tego potrzebujesz, moduł curl prawdopodobnie może zrobić to lepiej, a refaktoryzacja aplikacji w celu użycia curl do wyłączenia allow_url_fopen może zniechęcić najmniej zdeterminowanego krakera.

+4

Hej Ben, widziałem kilka przypadków, w których zmienne są przekazywane do include() (lub fopen()), które są uważane przez autora za odwołanie do lokalnego pliku, ale zamiast tego są to adresy URL odwołujące się do złośliwego kodu PHP przechowywanego poza siedzibą. Potrafię wymyślić kilka rozsądnych powodów, dla których ktokolwiek chciałby dołączyć ("http: // .."), a co za tym idzie, poprawiono bezpieczeństwo poprzez wyłączenie tej funkcji. Zobacz http://pl.wikipedia.org/wiki/Remote_File_Inclusion –

+2

@Ben James: Zostaliśmy złamani jakiś czas temu, ze względu na bezpieczeństwo w naszym aktualnym pakiecie komercyjnym, a także w innym przestarzałym oprogramowaniu. Włączenie allow_url_include i allow_url_fopen do wyłączenia zatrzymało prawie każdy atak. – tacone

+14

Dlaczego użycie libcurl byłoby bezpieczniejsze niż użycie file_get_contents(), jeśli pobieram ten sam URL i używam danych w ten sam sposób? To jest to samo. Podobnie jak w przypadku libcurl i eval(), pobierana zawartość nie jest wcale bezpieczniejsza niż dołączanie zewnętrznego adresu URL. To tylko fałszywe "bezpieczeństwo, ponieważ jest denerwujące", tak jak system Windows Vista zadaje ci dwa razy pytanie, czy naprawdę chcesz uruchomić ten program. –

1

Ataki typu cross-site scripting są uciążliwe, więc jest to głos przeciwko. I zdecydowanie powinieneś mieć "allow_url_include" ustawiony na off, albo będziesz w świecie zranionym.

+0

AFAIK to nie ma nic wspólnego z XSS, ale z ładowaniem lokalnych plików. – ananda

18

Uważam, że odpowiedź sprowadza się do tego, w jaki sposób można ufać, że programiści będą odpowiedzialnie korzystać z funkcji? Dane z zewnętrznego URL-a powinny być traktowane jak każde inne niezaufane dane wejściowe i tak długo, jak jest to zrozumiałe, co jest ważniejsze?

Widzę, że jeśli traktujesz swoich programistów jak dzieci i nigdy nie pozwolisz im zajmować się ostrymi rzeczami, to będziesz mieć programistów, którzy nigdy nie nauczą się pisać bezpiecznego kodu.

1

To zależy od rodzaju rozwoju. Jeśli twoje prototypowanie włącza "allow_url_fopen" jest dobre, jednak nie ma znaczącej różnicy prędkości między libcurl a file_get_contents i włączanie go jest tylko kwestią wygody.

Dla serwerów produkcyjnych każde wywołanie libcurl powinno być oflagowane dla audytu bezpieczeństwa. Podobnie jak fopen i file_get_contents, jeśli włączone jest "allow_url_fopen". Wyłączenie "allow_url_fopen" nie zapobiega exploitom, ale tylko nieznacznie ogranicza liczbę sposobów ich wykonania.

-3

Duży problem polega na tym, że allow_url_fopen nie jest bardziej zabezpieczony, więc jeśli chcesz zapisać plik z adresu URL za pomocą curl, musisz przejść z pliku fopen/file_get, aby zapisać plik.

  • CURL można pobrać tylko z adresu URL. (allow_url_fopen nie jest to konieczne)
  • CURL należy dodać z fopen lub File_get jeśli chcesz zapisać zdalnego plik na serwerze. (allow_url_fopen obowiązkowy z dyni)

PHP musi znaleźć inne sposoby, aby uczynić go bardziej zabezpieczone.

+0

To po prostu niepoprawne; możesz zapisać plik dobrze, bez włączania allow_url_fopen, nawet jeśli zdarzyło ci się uzyskać zawartość za pomocą Curl. –

Powiązane problemy