Последние комментарии

Для меня эта страница - это удобный способ смотреть, что нового происходит в комментариях и сразу находить заметку, не заходя в админку. Думаю, она будет полезна и тебе.


Михаил Фленов Зарегистрированный пользователь

Если есть защита от второго, то защита от первого не нужна. Для защиты от второго раньше использовали getimagesize. Сейчас я полез в документацию и там к сожалению написано:

Caution
This function expects filename to be a valid image file. If a non-image file is supplied, it may be incorrectly detected as an image and the function will return successfully, but the array may contain nonsensical values.

Сейчас написал тестовый пример и действительно, для некорректного файлы в PHP8 возвращаются мусорные данные, которые не работают. Неожиданно. На сколько я помню в 5-м PHP проверка работала. Сейчас поиграю с функцией.


toorr2p Зарегистрированный пользователь

Здравствуйте, вопросы по главе "5,1 Загрузка файлов на сервер"
1) Почему нет проверки $_SERVER['HTTP_REFERER']?
Ведь могут же сканером проходить по сайту, отыскивая формы с INPUT type="file" и грузить туда свои зловреды.

2) Также не понял, как защитится к примеру от загрузке шелла, под видом картинки GIF, описанной в этой статье "CTF-соревнование: взлом ch4inrulz (1.0.1)" на securitylab ru ? Я проверил, действительно все описанные проверки в главе не предотвращают от загрузки такого файла (shell.gif) с содержимым:

GIF98
<?php
echo $_SERVER["DOCUMENT_ROOT"];
?>

Код с проверками (из листинга главы)
<?php
$uplDstDir = $_SERVER['DOCUMENT_ROOT'] . '/upload';
$uplFileName = md5(microtime());

//Check file size
if(!$_FILES['file1']['size'])
    die("Error fail upload file!");

//Check file max size
if($_FILES['file1']['size']>300*1024)
    die("Error file size is larger 100kb!");

//If it’s a picture, check its width and height
$arrSize = getimagesize($_FILES['file1']['tmp_name']);
if(!$arrSize[0] || !$arrSize[1])
    die("Error image dimensions must not be zero!");

//Check file type
preg_match("'([a-z]+)\/[x\-]*([a-z]+)'", $_FILES['file1']['type'], $ext);

if(!in_array($ext[2], array('jpg', 'jpeg', 'gif', 'png')))
    die("Error file format not allowed!");

//Moving a file from a temporary directory to a permanent one
$uplFileName = "$uplDstDir/$uplFileName.$ext[2]";
if(!move_uploaded_file($_FILES['file1']['tmp_name'], $uplFileName))
    die("Error file not upload!");
?>

Просьба подсказать как с этим бороться.


Михаил Фленов Зарегистрированный пользователь

Поправил опечатку, там должно было быть слово "письмо"


Андрей Ше

Михаил, привет.
Можешь поправить начало этой статьи, может опечатка или часть текста пропала.
"Недавно получил само с вопросом о том, зачем нужны интерфейсы..."


Михаил Фленов Зарегистрированный пользователь

В моём комментарии нужно было поставить вопрос. Мурыч что-то писал и мне казалось, что это You don’t know JavaScript, хотя может я тут не прав


Игорь Олегович

Нет, Embarcadero развивает проект.


Кот

"You don’t know JavaScript - это как раз книга, которая написана Мурычем." - Вроде бы Кайлом Симпсоном, или я не понял "шутки юмора".

@вовчик Спасибо, но вопрос был риторическим.

На самом деле примитивы в JS сущесвуют только потому, что создателя JS попросили сделать как в Java, о чем он сам говорит в интервью, ну и в твиттере часто пишет. А так всё только путается, так как в других языках - примитивы передаются по значению например, а в JS нет (точнее зависит от реализации, но ребята из V8 что у них по ссылке)


Михаил Фленов Зарегистрированный пользователь

You don’t know JavaScript - это как раз книга, которая написана Мурычем.


вовчик

"но тогда возникает вопрос почему у "примитивовов" есть методы типа tostring? :)" потому что в js есть такая штука как автобоксинг, которая оборачивает примитив в обертку чтобы вызвать у них методы, а после убирает обертку


Кот

самая большая проблема языка в том что по нему нет официальных доков, есть только эта спецификация, что не есть дока по языку. Конечно если интересно как это все под капотом работает, интересно  почитать. А так как официальных доков нет, то можно интерпретировать как угодно:) Смотря что считать примитивом, по спецификации на ECMA нет такого деления, с точки зрения понимания, можно условно разделить на объект и все остальное (функция и массив тож объект), но тогда возникает вопрос почему у "примитивовов" есть методы типа tostring? :)

Хорошая серия книжек You don’t know JavaScript.


О блоге

Программист, автор нескольких книг серии глазами хакера и просто блогер. Интересуюсь безопасностью, хотя хакером себя не считаю

Обратная связь

Без проблем вступаю в неразборчивые разговоры по e-mail. Стараюсь отвечать на письма всех читателей вне зависимости от страны проживания, вероисповедания, на русском или английском языке.

Пишите мне