Универсальная защита от xss-атак и sql-инъекций

superpupervest

Новичок
Регистрация
24 Сен 2018
Сообщения
4
Реакции
0
Баллы
3
Я не занимаюсь технической поддержкой сайтов, но так уж сложилось, что ко мне часто обращаются за помощью. С одной стороны отказывать неудобно, да и не выгодно с коммерческой точки зрения, с другой за большое спасибо в магазине тоже не расплатишься. Поэтому я решил написать универсальное решение, но столкнулся с некоторыми проблемами.
Суть решения заключается в том, чтобы отловить данные POST, GET, COOKIE и обработать их еще до того, как сайт произведет с ними какие-либо действия.
Вот собственно сам код

$jsxss="onabort,oncanplay,oncanplaythrough,ondurationchange,onemptied,onended,onerror,onloadeddata,onloadedmetadata,onloadstart,onpause,onplay,onplaying,onprogress,onratechange,onseeked,onseeking,onstalled,onsuspend,ontimeupdate,onvolumechange,onwaiting,oncopy,oncut,onpaste,ondrag,ondragend,ondragenter,ondragleave,ondragover,ondragstart,ondrop,onblur,onfocus,onfocusin,onfocusout,onchange,oninput,oninvalid,onreset,onsearch,onselect,onsubmit,onabort,onbeforeunload,onerror,onhashchange,onload,onpageshow,onpagehide,onresize,onscroll,onunload,onkeydown,onkeypress,onkeyup,altKey,ctrlKey,shiftKey,metaKey,key,keyCode,which,charCode,location,onclick,ondblclick,oncontextmenu,onmouseover,onmouseenter,onmouseout,onmouseleave,onmouseup,onmousemove,onwheel,altKey,ctrlKey,shiftKey,metaKey,button,buttons,which,clientX,clientY,detail,relatedTarget,screenX,screenY,deltaX,deltaY,deltaZ,deltaMode,animationstart,animationend,animationiteration,animationName,elapsedTime,propertyName,elapsedTime,transitionend,onerror,onmessage,onopen,ononline,onoffline,onstorage,onshow,ontoggle,onpopstate,ontouchstart,ontouchmove,ontouchend,ontouchcancel,persisted,javascript";
$jsxss = explode(",",$jsxss);
foreach($_POST as $k=>$v)
{
if(is_array($v))
{
foreach($v as $Kk=>$Vv)
{
$Vv = preg_replace ( "'<script[^>]*?>.*?</script>'si", "", $Vv );
$Vv = str_replace($jsxss,"",$Vv);
$Vv = str_replace (array("*","\\"), "", $Vv );
$Vv = strip_tags($Vv);
$Vv = htmlentities($Vv, ENT_QUOTES, "UTF-8");
$Vv = htmlspecialchars($Vv, ENT_QUOTES);
$_POST[$k][$Kk] = $Vv;
}
}
ELSE
{
//Сначала удаляем любые скрипты для защиты от xss-атак
$v = preg_replace ( "'<script[^>]*?>.*?</script>'si", "", $v );
//Вырезаем все известные javascript события для защиты от xss-атак
$v = str_replace($jsxss,"",$v);
//Удаляем экранированание для защиты от SQL-иньекций
$v = str_replace (array("*","\\"), "", $v );
//Экранируем специальные символы в строках для использования в выражениях SQL
$v = mysql_real_escape_string( $v );
//Удаляем другие лишние теги.
$v = strip_tags($v);
//Преобразуеv все возможные символы в соответствующие HTML-сущности
$v = htmlentities($v, ENT_QUOTES, "UTF-8");
$v = htmlspecialchars($v, ENT_QUOTES);
//Перезаписываем GET массив
$_POST[$k] = $v;
}

}
Тоже самое я сделал по аналогии с _GET и _COOKIE
Основные недостатки.

1) У меня так и не вышло обработать, а точнее перезаписать их внутри функции и передать _POST, _GET и _COOKIE в качестве переменных, а главное, как следствие, обработать многомерные массивы данных рекурсивно. Соответственно $_POST[][], $_POST[][][] и тд уже обработать не выйдет и каждый такой массив надо вставлять отдельно. Массив может быть бесконечно большой, а код получится бесконечно громозкий.

2) Не охота убирать функцию mysql_real_escape_string ведь никогда не знаешь, где ее забыли упомянуть, но возникает проблема излишнего экранирования символов.

3) strip_tags удаляет все теги. Мне бы не хотелось убирать все, а лишь самые опасные теги, но беда в том, что в дополнительных параметрах можно указать только теги, которые нужно оставить. Конечно, можно использовать регулярные выражения, но к сожалению, нет уверенности в том, что не забудешь что-нибудь важное, поэтому если у кого-то есть отличная замена этому, то предлагаю собрать все в кучу и избавиться от strip_tags

4) Ну и жду других советов по данному вопросу.
 

PunPun

Coder
Команда форума
Приватовец
Регистрация
23 Фев 2017
Сообщения
618
Реакции
402
Баллы
63
Это не универсальная защита а бред параноика. Все индивидуально и нет УНИВЕРСАЛЬНОЙ защиты от такого рода атак.
 

PunPun

Coder
Команда форума
Приватовец
Регистрация
23 Фев 2017
Сообщения
618
Реакции
402
Баллы
63
Какой толковый совет ))
Это и есть ответ по существу.
1. Являетесь ли вы программистом? Если да - то ваших знаний в написании подобного рода кода будет недостаточно, ибо это уже видно по вашему коду, если нет - то тем более вам сюда лезть не нужно.
2. Нет универсальной защиты, данные могут приходить разные и у них есть разные потребности в обработке. То что вы предлагаете в вашем коде уже убивает дальнейшую нужную обработку данных.
3. Для таких целей уже давно придумали тучу библиотек, особенно на PHP. К примеру HTML Purifier - HTML Purifier - Filter your HTML the standards-compliant way!
4. Хватит изобретать велосипеды с квадратными колесами, давно выпускают с круглыми.
 

superpupervest

Новичок
Регистрация
24 Сен 2018
Сообщения
4
Реакции
0
Баллы
3
Насколько я могу судить HTML Purifier не решает и половины поставленных задач и при этом может создать еще больше проблем, не говоря о том, что все тоже самое можно сделать и без него, не разбираясь в его синтаксисе.

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

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

Ну и уж если хаите, то предложите свое правильное решение. Какой смысл водить вилами по воде?
 

PunPun

Coder
Команда форума
Приватовец
Регистрация
23 Фев 2017
Сообщения
618
Реакции
402
Баллы
63
Насколько я могу судить HTML Purifier не решает и половины поставленных задач и при этом может создать еще больше проблем, не говоря о том, что все тоже самое можно сделать и без него, не разбираясь в его синтаксисе.

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

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

Ну и уж если хаите, то предложите свое правильное решение. Какой смысл водить вилами по воде?
Важнее безопасность и вы используете mysql_real_escape_string... HTML Purifier решает большую половину поставленных задач, просто признайтесь что вы не можете разобраться с библиотекой.
 

superpupervest

Новичок
Регистрация
24 Сен 2018
Сообщения
4
Реакции
0
Баллы
3
Я смотрю Вы во всю во мне недостатки ищите. Только не пойму зачем. Если так охота самоутвердиться, то советую обратиться к психологу. Как и писал ранее, хотите помочь, предложите свое решение. По-моему это куда более лучший, а я бы даже сказал единственный способ блеснуть умом, чем поливать грязью оппонента. При этом и на хер не пошлю, и еще спасибо скажут.

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

hackseec

Новичок
Регистрация
23 Сен 2022
Сообщения
18
Реакции
0
Баллы
1
А ты думал в сказочку попал?
 
Сверху Снизу