Актуално защитено PHP качване на изображения

Трябва да внедря защитен PHP скрипт за качване на файл. Какви текущи методи използвате, за да гарантирате, че вашият скрипт е защитен?

Ще поставя разрешените разширения в белия списък и ще гарантирам, че Apache работи като потребител, за да избегна необходимостта от разрешения 777 по подразбиране.

Качените файлове ще бъдат изображения и имам достъп до MySQL. Потребителите ще трябва да могат да виждат своите файлове, след като бъдат качени.

Благодаря!


person Craig Wilson    schedule 17.09.2012    source източник
comment
Разширенията в белия списък са, честно казано, глупава система за сигурност. Тривиално е някой да преименува nastyvirus.exe на cutekittens.jpg. Промяната на uid на apache също е доста безполезна. Правилно внедрен скрипт за изтегляне не би се интересувал кой е действителният потребител - така или иначе би ограничил потребителя само до неговите файлове чрез някакво външно средство за присвояване на собственост, напр. база данни.   -  person Marc B    schedule 17.09.2012
comment
@MarcB, +1. Винаги, винаги проверявайте MIME типовете.   -  person wesside    schedule 17.09.2012
comment
просто качете изображенията във временна директория и след това копирайте/преоразмерете нова версия от качената снимка в директорията с изображения и изпразнете временната   -  person max    schedule 17.09.2012
comment
Благодаря за отговора. Само за да поясня обаче, че качвам, а не изтеглям файлове от сървъра. Със сигурност стартирането на Apache като потребител и елиминирането на необходимостта от 77 разрешения за папката за качване прави системата много по-сигурна? Уес, може ли типовете MIME да не се фалшифицират? Благодаря!   -  person Craig Wilson    schedule 17.09.2012
comment
всичко може да бъде фалшифицирано, но поне определянето на mime тип от страна на сървъра е малко по-безопасно, отколкото да се доверите на полето ['type'], предоставено от отдалечения потребител, да не говорим за името на отдалечения файл. съвършено валиден mimetype може да има вградени злонамерени неща, но поне малко затруднявате на атакуващия да направи каквото и да било, вместо да оставяте входната врата широко отворена с hackme стикери навсякъде.   -  person Marc B    schedule 17.09.2012


Отговори (2)


За някои съвети за избягване на качването на злонамерени файлове вижте отговорите на Начини да спрете хората да качват GIF файлове с инжекции в тях?.

Другото важно нещо е да избягвате SQL инжектирането. Всички данни, които могат да бъдат модифицирани от атакуващ (бисквитки, потребителски агенти, низ на заявка, POST данни (включително имена на качени файлове), заглавки, динамични имена на пътища и т.н.), не трябва да се използват, без да бъдат предадени през mysql_real_escape_string или Еквивалент на MySQLi първо. В случай на цели числа, използвайте функцията intval().

person user2428118    schedule 17.09.2012
comment
здрасти SQL инжектирането не трябва да бъде голям проблем, тъй като само името на файла ще бъде записано в базата данни чрез PDO и подготвени изрази. Благодаря за линка! - person Craig Wilson; 17.09.2012

Направете каквото казвате, за да проверите файловите разширения, но за да проверите дали качен файл с правилно разширение наистина е това, което казва, че е, опитайте пускайки го през imagemagick с помощта на командата verify. Това е просто решение, което изглежда един от малкото начини да се гарантира без сянка на съмнение, че изображението е такова, каквото се представя.

Освен това използвайте PHP функцията is_uploaded_file, за да добавите допълнителен ниво на сигурност.

Надяваме се, че това се разбира от само себе си, но PDO трябва да се използва за транзакции с бази данни във всички аспекти на PHP.

И накрая, не забравяйте, че ако използвате javascript за каквато и да е проверка, той може лесно да бъде заменен от полукомпетентен уеб потребител. Валидирането от страна на клиента е по-отзивчиво към потребителя, но винаги го архивирайте с подходящи проверки от страна на сървъра.

person bpeterson76    schedule 18.09.2012