|
|
|
| Сначала такой вопрос:
При загрузке файлов на сервер, достаточно ли будет предварительно описать все расширения в массиве, а потом сравнивать допустимые расширения с текущем. Вот примерно так:
$extention = array(".jpg",".png");
if(!empty($_FILES['image']['tmp_name']))
{
$exten = strrchr($_FILES['image']['name'], ".");
if(in_array($exten,$extention))
{
//Копируем файлы
}
...
}
|
P.S Я новичок, строго не судите =). | |
|
|
|
|
|
|
|
для: FireTiger
(10.05.2007 в 22:48)
| | Только при условии, что Вы и сохраните с этим разрешенным расширением. | |
|
|
|
|
|
|
|
для: Unkind
(10.05.2007 в 22:52)
| | Ок, спасибо, а вообще таких дыр вроде и нету, да?
И еще вопрос:
Стоит ли так писать, умно ли, или это перебор?
$_POST['title'] = htmlspecialchars(addslashes(stripslashes(ltrim($_POST['title']))));
|
| |
|
|
|
|
|
|
|
для: FireTiger
(10.05.2007 в 23:46)
| | addslashes stripslashes
налить воду, слить воду
зачем? | |
|
|
|
|
|
|
|
для: bronenos
(11.05.2007 в 07:12)
| | addslashes - stripslashes - это налить воду слить налитое. Это еще не так опасно. Хотя и бесполезно.
А вот то, что написано - stripslashes - addslashes - это хуже. это выжать сок, а потом налить воды. То бишь разрушение контента. | |
|
|
|
|
|
|
|
для: FireTiger
(10.05.2007 в 23:46)
| | Подобного рода строка мне говорит следующее.
Автор считает каждую из этих функций своего рода амулетом. И полагает, что чем плотнее он ими переменную обовьет, тем цветочнее ему будет.
Эти функции - не амулеты. Каждая выполняет строго определенные преобразования строки, и каждая полезна лишь там, где это преобразование требуется контекстом алгоритма. В любом другом месте каждая - вредна.
Я невеликий специалист в амулетах, но даже из того что знаю, следует, что их можно употреблять только согласованно между собой, иначе от них вреда больше, чем пользы. | |
|
|
|
|
|
|
|
для: Trianon
(11.05.2007 в 09:59)
| |
$_POST['title'] = htmlspecialchars(stripslashes(ltrim($_POST['title'])));
|
Значит вот так? Или скажите как правильно, пожалуйста.
p.s
ltrim() я использую для удаления пробелов слева, то есть чтобы форму нельзя было заполнить пробелами. Так правильно?
stripslashes() я использую для удаления html тегов, и htmlspecialchars() для вывода только текстовой информации, чтобы скрипт там не выполнялся. У меня правильное понимание этих функций?
И еще вопрос, если я сделаю так:
$_POST['title'] = htmlspecialchars(stripslashes(preg_replace("/[^a-z0-9]/i", "", ltrim($_POST['title']))));
|
то, нужны htmlspecialchars() , stripslashes()? | |
|
|
|
|
|
|
|
для: FireTiger
(11.05.2007 в 11:18)
| | Или просто скажите, как можно проверить данные получаемые от пользователя, чтобы ни одна мышь не проскочила. | |
|
|
|
|
|
|
|
для: FireTiger
(11.05.2007 в 11:18)
| | Что ж, давайте попробуем разобраться.
>
>$_POST['title'] = htmlspecialchars(stripslashes(ltrim($_POST['title'])));
>
|
>Значит вот так? Или скажите как правильно, пожалуйста.
На самом деле, первый смый трудный правильный шаг Вы уже сделали. Вы стали правильно ставить вопрос - зачем нужна каждая из функций.
>ltrim() я использую для удаления пробелов слева, то есть чтобы форму нельзя было заполнить пробелами. Так правильно?
Так правильно, в случае если строка в этом поле не имеет права по смыслу начинаться с пробелов, и неправильно, если формально она может быть с левыми пробелами.
Впрочем, возможно, что если категорически левые пробелы там недопустимы, то нужно не просто откусить их, а вообще остановить скрипт, выдав пользователю диагностику о недопустимом вводе. Обычно их откусывают, если информационная сущность при этом не теряется, чтобы пользователя в таких случаях лишними отлупами не нагружать.
>stripslashes() я использую для удаления html тегов,
stripslashes никакого отношения к тегам не имеет.
Обычно она применяется для восстановления входных параметров, испорченных на этапе старта скрипта идеологически ошибочным механизмом магических кавычек. Ели Вы о magic quotes ничего не читали - почитайте. Не чтобы его применять, а чтобы знать почему он работает, почему наносит вред, и как с ним бороться. Между прочим, применяться эта функция должна первой в цепочке, иначе её смысл невелик.
и htmlspecialchars() для вывода только текстовой информации, чтобы скрипт там не выполнялся.
htmlspecialchars применяется для замены в текстовом содержимом некоторых символов ( < > & " ) , применяющихся для разметки гипертекстовых документов с целью разместить в гипертексте обычный плоский текст, то есть как Вы правильно отметили, при выводе информации. Так зачем же Вы применяете её при вводе? А если с символами строки придется работать?
У меня правильное понимание этих функций?
>И еще вопрос, если я сделаю так:
>
>$_POST['title'] = htmlspecialchars(stripslashes(preg_replace("/[^a-z0-9]/i", "", ltrim($_POST['title']))));
>
|
>то, нужны htmlspecialchars() , stripslashes()?
Я полагаю Вы в состоянии ответить на свой вопрос самостоятельно. Только почему то боитесь очевидного ответа. если в содержимом строки нет ничего кроме букв и цифр - нет ни обратных слэшей (это единственное, что ест stripslashes ) , нет уголков , амперсендов, кавычек (а другие не трогает htmlspecialchars) - то нет никакого смысла их применять после указанного preg_replace. | |
|
|
|
|
|
|
|
для: Trianon
(11.05.2007 в 11:45)
| | Большое спасибо! Много чего понял, только про magic quotes не очень,(потому что еще не читал).
А не могли бы Вы написать свой вариант защиты от проникновения вредоносного кода через формы? | |
|
|
|
|
|
|
|
для: FireTiger
(11.05.2007 в 17:32)
| | Я просто не считаю код вредноносным.
Голый текст никому никакого вреда не принесет. | |
|
|
|
|
|
|
|
для: Trianon
(11.05.2007 в 18:56)
| | Просто напишите какие стоит использовать функции, или каких достаточно будет для безопасности. | |
|
|
|
|
|
|
|
для: FireTiger
(11.05.2007 в 11:18)
| | stripslashes() - это убрать обратный слэш
htmlspecialchars() - это для работы с html-oм
addslashes - добавить обратные слешы к апострофам
если не использовать htmlspecialchars() там где надо то написав к примеру в $_POST['title']
alert('Script dead'); а еще и по циклом.... но хорошего будет мало а если через htmlspecialchars() то выведит просто alert('Script dead'); дальше ltrim а почему не trim и справа и слева в полне удобно....
preg_replace("/[^a-z0-9]/i", "", ltrim($_POST['title']) - лучше если это определить через условие
к примеру
if(preg_match("/[^a-z0-9]/i", $_POST['title']){
Header("Location:переносим куда надо");
exit;
}
"/[^a-z0-9]/i" - i это чтение или действие над строкой т.е переводит все буквы и бла бла бла в нижний регистер тоже самое что у тебя a-z | |
|
|
|
|
|
|
|
для: FireTiger
(10.05.2007 в 22:48)
| | >При загрузке файлов на сервер, достаточно ли будет предварительно описать все расширения в массиве, а потом сравнивать допустимые расширения с текущем.
Достаточно для чего? | |
|
|
|
|
|
|
|
для: Trianon
(11.05.2007 в 10:01)
| | >Достаточно для чего?
Достаточно для безопасности, хватит ли такой защиты? А если есть дыры, то как еще обезопасить. | |
|
|
|
|
|
|
|
для: FireTiger
(11.05.2007 в 11:03)
| | некорректно поставлен вопрос.
Такого кода достаточно, чтобы не позволить пользователю создавать на сервере свои файлы с именами, расширения которых отличны от перечисленных в списке, независимо от контента.
Такая мера в совокупности с другими действиями (например в совокупности с запретом на исполнение файлов с указанными расширениями и программным исключением возможности подключения файлов из целевой папки в поток кода) может обеспечить защиту от некоторых атак.
Абстрактной же безопасности, которой (и для которой) "достаточно" - не существует. | |
|
|
|
|
|
|
|
для: Trianon
(11.05.2007 в 11:25)
| | Большое спасибо! А насчет вот этого:
$_POST['title'] = htmlspecialchars(stripslashes(preg_replace("/[^a-z0-9]/i", "", ltrim($_POST['title']))));
|
Здесь все хорошо? | |
|
|
|
|
|
|
|
для: FireTiger
(11.05.2007 в 11:30)
| | >$extention = array(".jpg",".png"); if(!empty($_FILES['image']['tmp_name']))...
Берем любой файл, даем ему расширение jpg или png, и загрузим на сервер. Безопасность может быть в норме, а вот мусора будет предостаточно. Почему бы не использовать getimagesize(), который вернет тип файла. Помоему так лучше будет? | |
|
|
|
|
|
|
|
для: sim5
(11.05.2007 в 17:46)
| | А можно поподробнее про ваш вариант, я просто еще не изучал работу с графикой. | |
|
|
|
|
|
|
|
для: FireTiger
(11.05.2007 в 21:25)
| | Это в мануале по РНР есть:
getimagesize - получает размер изображения.
Описание
array getimagesize (string filename [, array imageinfo])
Функция getimagesize() определяет размер изображения GIF, JPG, PNG, SWF, PSD, TIFF или BMP и возвращает размеры, тип файла и высоту/ширину текстовой строки, используемой внутри нормального HTML-тэга IMG.
Возвращает массив из 4 элементов. Индекс 0 содержит ширину/width изображения в пикселах. Индекс 1 содержит высоту/height. Индекс 2 это флаг, указывающий тип изображения. 1 = GIF, 2 = JPG, 3 = PNG, 4 = SWF, 5 = PSD, 6 = BMP, 7 = TIFF(байтовый порядок intel), 8 = TIFF(байтовый порядок motorola), 9 = JPC, 10 = JP2, 11 = JPX. Индекс 3 это текстовая строка с корректной строкой height="yyy" width="xxx", которая может использоваться непосредственно в тэге IMG. | |
|
|
|
|
|
|
|
для: sim5
(11.05.2007 в 21:48)
| | Спасибо. А как проверить данные от пользователя методом гет, вот так можно? чтобы обрезать все кроме цифр:
$_GET['page'] = preg_replace("/[^0-9]/i", "", $_GET['page']);
|
Сейчас изучаю вот эту статью: http://www.softtime.ru/info/articlephp.php?id_article=35. Там есть пример с авторизацией, и вот собственно вопрос: куда нужно ввести эти "123' AND 1=1", "admin'/*" строки чтобы обойти ту авторизацию. Что-то у меня не получается, я создал все в точности как в примере, а авторизацию не выходит обойти.
PS Мне это нужно понять, чтобы убрать дыру и вообще понять принцип работы взлома. | |
|
|
|
|
|
|
|
для: FireTiger
(12.05.2007 в 17:51)
| | И еще вопрос:
Как-то нужно защищать config.php если он лежит не в защищенном каталоге? Или хватит просто выставить права chmod?
PS И ответьте пожалуйста на предыдущие вопросы ;-) | |
|
|
|
|
|
|
|
для: FireTiger
(11.05.2007 в 11:30)
| | Здесь все хорошо?
Вы издеваетесь? НЕТ.
чтобы обрезать все кроме цифр
Лучше приводить строку к integer:
<?php
$_GET['page'] = (int) $_GET['page'];
?>
|
| |
|
|
|
|
|
|
|
для: Unkind
(12.05.2007 в 20:16)
| | Для обработки форм с текстом я остановился на таком варанте:
$_POST['title'] = htmlspecialchars(stripslashes(ltrim($_POST['title'])));
|
А для обработки форм с циферными значениями я остановился на таком варанте:
if(!is_numeric($_POST['page'])) $_POST['page'] = (int)$_POST['page'];
|
| |
|
|
|
|
автор: Trianon (из кабака) (12.05.2007 в 22:52) |
|
|
для: FireTiger
(12.05.2007 в 21:07)
| | вот и мечи после этого бисер..... | |
|
|
|
|
|
|
|
для: Trianon (из кабака)
(12.05.2007 в 22:52)
| | Что ты имеешь ввиду? Можно прямыми словами? | |
|
|
|
|
|
|
|
для: FireTiger
(12.05.2007 в 23:29)
| | Думаю, что ничего, из того, что тут говорилось, Вы не поняли.
А теперь, прямыми словами (только собственными, а не из книжки) ответьте пожалуйста, что и зачем делает каждая из функций в Вашем коде
htmlspecialchars(stripslashes(ltrim(
| ? | |
|
|
|
|
|
|
|
для: Trianon
(13.05.2007 в 11:07)
| | В книжку после вашего сообщения специально не смотрел чтобы проверить мое понимание этих функций.
ltrim() - я использую для удаления пробелов с левой стороны слова.
stripslashes() - использую для удаления обратных слэшей; насколько понимаю это для того чтобы не выполнялся perl скрипт;
htmlspecialchars() - для запрета html-тегов, преобразовывает теги в их эквиваленты, например "<" в "<" и т.п. и вообще не выполняет любые скрипты а просто их выводит как обычный текст.
Я чувствую что что-то не так со stripslashes(). Объясните пожалуйста! | |
|
|
|
|
|
|
|
для: FireTiger
(14.05.2007 в 16:56)
| | Я использовал в галерее изображений такое:
<?
//если ввели путь к несуществующему файлу
if($_FILES["logo"]["name"] != "" and $_FILES['logo']['size'] == "0")
{
echo "<HTML><HEAD><META HTTP-EQUIV='Refresh' CONTENT='3; URL=http://". $_SERVER['HTTP_HOST'] ."/photo/add/'></HEAD></HTML>";
echo "<br /><center><strong>Нет у вас заявленной картинки на жестком диске</strong></center> <BR>";
$errors = 1;
exit ();
}
if($_FILES["logo"]["name"] != "" and $_FILES['logo']['size'] > "0")
{
// определяем допустимые расширения
$valid_types=array("gif","jpg","png","jpeg");
// определяем имя файла
$f_name = $_FILES['logo']['name'];
// Запоминаем размер файла
$f_size=$_FILES['logo']['size'];
// проверяем расширение файла
$ext = strtolower(substr($f_name, 1 + strrpos($f_name, ".")));
if (!in_array($ext, $valid_types))
{
$errors = "1";
echo "Имя загружаемого файла имеет некрасивое расширение";
exit ();
}
// недопускаем использование в имени файла более одной точки
$t4k = substr_count($f_name, ".");
if ($t4k > "1")
{
echo "<center><strong>Не допускается использование нескольких точек в имени файла...</strong></center> <BR>";
$errors = "1";
exit ();
}
// недопускаем использование в имени файла некрасивых дополнительных расширений
$mess="<center><strong>Имя файла должно иметь расширение изображения...</strong></center><br />";
if (preg_match("/\.php/i", $f_name)) {echo $mess; $errors = 1; exit ();}
if (preg_match("/\.html/i", $f_name)) {echo $mess; $errors = 1; exit ();}
if (preg_match("/\.htm/i", $f_name)) {echo $mess; $errors = 1; exit ();}
if (preg_match("/\.php3/i", $f_name)) {echo $mess; $errors = 1; exit ();}
if (preg_match("/\.shtml/i",$f_name)) {echo $mess; $errors = 1; exit ();}
if (preg_match("/\.cgi/i", $f_name)) {echo $mess; $errors = 1; exit ();}
if (preg_match("/\.pl/i", $f_name)) {echo $mess; $errors = 1; exit ();}
if (preg_match("/\.asp/i", $f_name)) {echo $mess; $errors = 1; exit ();}
// проверка веса файла
$max_size = "307200"; // допустимый вес - 300 килобайт
$f_kb_size=round($f_size/10.24)/100;
$f_size_max=round($max_size/10.24)/100;
if ($f_kb_size>$f_size_max)
{
$errors = 1;
echo "Превышено ограничение на вес файла";
exit ();
}
}
?>
|
Авось пригодится... | |
|
|
|
|
|
|
|
для: FireTiger
(14.05.2007 в 16:56)
| | А если MySQL-иньекция, то нужна addslashes() или mysql_escape_string(). | |
|
|
|
|
|
|
|
для: Trianon
(13.05.2007 в 11:07)
| | Ну так как? Можете подсказать что не так? Просто что-то не пойму, в чем здесь проблема... | |
|
|
|
|
|
|
|
для: FireTiger
(16.05.2007 в 23:29)
| | >Ну так как? Можете подсказать что не так? Просто что-то не пойму, в чем здесь проблема...
>ltrim() - я использую для удаления пробелов с левой стороны слова.
А если эти пробелы нужны?
stripslashes() - использую для удаления обратных слэшей; насколько понимаю это для того чтобы не выполнялся perl скрипт;
Не зная, кто насовал в поле эти слэши?
А меж тем, stripslashes() далеко не все слэши удаляет.
Кто будет исполнять введенный текст, как perl-скрипт, где и зачем?
А если посетитель захочет показать другим посетителям текст perl-скрипта, ему что - удавиться прикажете?
>htmlspecialchars() - для запрета html-тегов, преобразовывает теги в их эквиваленты,
>например "<" в "<" и т.п. и вообще не выполняет любые скрипты а просто их выводит как обычный текст.
Эта операция требуется при выводе текста, но никак не при вводе.
при вводе она только мешает.
>Я чувствую что что-то не так со stripslashes(). Объясните пожалуйста!
Еще бы Вы чувствовали так. Про magic quotes прочли? | |
|
|
|
|
|
|
|
для: Trianon
(17.05.2007 в 10:14)
| | А вообще, вот Вам мааааленькая задачка.
Нарисуйте форму с одним текстовым полем, в котором посетитель мог бы написать свое имя. Напишите обработчик, который бы записывал имя в таблицу БД, отвечал
Привет, имярек! Вы знаете, что в Вашем имени 6 символов?
Сегодня нас посетили:
|
(вместо слова имярек выводя имя посетителя) и дальше бы построчно выводил список накопленных посетителей из таблицы вместе с количеством посещений.
Пожалуй на этом примере большую часть "так называемых вопросов безопасности", решаемых указанными Вами функциями Вы сможете разобрать.
NB: имя может содержать абсолютно любые символы. | |
|
|
|
|
|
|
|
для: Unkind
(12.05.2007 в 20:16)
| | Лично я предпочитаю:
<?php
$_GET['page'] = intval($_GET['page']);
?>
|
| |
|
|
|