X   Сообщение сайта
(Сообщение закроется через 3 секунды)



 

Здравствуйте, гость (

| Вход | Регистрация )

Открыть тему
Тема закрыта
> Универсальная защита от xss-атак и sql-инъекций
superpupervest
superpupervest
Topic Starter сообщение 11.7.2019, 17:48; Ответить: superpupervest
Сообщение #1


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

$jsxss="onabort,oncanplay,oncanplaythrough,ondurationchange,onemptied,onended,onerro
r,onloadeddata,onloadedmetadata,onloadstart,onpause,onplay,onplaying,onprogress,o
nratechange,onseeked,onseeking,onstalled,onsuspend,ontimeupdate,onvolumechange,on
waiting,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,o
nload,onpageshow,onpagehide,onresize,onscroll,onunload,onkeydown,onkeypress,onkey
up,altKey,ctrlKey,shiftKey,metaKey,key,keyCode,which,charCode,location,onclick,on
dblclick,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,anim
ationstart,animationend,animationiteration,animationName,elapsedTime,propertyName
,elapsedTime,transitionend,onerror,onmessage,onopen,ononline,onoffline,onstorage,
onshow,ontoggle,onpopstate,ontouchstart,ontouchmove,ontouchend,ontouchcancel,pers
isted,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) Ну и жду других советов по данному вопросу.

Замечание модератора:
Эта тема была закрыта автоматически ввиду отсутствия активности в ней на протяжении 100+ дней.
Если Вы считаете ее актуальной и хотите оставить сообщение, то воспользуйтесь кнопкой
или обратитесь к любому из модераторов.
0
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
Открыть тему
Тема закрыта
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0


Свернуть

> Похожие темы

  Тема Ответов Автор Просмотров Последний ответ
Горячая тема (нет новых ответов) WordPress: ускорение, защита, оптимизация
35 wp01 19972 9.11.2022, 14:24
автор: wp01
Открытая тема (нет новых ответов) Тема имеет прикрепленные файлыБаза товаров (opencart) SQL 70к+ товаров
Инструменты для дома, строительное и производственное оборудование
5 getdump 5607 1.9.2021, 2:04
автор: WebSniper
Горячая тема (нет новых ответов) WordPress: ускорение, защита, оптимизация
41 wp01 9493 21.9.2020, 16:44
автор: wp01
Открытая тема (нет новых ответов) Тема имеет прикрепленные файлыWeb-разработка (C++/PHP/SQL/JS/Bootstrap). HighLoad проекты.
0 DF™ 1420 28.7.2020, 13:24
автор: DF™
Открытая тема (нет новых ответов) Нужна защита сайта от парсинга
Сайт парсит WpGrabber, нужна защита
18 Limonadik 4938 20.5.2020, 0:18
автор: pyaterka


 



RSS Текстовая версия Сейчас: 28.3.2024, 15:15
Дизайн