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

Форум программистов: 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 сообщение ] 


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

Зарегистрированные пользователи: Yahoo [Bot]


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

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