Делюсь лучшей защитой от SQL-инъекций, 100% защита

PN
На сайте с 22.08.2012
Offline
103
5855

В качестве защиты от инъекций многие рекомендуют контроль типов данных перед записью в базу данных, отсев множественных запросов и т.д. Это абсолютно необязательно. Во-первых, MySQL не выполняет никаких множественных запросов функцией mysql_query(). Это заблуждение. phpMyAdmin сам разбивает запросы на несколько. Правило должно быть такое. Все названия полей писать в косых кавычках (`), все данные, даже числовые, писать в одинарных кавычках ('). Сами запросы в php вписывать в двойные кавычки ("). А защита от инъекций пишется в начале общего файла, типа include_all.php:

foreach ($_GET as $k=>&$v)
if ((strpos($k, '_SERVER') === false) && (strpos($k, '_SESSION') === false))
{
$v = str_replace("'", "", $v);
$$k = $v;
}

foreach ($_POST as $k=>&$v)
if ((strpos($k, '_SERVER') === false) && (strpos($k, '_SESSION') === false))
{
$v = str_replace("'", "", $v);
$$k = $v;
}

foreach ($_COOKIE as $k=>&$v)
if ((strpos($k, '_SERVER') === false) && (strpos($k, '_SESSION') === false))
{
$v = str_replace("'", "", $v);
$$k = $v;
}
unset($v);

Конструкция Unset($v) обязательна, т.к. php сохраняет ссылку на переменную и после цикла. И если мы потом напишем $v=1;, то последняя переменная, например, $_COOKIE['user'] станет равна единице.

Конструкция $$k=$v создает переменные, например, из $_COOKIE['user'] создаст $user.

Конструкция if ((strpos($k, '_SERVER') === false) && (strpos($k, '_SESSION') === false)) предотвращает подстановку ложных значений при использовании $$k=$v.

При использовании этой вставки сайт взломать НЕВОЗМОЖНО!

Источник:

http://proksey-net.livejournal.com/942.html

Если понравилось, голосуйте в ЖЖ

Мой совет помог? Не скупись! Bitcoin 1Lseddet1o1B6odgXQHbGaWGwRkt1Db8Ef Ethereum 0x450f1a17461e25194B7F9226cDEe70173F39e1e1
Hixon10
На сайте с 21.08.2010
Offline
125
#1

Делюсь лучшей защитой от SQL-инъекций: используйте современный PHP фреймворк.

Веду свой невзрачный блог (http://hixon.ru/).
TF-Studio
На сайте с 17.08.2010
Offline
334
#2

PDO

тоже вариант.

Во-первых, MySQL не выполняет никаких множественных запросов функцией mysql_query(). Это заблуждение. phpMyAdmin сам разбивает

Тут вообще связи не улавливаю.

Всё ещё лучший способ заработка для белых сайтов: GoGetLinks (https://www.gogetlinks.net/?inv=fahbn8).
bay_ebook
На сайте с 28.05.2010
Offline
111
#3
proksey-net:

Конструкция Unset($v) обязательна, т.к. php сохраняет ссылку на переменную и после цикла. И если мы потом напишем $v=1;, то последняя переменная, например, $_COOKIE['user'] станет равна единице.

Посмеялся, если бы это действительно было так ,то Unset($v) удалял бы $_COOKIE['user'] :)

proksey-net:

Конструкция $$k=$v создает переменные, например, из $_COOKIE['user'] создаст $user.

А зачем? Если уже есть $_COOKIE['user'], зачем еще переменную создавать? Что бы память кушала?

proksey-net:

При использовании этой вставки сайт взломать НЕВОЗМОЖНО!

А если $_COOKIE['user'] или $_POST['user'] является массивом? И в этом массиве возможна инъекция, а Ваша мега защита это пропускает, хотя даже не пропускает, а делает с массива строку ,в общем использование такого скрипта - добавляет гемора и ни отчего не защищает :)

Нужен прогер на php+mysql+понимание чужего кода? (/ru/forum/540660) Вам сюда PHP-шаман (http://php-shaman.pw/)
demon2005
На сайте с 06.02.2010
Offline
117
#4
proksey-net:

При использовании этой вставки сайт взломать НЕВОЗМОЖНО!

Ага, как же

Машины должны работать. Люди должны думать. (Девиз компании "IBM") Хостинг ( http://goo.gl/em6I5 ), рекомендую. Код на скидку 965VI5O60E Выгодно купить/продать сайт ( http://www.telderi.ru/?pid=c0fb22 )
Ваано
На сайте с 01.08.2009
Offline
112
#5
proksey-net:


$v = str_replace("'", "", $v);

Особенно такой замене порадуются на украинских сайтах, использующих апостров)

Туры в Мексику тут (http://www.metmexico.com). Оптимальное отношение цена/качество.
RO
На сайте с 13.07.2009
Offline
88
#6
Ваано:
Особенно такой замене порадуются на украинских сайтах, использующих апостров)

как раз это хотел написать. с автора поржал 😂

Милованов Ю.С
На сайте с 24.01.2008
Offline
196
#7

ТС, что значит mysql_query не делает множество запросов?

Если у этого юзера есть привелегии на UNION, то зловред может сделать объединение запросов(как на многих хакерских форумах учат).

И скажу Вам по секрету, такая конструкция может работать:


mysql_query("INSERT INTO `tbl1`(`name`) VALUES('Yura'); UPDATE `tbl1` SET `name`='YuriQ'");

2 запроса удачно выполнятся. Но что сделать для этого надо, я Вам не скажу;)

Подпись))
siv1987
На сайте с 02.04.2009
Offline
427
#8

proksey-net, это не защита а УГ. Тогда уж лучше это /ru/forum/774368

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий