→ Для вступления в общество новичков и профессионалов программирования, пожалуйста нажмите здесь ...

Форум программистов: C++, Basic, Delphi, Pascal, JavaScript
Логин: Пароль:
Запомнить?  
@Mail.ru



Начать новую тему Ответить на тему  [ 1 сообщение ] 
FAQ по безопасности 
Автор Сообщение
Профи
Аватара пользователя

Регистрация: 26.02.2008
Сообщения: 112
Откуда: Украина

Репутация: 2 [ ? ]
Сообщение FAQ по безопасности
Начнём новую тему по безопасности в веб-приложениях.

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

Будьте внимательны с подключаемыми данными.

Вот простейший пример:

if(isset($GET[‘page’]))
{
include($GET[‘page’]);
}

Ввиду того, что никакой проверки $GET[‘page’] произведено не было, злоумышлениник теоретически может вызвать ваш скрипт следующим образом:

script.php?page=/etc/passwd


Решение:
Самый простой вариант, который приходит в голову – это записать все возможные варианты подключаемых файлов в массив, а потом проверить – есть ли они в массиве. Если есть – подключаем, иначе – попробуйте ещё раз.
Вот как это делается на рhp:
$pages = array('index.html', 'page2.html', 'page3.html');
if( in_array($GET[‘page’], $pages) )
{
include($GET[‘page’]);
{
else
{
die("Попробуйте ещё раз.");
}

Добавлено спустя 6 минут 36 секунд:

Будьте внимательны с register_globals=on.

if($admin)
{
// предоставляем права админа
}
else
{
// не предоставляем права админа
}
Вроде бы всё просто и понятно, но если включен register_globals, то ситуация меняется кардинально.
Любой злоумышленник напишет script.php?admin=1 и получит права админа.

Решения:
1) не использовать register_globals=on. Самый лучший вариант. Все данные можно получить из суперглобальных массивов $_GET, $_POST, $_COOKIE и т.д.;
2) инициализировать переменные перед использованием:
$admin = false;//инициализируем переменную
$admin = is_admin();//проверяем на админа
if($admin)
{
// предоставляем права админа
}
else
{
// не предоставляем права админа
}

Добавлено спустя 2 минуты 41 секунду:

Инъективные SQL атаки.
Предположим мы имеем авторизацию на каком-либо сайте и при авторизации имеем форму ввода логина и пароля.
Для выборки данных из БД используем простейший запрос:

$query = “SELECT * FROM Users WHERE user=’”.$_POST[‘login’].”’ and password = ‘”.$_POST[‘password’].”’”;
//далее выполняем запрос к СУРБД
//соединяемся с СУРБД
$conn = mysql_connect (‘localhost’, ‘user’,’userpass’);
mysql_select_db(‘mydb’,$conn);
//выполняем запрос
$result = mysql_query($query,$conn);
//считаем кол-во выбранных строк
$number = mysql_num_rows($result);
//если кол-во строк равно 0, то не впускаем
if($number == 0)
echo ‘Введены некорректные даннные’;
//если не равно 0, то впускаем
else echo ‘Вход выполнен’;


Проверяем – всё работает прекрасно, но... это пока мы вводим корректные данные.
Предположим у нас в базе есть пользователь admin.
Введём в форму следующие данные:
Login: admin
Password: ' or 1=1 --'

Если в PHP отключён magic_quotes_gpc, то мы получим «Вход выполнен».
Это произойдёт поскольку при сборке запроса у нас получится следующее:
SELECT * FROM Users WHERE user=’admin’ and password = ‘’ or 1=1 ‘’.
То есть мы спросим у СУРБД данные если user=’admin’ и password=’’ или 1=1. Поскольку 1 всегда равно 1, то СУРБД вернёт какое-то кол-во строк и нам выведется строка «Вход выполнен».

Решения:
1) можно вручную добавлять слэши вызвав функцию addslashes() или mysql_real_escape_string() после сборки запроса, например так:
$query = “SELECT * FROM Users WHERE user=’”.$_POST[‘login’].”’ and password = ‘”.$_POST[‘password’].”’”;
$query = mysql_real_escape_string($query);
2) magic_quotes_gpc=on. В PHP автоматически игнорируются спецсимволы (добавляются бэкслеши), которые могут встретиться в массивах $_GET, $_POST, $_COOKIE. По умолчанию эта функция в PHP отключена. Включить её можно задав вышеуказанную директиву в php.ini.
Но здесь есть некоторые неудобства. Например, такой код:
echo '
<form action="http://yoursite/magic.php" method="post">
<input type="text" name="n" value="'.$_POST['n'].'">
<input type="submit">
</form>';

Если в форму ввести слово cat’s, то нажав на кнопку мы увидим бэкслэш перед кавычкой, поскольку magic_quotes_gpc сработает в этом случае.
Решить это можно вырезая слэши функцией stripslashes() так:

echo '
<form action="http://yoursite/magic.php" method="post">
<input type="text" name="n" value="'.@stripslashes($_POST['n']).'">
<input type="submit">
</form>';

Добавлено спустя 2 минуты 39 секунд:

Неформатированный HTML
С проблемой неформатированного HTML сталкиваются разработчики гостевых книг и форумов, где пользователь может ввести текст сообщения. Самой обычной защитой от HTML является функция strip_tags().
Такой код обработки вполне пойдёт для маленькой гостевой книги:
$text = strip_tags($text);

Но дело в том, что функция strip_tags() «вырезает» все подозрительные символы (<,>,&), а если это форум для программистов или математиков, или не дай бог зайдёт тема о математических формулах. Тогда формула x=a<c && c>d превратится в x=ad. Пользователь просто умрёт со злости.

Более лучший вариант для данного случая – не «вырезать» символы, а «экранировать». Для этого есть специальная функция htmlspecialchars(). Эта функция заменяет специальные символы (< на &lt, > на &gt & на &amp), а не вырезает их. При этом любой математик или программист будет доволен отображением своего сообщения.

Если нужно вырезать все тэги, кроме некоторых, форматирующих текст (<b> для отображения жирного текста или <i> для курсива), то здесь на помощь придут регулярные выражения:

$text = htmlspecialchars($text);
$text = preg_replace('{&lt;(/?(b|i))&gt;}si', '<$1>', $text);

В этом случае тэги <b> и <i> ,будут отображаться нормально.
При этом нужно быть осторожным, ведь кто-то может не закрыть тэг и тогда весь оставшийся текст страницы
будет отображаться жирным или курсивом. Чтобы этого не случилось можно взять текст сообщения в тэг
<table></table>.

Ещё как вариант - можно использовать так называемые BBCode.


27.02.2008 0:30
Профиль Отправить email ICQ
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ 1 сообщение ] 


Кто сейчас на конференции

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


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Перейти:  
cron
© 2013 «Форум программистов Украины»