[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: PHP & AJAX Обезопасить ?
andrey888
У меня следующий вопрос - может кто сталкивался (если еще нет то 100% столкнется ) Пишу Проект , использовал AJAX , расклад таков :
1) выбор темы пользователем
2) обработка AJAX ом данных и в соответствии с выбором пользователя вытаскиваем из БД нужное
3) вывод нужной информации в одном из блоков сайта .

Все бы ничего и выглядит очень просто Но вот как то заморочился я насчет безопасности такого рода проектирования сайта и нашел очень мало информации по этому поводу . Суть в том что меня беспокоит пункт Намбер 2 ) . Поскольку слыхал я что AJAX сам по себе является одной большой дырой - для созидателя и подарком для хаккера . В связи с этим вопрос - есть ли "особые, специальные" методы для сохранения безопасности в случае работы с AJAX .
Благодарочка за ответы заранее .



Спустя 3 минуты, 41 секунда (6.07.2011 - 20:29) Winston написал(а):
Цитата (andrey888 @ 6.07.2011 - 20:25)
меня беспокоит пункт Намбер 2 )

Что там опасного ?
Ты ведь просто посылаешь запрос php файлу, а там главное корректно обработать все что в запросе пришло, и возвратить результат.

Спустя 1 час, 52 минуты, 44 секунды (6.07.2011 - 22:21) andrey888 написал(а):
Ок . Ну вот смотри ,как пример нашел в глубинах сети статейку
http://www.xakep.ru/post/46875/default.asp?print=true

Про сессии - понятно , но очень просто для маломальски подготовленного хаккера .. Вот вариант защиты с сопровождением каждого запроса строкой while(1); а потом проверка есть ли оно ( если я все правильно понял , если нет - поправь буду только признателен ) - эт вроде как поинтереснее ...
В принципе вот об этом и спрашиваю ..
Если не сложно напиши пример как бы ты обработал данные ..
Благодарю .

Спустя 9 часов, 10 минут, 20 секунд (7.07.2011 - 07:32) Белый Тигр написал(а):
Не стоит думать что AJAX это прям ужас в плане безопасности smile.gif
Это простая технология которая позволяет в фоновом режиме отправлять запросы на сервер и принимать от него ответы. Она, по сути, ничем не отличается об обычного перехода браузера по ссылкам - и там и там вы делаете обычные запросы к серверу с определёнными параметрами в URL или теле запроса. Так что здесь для защиты стоит использовать стандартные правила типа экранирования спец-символов при помещении пользовательских данных в SQL-запрос.
Что касается "while(1)", то это защита от JavaScript-Hijacking. Чтоб особо не заморачиваться, можно отдавать с сервера необходимый JSON (или JSONP-конструкции) проверяя тип или природу запроса - если совершён POST-запрос или он совершён AJAX`ом. JSH возможен только когда вы получаете JSON GET-методом т.к. включение его тела в код страницы, при проведении JSH, осуществляется именно GET-методом.

Спустя 5 часов, 36 минут, 26 секунд (7.07.2011 - 13:08) andrey888 написал(а):
Конкретный пример :
1) Принимаем значение в функцию ,
2) Проверям на то что это номер (должен быть только номер) - достаточна ли такая проверка ?
3) Посылаем запрос файлу aj.php который в соответствии с номером выведет в div нужную информацию

function GetArt(p){
if(!isNaN(p)){
var xmlhttp = CreateRequest();
xmlhttp.open('GET', "aj.php?num="+p, true );
xmlhttp.onreadystatechange = function() {
if (xmlhttp.readyState == 4){
var x=document.getElementById('ajM');
x.style.display='block';
x.innerHTML=''+xmlhttp.responseText;
if(p==0){x.style.display='none';}
}
}

xmlhttp.send(null);
}else{ return ;}
}


В файле aj.php которому пришел запрос проверка следующая
1)Проверили на то что это номер и что он больше нуля
2)Для особо хитрозадых таки превращаем значение еще раз в номер
3)Проверенную переменную толкаем в простенький запрос .


if(isset($_GET['num']) && is_numeric($_GET['num']) && $_GET['num']>0){
$num=(int)$_GET['num'];
$sql="SELECT * FROM `smth` WHERE `Id`={$num};";

и т.д.



Достаточно ли ? Укажите где что поменять или добавить на ваш взгляд (если он конечно профессиональный) . Белый тигр - ты вроде знающий - в конкретном примере что можешь посоветовать ?

Спустя 13 минут, 59 секунд (7.07.2011 - 13:22) Winston написал(а):
Цитата (andrey888 @ 7.07.2011 - 13:08)
if(isset($_GET['num']) && is_numeric($_GET['num']) && $_GET['num']>0){
$num=(int)$_GET['num'];

От чего такая паранойя?
Достаточно просто написать
$num = isset($_GET['num']) ? (int)$_GET['num'] : NULL;
$sql="SELECT * FROM `smth` WHERE `Id`= " . $num;

Спустя 2 часа, 49 минут, 2 секунды (7.07.2011 - 16:11) Белый Тигр написал(а):
Поддерживаю PHPprogramer - проще все проверки заменить простым преобразованием в числовой тип. Только тогда не
Цитата
$num = isset($_GET['num']) ? (int)$_GET['num'] : NULL;

а что-то типа
Цитата
$num = isset($_GET['num']) ? (int)$_GET['num'] : 0;

Ведь попади NULL в запрос, сразу произойдёт ошибка (параметр id не заключен в кавычки)
В остальном с приведённым примером всё хорошо. Единственное что могу посоветовать, это использование jQuery (или любого другого фреймворка), а не чистого JS, и готовых классов типа PEAR::MDB2 для работы с SQL-запросами.

Спустя 1 час, 51 минута, 21 секунда (7.07.2011 - 18:03) twin написал(а):
Белый Тигр
Цитата
Единственное что могу посоветовать, это использование jQuery (или любого другого фреймворка), а не чистого JS, и готовых классов типа PEAR::MDB2 для работы с SQL-запросами.

Не стоит на этом останавливаться. Лучше сразу взять готовую CMS, а еще лучше нанять группу квалифицированных программистов. А еще лучше нанять штат курьеров и пусть развозят инфу по домам юзеров на флэшках.

Чем JS не угодил то? Зачем таскать герлянду фреймворков для одного простенького запроса?

Спустя 3 часа, 51 минута, 26 секунд (7.07.2011 - 21:54) andrey888 написал(а):
Насчет паранои - проект в разработке , конечно перед выпуском все подобные штучки будут приведены в порядок . С другой стороны - защиты много не бывает - даже если все три функции в параноидальном порядке совершают одно и то же действие user posted image
Насчет фрейморков - согласен , для простой по идее задачи как то нелогично подключать такой лишний объемный "jQuery" . Да ведь и jQuery - это тот же самый JavaScript .
А вот по поводу классов (типа MDB2 для SQL-запросов) хотелось бы спросить .
Во первых насколько я знаю это прерогатива не только меня как кодера но и хостинга . Хоть он (хостинг) у меня и совсем неплохой - лишний треп с ними думаю не на пользу . Разве не достаточно будет для вывода информации с БД использовать не сами таблицы а их виды то бишь VIEW .
Ну а конечно там где например пользователю позволено внести что то свое - проносить это все через mysql_real_escape_string а выводить только с htmlspecialchars.
Чем еще мне могут помочь такие классы как MDB2 и его собратья???
Благодарю за ответы.

Спустя 14 минут, 2 секунды (7.07.2011 - 22:08) ИНСИ написал(а):
andrey888 если хакерам надо будет взломать твой сайт, первое что они будут проверять на дыры, не твой ajax, а сервер чтобы получить шел доступ и там уже все править, а именно твои файлы.

Если тебя устроит, то почитай про XMLHttpRequest.

Спустя 1 час, 33 минуты, 26 секунд (7.07.2011 - 23:41) andrey888 написал(а):
Ну SSH на моем сервере вроде как закрыт , да и хостинг следящий за своей репутацией . За это я как раз и не беспокоюсь , а беспокоюсь за SQL injection аттаки и XSS . Функции упомянутые мной в конце второго абзаца предыдущего сообщения от этого как раз и защищают , но при использовании AJAX думалось мне есть некие "дополнительные" места на которые стоит обращать внимание .
Благодарю.

Спустя 5 минут, 19 секунд (7.07.2011 - 23:47) DySprozin написал(а):
;;при использовании AJAX думалось мне есть некие "дополнительные" места
;;на которые стоит обращать внимание .

скажем, так... при использовании Ajax нужно особенно внимательно смотреть за отсутствием в своем коде XSS - в идеале страница, использующая ajax, не должна содержать никаких $_GET и $_POST переменных... XSS сама по себе опасна, а при использовании ajax ее опасность возрастает в десятки раз (;

Спустя 6 часов, 54 минуты, 1 секунда (8.07.2011 - 06:41) Белый Тигр написал(а):
Цитата

Не стоит на этом останавливаться. Лучше сразу взять готовую CMS, а еще лучше нанять группу квалифицированных программистов. А еще лучше нанять штат курьеров и пусть развозят инфу по домам юзеров на флэшках.

Чем JS не угодил то? Зачем таскать герлянду фреймворков для одного простенького запроса?


Цитата
Насчет фрейморков - согласен , для простой по идее задачи как то нелогично подключать такой лишний объемный "jQuery" . Да ведь и jQuery - это тот же самый JavaScript .


Я говорил не об одном конкретном запросе, а вообще. С jQuery код уменьшается в разы, нет маяты с совместимостью операций с XHR в разных браузерах. MDB2 - отличный класс работы с БД. Главное чем он полезен - гарантированное экранирование всех входящих в запрос данных. Ну и интерфейс у него хороший. Так что не стоит воспринимать в штыки любые готовые разработки smile.gif Можно конечно всё писать на native, но тогда нужно понимать что то что вы делаете за месяц, остальные программисты (сторонники готовых решений) могут сделают за неделю

Цитата
Ну а конечно там где например пользователю позволено внести что то свое - проносить это все через mysql_real_escape_string

Вот, кстати, хороший пример. Можно на native писать для каждой переменной вызов mysql_real_escape_string(), а можно с MDB2 писать знак "?". Эффект одинаков, а разница в кол-ве символов огромна. Особенно в масштабах проекта, пусть даже и маленького. Да и с mysql_real_escape_string() можно пролететь если не поместить в запросе проверяемую переменную в кавычки, а MDB2 их сам всегда расставляет в обязательном порядке.

Спустя 23 дня, 7 часов, 3 минуты, 44 секунды (31.07.2011 - 13:44) andrey888 написал(а):
Благодарю всех за ответы . Уважуха всем большая . user posted image


_____________
Прогноз на следующие 5 лет : Россия, Китай - две величайшие державы.
США в Ж*пе. Справедливость восторжествует. )
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.