[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Защита от инекций в SQL
ApuktaChehov
Здравствуйте!

Есть простенький скрипт. В зависимости от какого-то параметра, он подгружает разную инфу из MySQL.
Код страницы:
Код
<a href="index.php?id=1001">
<a href="index.php?id=1002">
<a href="index.php?id=1003">

Код скрипта:
Код
$data=mysql_query("select * from base WHERE id='$_GET[id]' ORDER BY org_name ASC");

Как видно инъекция неизбежна.
Можно ли защититься, следующим способом?

Код страницы:
Код
<a href="index.php?id=1">
<a href="index.php?id=2">
<a href="index.php?id=3">

Код скрипта:
Код
if($_GET['id']==1){$id=1001;
}elseif($_GET['id']==2){$id=1002;
}elseif($_GET['id']==3){$id=1003;
}else{exit;
}
$data=mysql_query("select * from base WHERE id='$id' ORDER BY org_name ASC");

Альтернатива с массивами:
Код
$b = Array("1001","1002","1003");
$id=$_GET['id'];
$data=mysql_query("select * from base WHERE id='$b[$id]' ORDER BY org_name ASC");


Спасибо.



Спустя 1 час, 4 минуты, 53 секунды (25.10.2008 - 12:59) linedmk написал(а):
а не проще ли использовать функцию is_numeric($_GET["id"]) ?

Спустя 8 часов, 55 минут, 28 секунд (25.10.2008 - 21:54) str_replace написал(а):
добавлю к ответу linedmk:

if (!array_key_exists ('id', $_GET)
|| !is_numeric ($_GET['id']))
die ('ID is invalid or not defined');

Спустя 11 часов (26.10.2008 - 09:54) ApuktaChehov написал(а):
Поясните пожалуйста.

Я, конечно, интуитивно догадываюсь, но все же, хотелось бы уточнить.
acute.gif

Спустя 8 минут, 2 секунды (26.10.2008 - 10:02) Sephiroth_Lukaw написал(а):
Цитата(ApuktaChehov @ 26.10.2008, 6:54) [snapback]52886[/snapback]
Я, конечно, интуитивно догадываюсь...

А что тут не понятного? Проверяем, есть ли id в массиве $_GET и является ли оно числом. Если нет, то завершаем работу скрипта и выводим сообщение "ID is invalid or not defined"

Спустя 8 часов, 3 минуты, 59 секунд (26.10.2008 - 18:06) Krist_ALL написал(а):
Код
if (!array_key_exists ('id', $_GET)

оригинальна!

можно вот так еще.
Код
if(is_numeric($_GET['id']) || str_lenght($_GET['id']) <7) {
......... }
else {
echo 'иди нах';
}

Спустя 18 минут, 49 секунд (26.10.2008 - 18:25) Sephiroth_Lukaw написал(а):
Цитата(Krist_ALL @ 26.10.2008, 15:06) [snapback]52914[/snapback]
if(is_numeric($_GET['id']) || str_lenght($_GET['id']) <7) {

Может вы strlen имели в виду?) И тут скорее && больше подойдёт чем || (-

Спустя 5 минут, 14 секунд (26.10.2008 - 18:30) Krist_ALL написал(а):
да. я ошибся. и действительна подойдет && . чет я глуканул

Спустя 2 часа, 11 минут, 41 секунда (26.10.2008 - 20:42) ApuktaChehov написал(а):
Т.е. если в строке адреса ввести
Код
index.php?id=1001

переменная id не попадет в массив $_GET?
Я пробовал, вроде попадает.

К примеру, я не хочу, что бы пользователь мог увидеть данные с id=1003.
Ссылки с такой переменной на странице нет.
Если он введет "index.php?id=1003", то id станет $_GET['id']=1003.
И как следствие будет существовать и будет числом.
Тогда не вижу смысла проверять, существует ли она и является ли числом.

Или я что то не понимаю, или чего то не знаю.
Ребята, не судите строго, я совсем недавно начал изучать PHP, а мне на плечи уже свалилось серьезное приложение. angry.gif

Спустя 23 минуты, 24 секунды (26.10.2008 - 21:05) Sephiroth_Lukaw написал(а):
Цитата(ApuktaChehov @ 26.10.2008, 17:42) [snapback]52929[/snapback]
И как следствие будет существовать и будет числом.
Тогда не вижу смысла проверять, существует ли она и является ли числом.

Дело в том, что эта переменная идёт в SQL запрос и её за просто можно подменить, например, вставить закрывающуюся кавычку и выполнить произвольную команду на БД. Из-за этого мы проверяем является ли числом переменная $id в массиве $_GET или нет. А если её не существует, то и проверять не надо, сразу выдаём 'ID is invalid or not defined'

Спустя 3 часа, 55 минут, 6 секунд (27.10.2008 - 01:01) ApuktaChehov написал(а):
Охо.. я и не думал об этом.
Я это учту, спасибо большое.

Как я понял, это работает, только если переменная - число.
А если это буквы?
Резать запрещенные символы?

Спустя 10 минут (27.10.2008 - 01:11) Sephiroth_Lukaw написал(а):

Спустя 9 часов, 38 минут, 52 секунды (27.10.2008 - 10:49) bearman написал(а):
Цитата(Sephiroth_Lukaw @ 27.10.2008, 3:11) [snapback]52936[/snapback]

хоть один нормальный ответ

Спустя 2 часа, 44 минуты, 17 секунд (27.10.2008 - 13:34) ApuktaChehov написал(а):
А как обстоят дела с массивом $_POST.
Тут есть какие-нибудь пути подмена переменных?

Спустя 54 минуты, 35 секунд (27.10.2008 - 14:28) Krist_ALL написал(а):
Цитата
А как обстоят дела с массивом $_POST.
Тут есть какие-нибудь пути подмена переменных?

ПЕРЕменные , которые передаются методом пост, тоже можео подменить и их значение. так чо нет разницы - пост или гет. режть все спцсимволы

Спустя 18 минут, 58 секунд (27.10.2008 - 14:47) ApuktaChehov написал(а):
Спасибо!
clapping.gif

Спустя 1 час, 55 минут, 36 секунд (27.10.2008 - 16:43) MaxSystems.ru написал(а):
Цитата

А чем хуже str_replace('\'','',$_POST['text']); ///????!!!

Спустя 36 минут, 32 секунды (27.10.2008 - 17:19) md5 написал(а):
Цитата(MaxSystems.ru @ 27.10.2008, 16:43) [snapback]52964[/snapback]
Цитата

А чем хуже str_replace('\'','',$_POST['text']); ///????!!!

тем

Спустя 23 минуты, 52 секунды (27.10.2008 - 17:43) Sylex написал(а):
Цитата(MaxSystems.ru @ 27.10.2008, 19:43) [snapback]52964[/snapback]
Цитата

А чем хуже str_replace('\'','',$_POST['text']); ///????!!!


без комментариев...

Спустя 11 минут, 59 секунд (27.10.2008 - 17:55) str_replace написал(а):
Цитата(Krist_ALL @ 26.10.2008, 15:06) [snapback]52914[/snapback]
Код
if (!array_key_exists ('id', $_GET)

оригинальна!

можно вот так еще.
Код
if(is_numeric($_GET['id']) || str_lenght($_GET['id']) <7) {
......... }
else {
echo 'иди нах';
}


чё-то так зацепило твоё слово "оригинальна!".
Это плохой способ проверки по-твоему? Или "люди так не пишут"?

Спустя 3 часа, 20 минут, 21 секунда (27.10.2008 - 21:16) bearman написал(а):
Цитата(str_replace @ 27.10.2008, 19:55) [snapback]52967[/snapback]
Цитата(Krist_ALL @ 26.10.2008, 15:06) [snapback]52914[/snapback]
Код
if (!array_key_exists ('id', $_GET)

оригинальна!

можно вот так еще.
Код
if(is_numeric($_GET['id']) || str_lenght($_GET['id']) <7) {
......... }
else {
echo 'иди нах';
}


чё-то так зацепило твоё слово "оригинальна!".
Это плохой способ проверки по-твоему? Или "люди так не пишут"?

так пишут всякие олени которые делаю счетчик для свой хоум пейджи, а кто реально занимается разработками не пишут такое говно. почему? да потому что это не расширяемо, представляете каждый раз так писать в 2-5 метрах кода. ну вас нахрен с такими мыслями )

Спустя 3 часа, 4 минуты, 27 секунд (28.10.2008 - 00:20) sergeiss написал(а):
Цитата(bearman @ 27.10.2008, 21:16) [snapback]52980[/snapback]
так пишут всякие олени которые делаю счетчик для свой хоум пейджи, а кто реально занимается разработками не пишут такое говно. почему? да потому что это не расширяемо, представляете каждый раз так писать в 2-5 метрах кода. ну вас нахрен с такими мыслями )

Ну, а коли ты "не алЕнь", то поделись с сирыми и убогими, как пишут "чИста реАльные пацанЫ" smile.gif

Спустя 9 часов, 30 минут, 7 секунд (28.10.2008 - 09:50) bearman написал(а):
Цитата(sergeiss @ 28.10.2008, 2:20) [snapback]52988[/snapback]
Цитата(bearman @ 27.10.2008, 21:16) [snapback]52980[/snapback]
так пишут всякие олени которые делаю счетчик для свой хоум пейджи, а кто реально занимается разработками не пишут такое говно. почему? да потому что это не расширяемо, представляете каждый раз так писать в 2-5 метрах кода. ну вас нахрен с такими мыслями )

Ну, а коли ты "не алЕнь", то поделись с сирыми и убогими, как пишут "чИста реАльные пацанЫ" smile.gif

ну реальные пацаны пишут с использованием prepared statements (гопники всякие) ну или с изощренными методами + использование mysql_real_escape_string. я кажется до этого писал что так правильно.

Спустя 32 минуты, 43 секунды (28.10.2008 - 10:23) str_replace написал(а):
я правильно понимаю, по твоемУ способоу всё равно нужно каждую значимую (в теме примера - id) переменную проверять с использованием функции mysql_real_escape_string ()?

Спустя 7 минут, 5 секунд (28.10.2008 - 10:30) bearman написал(а):
Цитата(str_replace @ 28.10.2008, 12:23) [snapback]52995[/snapback]
я правильно понимаю, по твоемУ способоу всё равно нужно каждую значимую (в теме примера - id) переменную проверять с использованием функции mysql_real_escape_string ()?


да, вопрос только как smile.gif

я например пишу нечто вида

q("select * from users where username='{0}' and password='{1}'",$username,$password);

удобно и безопасно wink.gif

а проверять всегда данные нужно, но можно конечно надеяться на говнорежим magi_qotes_runtime и тп, но это не для меня, простите.

Спустя 7 минут, 54 секунды (28.10.2008 - 10:38) str_replace написал(а):
ты пишешь код q(..., $username, $password).
А где и как ты проверяешь, что данные есть?
И как проверяешь, что $username, скажем не равно '; DELETE FROM `users` WHERE `id` NOT NULL ';

Спустя 2 часа, 7 минут, 17 секунд (28.10.2008 - 12:45) bearman написал(а):
Цитата(str_replace @ 28.10.2008, 12:38) [snapback]52998[/snapback]
ты пишешь код q(..., $username, $password).
А где и как ты проверяешь, что данные есть?
И как проверяешь, что $username, скажем не равно '; DELETE FROM `users` WHERE `id` NOT NULL ';

а зачем проверять, если {0} - экранированная версия username'a ??? мыслите шире и будет вам счастье wink.gif

получится в моем примере select * from users where username='\'; DELETE FROM \`users\` WHERE \`id\` NOT NULL \'; ' and password='lalal'. забавное имя ползователя окнечно, но в коеечном итоге выбор за ним wink.gif

Спустя 38 минут, 24 секунды (28.10.2008 - 13:24) Sylex написал(а):
bearman, лексикон у тебя прикольный laugh.gif

Спустя 22 минуты, 58 секунд (28.10.2008 - 13:47) bearman написал(а):
Цитата(Sylex @ 28.10.2008, 15:24) [snapback]53012[/snapback]
bearman, лексикон у тебя прикольный laugh.gif

стараюсь )))

Спустя 1 час, 21 минута, 14 секунд (28.10.2008 - 15:08) str_replace написал(а):
Цитата(bearman @ 28.10.2008, 9:45) [snapback]53009[/snapback]
Цитата(str_replace @ 28.10.2008, 12:38) [snapback]52998[/snapback]
ты пишешь код q(..., $username, $password).
А где и как ты проверяешь, что данные есть?
И как проверяешь, что $username, скажем не равно '; DELETE FROM `users` WHERE `id` NOT NULL ';

а зачем проверять, если {0} - экранированная версия username'a ??? мыслите шире и будет вам счастье wink.gif

получится в моем примере select * from users where username='\'; DELETE FROM \`users\` WHERE \`id\` NOT NULL \'; ' and password='lalal'. забавное имя ползователя окнечно, но в коеечном итоге выбор за ним wink.gif


если честно, ты мне новую галактику не открыл, но мне интересно, как ты проверяешь переменные на входе?
пусть есть 3 странички news.php, article.php и item.php
В 1-ую передаётся (GET) переменная newsId, во вторую articleId и в третью itemId.

Какой же у тебя есть "универсальный" механизм проверки данных? (напомню, что все указанные переменные а) должны существовать б) должны быть целым числом)

Спустя 3 минуты, 24 секунды (28.10.2008 - 15:11) bearman написал(а):
Цитата(str_replace @ 28.10.2008, 17:08) [snapback]53024[/snapback]
Цитата(bearman @ 28.10.2008, 9:45) [snapback]53009[/snapback]
Цитата(str_replace @ 28.10.2008, 12:38) [snapback]52998[/snapback]
ты пишешь код q(..., $username, $password).
А где и как ты проверяешь, что данные есть?
И как проверяешь, что $username, скажем не равно '; DELETE FROM `users` WHERE `id` NOT NULL ';

а зачем проверять, если {0} - экранированная версия username'a ??? мыслите шире и будет вам счастье wink.gif

получится в моем примере select * from users where username='\'; DELETE FROM \`users\` WHERE \`id\` NOT NULL \'; ' and password='lalal'. забавное имя ползователя окнечно, но в коеечном итоге выбор за ним wink.gif


если честно, ты мне новую галактику не открыл, но мне интересно, как ты проверяешь переменные на входе?
пусть есть 3 странички news.php, article.php и item.php
В 1-ую передаётся (GET) переменная newsId, во вторую articleId и в третью itemId.

Какой же у тебя есть "универсальный" механизм проверки данных? (напомню, что все указанные переменные а) должны существовать б) должны быть целым числом)


зачем проверять их на целочисленность? если будет нечто вида selec * from table where id= и тут поставить "z" то просто ничего не найдется это раз. на незаполненость - два.

скажу больше что у меня есть класс
и делаю я нетчо вида
if(!$item = $db->get("items",$_GET['id']))
{
die(404);
}

понятна суть? а вот гет уже делает проверку на существование переменной, то что целое число вообще никогда не проверяю :-D
нахрена?) время разве что тратить впустую.

Спустя 4 минуты, 36 секунд (28.10.2008 - 15:16) str_replace написал(а):
По идее, код if(!$item = $db->get("items",$_GET['id'])) должен вызвать Notice если id не существует.
так?

Спустя 30 минут, 2 секунды (28.10.2008 - 15:46) bearman написал(а):
Цитата(str_replace @ 28.10.2008, 17:16) [snapback]53026[/snapback]
По идее, код if(!$item = $db->get("items",$_GET['id'])) должен вызвать Notice если id не существует.
так?

error_reporting(E_ALL & ~E_NOTICE);

smile.gif
и ничего не увидите.

мне обычно насрать на передан ли параметр, если невозможно скл инъекция, мне более интересно нашелся ли элемент wink.gif

Спустя 9 минут, 52 секунды (28.10.2008 - 15:56) str_replace написал(а):
Цитата(bearman @ 28.10.2008, 12:46) [snapback]53028[/snapback]
Цитата(str_replace @ 28.10.2008, 17:16) [snapback]53026[/snapback]
По идее, код if(!$item = $db->get("items",$_GET['id'])) должен вызвать Notice если id не существует.
так?

error_reporting(E_ALL & ~E_NOTICE);

smile.gif
и ничего не увидите.

мне обычно насрать на передан ли параметр, если невозможно скл инъекция, мне более интересно нашелся ли элемент wink.gif


Я так и понял.
ИМХО, подавление предупреждений - это зло.
Поэтому мы ("алени") пишем array_key_exists.

Каждый выбирает так, как ему больше нравится smile.gif

Спустя 34 минуты, 42 секунды (28.10.2008 - 16:30) bearman написал(а):
Цитата(str_replace @ 28.10.2008, 17:56) [snapback]53032[/snapback]
Цитата(bearman @ 28.10.2008, 12:46) [snapback]53028[/snapback]
Цитата(str_replace @ 28.10.2008, 17:16) [snapback]53026[/snapback]
По идее, код if(!$item = $db->get("items",$_GET['id'])) должен вызвать Notice если id не существует.
так?

error_reporting(E_ALL & ~E_NOTICE);

smile.gif
и ничего не увидите.

мне обычно насрать на передан ли параметр, если невозможно скл инъекция, мне более интересно нашелся ли элемент wink.gif


Я так и понял.
ИМХО, подавление предупреждений - это зло.
Поэтому мы ("алени") пишем array_key_exists.

Каждый выбирает так, как ему больше нравится smile.gif

сколько по времени у вас занимает написание полноценного сайта с галереей картинок, новостями статьями, допустим формой заказа, каталогом продукции с 0? допустим используя ваш фреймворк.

Спустя 54 минуты, 16 секунд (28.10.2008 - 17:25) str_replace написал(а):
я думаю около 2-3 недель (это если с нуля писать).

Спустя 24 минуты, 44 секунды (28.10.2008 - 17:49) bearman написал(а):
Цитата(str_replace @ 28.10.2008, 19:25) [snapback]53048[/snapback]
я думаю около 2-3 недель (это если с нуля писать).

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

Спустя 31 минута, 23 секунды (28.10.2008 - 18:21) str_replace написал(а):
bearman, я согласен с вами, что можно писать без проверок (или с минималным их кол-вом) + отключить нотисы. Тогда действительно можно написать за 2-3 дня.

Спустя 30 минут, 52 секунды (28.10.2008 - 18:52) AndryG написал(а):
Что главное? Безопасность.
Если сайт используется в нормальном режиме - то и отображение идет красивое и правильное.
Если юзер начинает с параметрами мудрить и ковырять, то пофиг как это будет отображаться - главное не показать ему недозволенного!

Зачем проверять "передан ли параметр", какого типа параметр пришел и т.д.
Как по мне стоит перекрыть в корне возможность инъекций и на этом точка. Заменил юзер строку вызова - получил бредовую страницу -- сам виноват. Тут главное не пропустить инъекцию и всё тут.

Спустя 3 часа, 57 минут, 53 секунды (28.10.2008 - 22:50) bearman написал(а):
Цитата(AndryG @ 28.10.2008, 20:52) [snapback]53057[/snapback]
Что главное? Безопасность.
Если сайт используется в нормальном режиме - то и отображение идет красивое и правильное.
Если юзер начинает с параметрами мудрить и ковырять, то пофиг как это будет отображаться - главное не показать ему недозволенного!

Зачем проверять "передан ли параметр", какого типа параметр пришел и т.д.
Как по мне стоит перекрыть в корне возможность инъекций и на этом точка. Заменил юзер строку вызова - получил бредовую страницу -- сам виноват. Тут главное не пропустить инъекцию и всё тут.

какбы я об этом и говорю)))))

а проверять - мещанство(как бы для смертных потеха, ну и кому девать время некуда). вполне достаточно экранирования символов, единственное чтобудет - форму редактирования пустуя покажет и все или пустую страницу с товарами, но у меня обычно 404 страницу показывает.

кстати как вы думаете, дурной ли тон вешать банеры на 404 страницу + показывать как много людей сюда попали?

Спустя 13 часов, 23 минуты, 32 секунды (29.10.2008 - 12:13) str_replace написал(а):
думаю, это как минимум забавно )))
+ сделать через ajax счётик "На 404 страничке сейчас online: Х юзеров"

Спустя 9 часов, 7 минут, 28 секунд (29.10.2008 - 21:21) AndryG написал(а):
Думаю логичней на 404 поставить типа "Если Вы сюда попали случайно - поведайте мне на мыло как -- это ошибка. Ну а если ищите инъекции, то сообщаю Вам: "Ваш вариант не прошел" " :-) типа такого.

Друг у меня есть - любитель поиска инъекций где и как хоч.
На одном проекте поспорили, найдет ли он у меня чего-нить иль нет.
Вся защита состояла из одного правила "никаких ручных собираний запросов по кускам - только полный запрос с использованием параметров".
Типа не пишем
Код
$sql = 'select * from table where a='.$a

А пишем
Код
db_query('select * from table where a=:param_a',$a)

Процедура db_query - простая обертка пхпшной функции запроса, которая экранирует всю фигню в параметрах.

Вот такая "концентрация" за безопасность отвечающего кода в одну функцию полностью устранила возможность инъекций -- друг так ни одной и не нашел.

Вторая функция-обертка использовалась для чтения данных БД -- она экранировала нафиг все HTML теги в читаемых данных - тким макаром с БД у меня вылазил уже безопасный код - никакого JS-кода уже встроить в страницу не получится.

И усё smile.gif

Спустя 1 день, 12 часов, 57 минут, 58 секунд (31.10.2008 - 10:18) ApuktaChehov написал(а):
Ребята! Это, конечно, все хорошо, но только я не понял главного.

Как экранировать спец символы?
Можете привести код?
С переменной $_GET['id'].

Спустя 19 минут, 58 секунд (31.10.2008 - 10:38) AndryG написал(а):
mysql_escape_string

Спустя 13 минут, 55 секунд (31.10.2008 - 10:52) ApuktaChehov написал(а):
Попробовал осуществить инъекцию в запрос:
Код
$_GET['br']=mysql_escape_string($_GET['br']);
mysql_query("select * from user_tbl WHERE id='$_GET[br]'") or die ("ЖОПА");

пример инъекции:
Код
index.php?br=0'+OR+user_name='admin


получилось следующее:
Код
mysql_query("select * from user_tbl WHERE id='0\\\' OR user_name=\\\'admin'")or die ("ЖОПА");


Все верно?
Просто если не использовать mysql_escape_string();
то запрос с инъекцией выглядит так:
Код
mysql_query("select * from user_tbl WHERE id='0\' OR user_name=\'admin'")or die ("ЖОПА");


Как я понял перед спец символом ' вставляется \ в случае без mysql_escape_string();
, а с использованием mysql_escape_string(); вставляется \\\.

Спустя 15 минут, 3 секунды (31.10.2008 - 11:07) Sephiroth_Lukaw написал(а):
ммм... http://php.ru/manual/security.magicquotes.html, http://php.ru/manual/function.get-magic-quotes-gpc.html
В общем, что бы кавычки не экранизировались, в .htaccess
Код
php_flag  magic_quotes_gpc               Off
php_flag  magic_quotes_sybase            Off
php_flag  magic_quotes_runtime           Off

Спустя 8 минут, 17 секунд (31.10.2008 - 11:16) AndryG написал(а):
Цитата
Как я понял перед спец символом ' вставляется \ в случае без mysql_escape_string();
, а с использованием mysql_escape_string(); вставляется \\\.

Видать точно включен http://php.ru/manual/function.get-magic-quotes-gpc.html -- отключите его нафиг -- только путанины добавляет.

Этот режим автоматически экранирует все спецсимволы. Таким макаром:
вы ставите ' -- магик экранирует \' ... а потом вы экранируете через mysql_escape_string() -- получаете:
экранируем ' -> \'
экранируем \ -> \\
В итоге, используя mysql_escape_string() при включенном мэйжик получаем не '-> \' , а ' -> \\\'

Спустя 1 минута, 49 секунд (31.10.2008 - 11:18) ApuktaChehov написал(а):
Так.. а какой тогда смысл в mysql_escape_string();
если, magic_quotes_gpc все сама экранирует?

Спустя 31 минута, 4 секунды (31.10.2008 - 11:49) AndryG написал(а):
Вот выцарапал функцию о которой выше говорил.
Код
/**
* @desc Защищенное выполнение запросов
* Два варианта вызова:
* 1 второй и последующие параметры - параметры запроса
* 2 второй параметр - массив параметров name=>value
*/
function mydb_query($sql){
   \\ получаем в массив переданные функции параметры
   $f_params = func_get_args();
   if(is_array(@$f_params[1])){ // есть второй параметр-массив - работаем с именоваными параметрами
     \\второй вариант вызова (массив параметров) $f_params[1] -- это и есть массив именованных параметров
     $sql = preg_replace('/:([\w]+)/e','\'\\\'\'.mysql_escape_string($f_params[1][\'\\1\']).\'\\\'\'',$sql);
   }else{
     \\первый вариант вызова
     array_shift($f_params); \\ удаляем нафиг первый переданный парамет (это текст запроса)
     $i= 0; \\ инициализируем
         \\ замена. Когда встретим в тексте :PARAM_NAME заменим его на текущий элемент f_params и сделаем текущим следующий элемент
     $sql = preg_replace('/:([\w]+)/e','\'\\\'\'.mysql_escape_string($f_params[$i++]).\'\\\'\'',$sql);
   }
   $GLOBALS['mydb_sql'] = $sql; // ДЛЯ ОТЛАДКИ - виден полный запрос после всех экранирований
   return mysql_query($sql);
}

Допустим есть запрос:
$sql = select * from table where a=:nnn and b = :mmm

Слова, начинающиеся с двоеточия - параметры. (не попадитесь - в комментариях параметров быть не должно, в параметрах допустимы только буквы)

Два варианта использования:
первый
$res = my_db($sql,'value for :nnn','value for :mmm') => указываете запрос и параметры в порядке "как в запросе"
Этот вариант удобен, когда параметров мало и они не повторяются.

второй
$params = array('nnn'=>'value for :nnn','mmm'=>'value for :mmm');
$res = my_db($sql,$params); => Удобен, при большом к-ве параметров или их "повторении" в запросах типа '... where a = :P or b = :P and d = :v'

___
P.S.
Сколько по коду не лазил у себя - не нашел варианта с использованием второго варианта ... уже не помню ... кажись второй вариант появился под конец проекта, посему не гарантирую его работу :-) хотя работать должен.

Спустя 13 минут, 31 секунда (31.10.2008 - 12:02) AndryG написал(а):
Цитата
Так.. а какой тогда смысл в mysql_escape_string();
если, magic_quotes_gpc все сама экранирует?

Попишите - увидите :-)
Отключив автомат Вы получаете КОНТРОЛЬ над экранированием, что намного удобней в данном случае.
Например. Юзер вводит адрес "ул.Плюшкина 34\12" ... к Вам приходит строка "ул.Плюшкина 34\\12" ... юзер редактирует название улицы и не замечает, что слешей два ... при сохранении изменений будет записано "ул.Плашкина 34\\\\12" и т.д.

Спустя 7 минут, 57 секунд (31.10.2008 - 12:10) Krist_ALL написал(а):
Можно либо ручкми все экранировать или резать или использовать mysql_expape_string() Я так и не пойму КАКИЕ дебилы пишут скрипты без проверок???????? Можно же такойй урона нанести сайту...

___
P.S.
Krist_All оказался прав. Если не использовать проверки, то можно нанести урон сайту. Причем, урон можно нанести не только своему сайту, но и посещаемым тобой.

Яркий пример.
На сайте Mobile-proff.ru ищем дырку, узнаем пароль админа, который по совместительству является и модератором на ЭТОМ форуме.
Заходим на сайт phpforum.ru под логином Krist_All и начинаем творить чудеса :-)
Мы ж не звери ... поэтому для примера только отредактировали этот пост :-)

Спустя 38 минут, 52 секунды (31.10.2008 - 12:49) ApuktaChehov написал(а):
Набросал функцию фильтрации данных и для SQL и вообще для всего остального.
Код
function prot_data($str){
$str=strip_tags($str);
$str=htmlspecialchars($str, ENT_COMPAT);
$str=mysql_real_escape_string($str);
}

Ваши комментарии...

Спустя 46 минут, 40 секунд (31.10.2008 - 13:36) AndryG написал(а):
Не помню работу функций ... у вас они друг-друга не экранируют?

Вы подразумеваете "ручную" вставку значений в запросы. Таким макаром, Вы ВСЕГДА ручками должны обеззараживать значения при вставке, обрамляя КАЖДЫЙ из них своей функцией. В этом и кроется опасность. Если Вы один раз забудете использовать свою функцию, то появится дырка.

Именно при таком подходе и получаются дырявые сайты -- тут нет инъекции, а тут, когда писали в 3 ночи, - дырка есть.

Предложенная мною функция и была написана для этого -- как ни старайся - никакое значение в запрос без дезинфекции не пройдет.

К тому же всегда используются "полные" запросы, которые можно отладить в любой нормальной среде администрирования БД.

___
P.S.

Krist_ALL, на мой взгляд, Ваше рвение в админы/модераторы и смысл Вашего поста -- не совместимы ... Вы уж определитесь - или Вы флудер или админ :-)

Спустя 21 минута, 43 секунды (31.10.2008 - 13:57) ApuktaChehov написал(а):
Я не понимаю вашу функцию, распешите по подробнее.

Благодарю.

Спустя 5 часов, 20 минут, 40 секунд (31.10.2008 - 19:18) AndryG написал(а):
замените последнюю строку строку на return $sql
попробуйте запуски с разными параметрами - функция будет возвращать готовые к выполнению запросы.

Код
echo mydb_query('select * from table where a = :aa',123);
echo mydb_query('select * from table where a = :aa and b = :er',123,'eeeeee');
echo mydb_query('select * from table where a = :aa and b = :er',array('aa'=>'val_a','er'=>'val_for_er'));


Типа такого - увидите как работает ... объяснить -- это почти трактат о PHP :-)

Спустя 53 минуты, 3 секунды (31.10.2008 - 20:11) Sylex написал(а):
mysql_real_escape_string кстати более безопасна для двоичных данных и учитывает кодировку:

http://www.phpfaq.ru/all#slashes_rightusage
http://habrahabr.ru/blogs/webdev/40458/

Спустя 14 часов, 47 минут, 7 секунд (1.11.2008 - 10:58) Krist_ALL написал(а):
Цитата
P.S.

Krist_ALL, на мой взгляд, Ваше рвение в админы/модераторы и смысл Вашего поста -- не совместимы ... Вы уж определитесь - или Вы флудер или админ :-)


не твое дело

Спустя 4 часа, 33 минуты, 58 секунд (1.11.2008 - 15:32) uMnepaTop написал(а):
Krist_ALL, какой из тебя модер, если ты даже с людьми, разговаривать не умееш...
+ Орфографических ошибок дофигища)
Сорри за оффтоп)

Спустя 1 час, 8 секунд (1.11.2008 - 16:32) Sephiroth_Lukaw написал(а):
*жуёт попкорн*
[closeread]

к слову, насчёт волшебных кавычек
Цитата("http://ru2.php.net/magic_quotes")
This feature has been DEPRECATED and REMOVED as of PHP 6.0.0. Relying on this feature is highly discouraged.

Спустя 10 часов, 8 минут, 39 секунд (2.11.2008 - 02:41) Adil написал(а):
Цитата
Я так и не пойму КАКИЕ дебилы пишут скрипты без проверок???????? Можно же такойй урона нанести сайту...


Например получение данных из БД на сайте где ты Администратор, руководитель проекта??? (http://mobile-proff.ru/komanda.php)




P.S. ответь мне сейчас искренне на вопрос: ты считаешь себя дебилом или нет?

Спустя 2 часа, 27 минут, 53 секунды (2.11.2008 - 05:09) kirik написал(а):
Nezabivaemiy =)
Krist_ALL, там еще поменяй возле логинилки запомнгить, при регистрации - же вЫ сможете, забудите, зарегестрироватЬся, еще поправь ошибки на главной wink.gif

Спустя 1 день, 6 часов, 46 минут, 58 секунд (3.11.2008 - 11:56) AndryG написал(а):
О инъекциях знал только теорию ... но на Вашем,Krist_ALL , сайте прошел от теории к практике за 10 минут :-)

Хотя пароль у Вас хороший стоит и буквы и циферки ... "Ворота крепкие, да только стены хлюпкие"

Что бы не быть флудером, добавлю и полезного в пост. О своей функции.
Добавил комментариев http://www.phpforum.ru/index.php?showtopic...ost&p=53308

Там используется возможность функции "замена по регулярке" перед подстановкой текста, замены выполнять его как PHP-код. И замена происходит НА РЕЗУЛЬТАТ этой замены.
смотрим строку:
Код
$sql = preg_replace('/:([\w]+)/e','\'\\\'\'.mysql_escape_string($f_params[$i++]).\'\\\'\'',$sql);

Ищется код "двоеточие и кучка букв" и заменяется на резултат выполнения кода mysql_escape_string($f_params[$i++])
$i у нас вначале ноль, а потом, благодаря ПОСТ-инкременту увеличивается на единицу.
Таким макаром у нас каждый следующий параметр (двоеточие и кучка букв) в тексте запроса постепенной заменяется на элементы массива f_params.

Такой же механизм применяется и в втором варианте, но там по массиву проход идет не просто от начала к концу, а с массива выбирается тот элемент, индекс, которого указан в имени параметра.

____
P.S.
krist_ALL, не стоит так бурно реагировать на слова людей.
Никто зла Вам не желает (пароли ж тут не показывают Ваши и дырки тоже при себе мы с Незабываемым оставили).
Вам только пытались сказать, что не стоит быть столь категоричным в своих утверждениях. (как видите Ваши злые слова именно с Вами сыграли такую же шутку.)
Да еще ... про безопасность. Если Вы уж модератор, на этом сайте, то хоть пароль не ставьте такой же, как на Вашем "дуршлаге", а то подставляете не только себя. но и этот сайт.

Спустя 4 часа, 22 минуты, 32 секунды (3.11.2008 - 16:18) Adil написал(а):
Цитата
P.S.
krist_ALL, не стоит так бурно реагировать на слова людей.
Никто зла Вам не желает (пароли ж тут не показывают Ваши и дырки тоже при себе мы с Незабываемым оставили).


+ присоединяюсь

Цитата
Вам только пытались сказать, что не стоит быть столь категоричным в своих утверждениях. (как видите Ваши злые слова именно с Вами сыграли такую же шутку.)


Именно это я и хотел сказать в своем предыдущем сообщении...

Спустя 2 часа, 27 минут, 16 секунд (3.11.2008 - 18:46) Krist_ALL написал(а):
Так...
1. Очень зол что взломали мой сайт.
2. Думаете я не находил инекций на других сайтах?
3. Узнали мой пароль эт плохо, но вы смогли сделать что то с сайтом? Ан нет.
4. Если не трудна, напишите мне в аську 422271188 и раскажите баги сайта...
5. Кто спрашивал про дебила? Сам дебил
6. Модератор? Я не модер, эт ток написана, а у мну прав нет шоб удалить тему

Спустя 33 минуты, 1 секунда (3.11.2008 - 19:19) Sylex написал(а):
Цитата(Krist_ALL @ 3.11.2008, 21:46) [snapback]53518[/snapback]
3. Узнали мой пароль эт плохо, но вы смогли сделать что то с сайтом? Ан нет.

Krist_ALL, уверяю - пощадили, не хотели просто laugh.gif

а баги у тебя при отображении статьи, а также при регистрации... инъекции на лицо

Спустя 5 минут, 47 секунд (3.11.2008 - 19:24) Krist_ALL написал(а):
1. В статьях защита хорошая! Не верю шо там баг. Гоните 100% т.к там проверка ид на ис_нумерик и стрлен!
2. Пощадили? Да иди ты знаешь куда со своей пощадой! Я те устрою

вообще-то признаюсь, что я Krist_ALL лох.. извините

Спустя 4 минуты, 25 секунд (3.11.2008 - 19:29) AndryG написал(а):

Вот Ваш логин .. .какая страница? http://mobile-proff.ru/articles/nastrojka_...%20from%20users
Какая защита! Испанская? Нумерик говорите?

А под этим логином можно зайти в админку форума на том сайте http://mobile-proff.ru/articles/nastrojka_...s%20limit%201,1


Спустя 25 секунд (3.11.2008 - 19:29) Sephiroth_Lukaw написал(а):
странно..люди вроде помогают, а столько агрессии...

SQL
Unknown column 'blablabla' in 'where clause'
- уже говорит о многом...

Спустя 5 минут, 10 секунд (3.11.2008 - 19:34) AndryG написал(а):
По структуре твоей базы ... не нужно делать кучу таблиц "моддинг" "секреты" "разное" и т.п. -- всё это СТАТЬИ.

Заведи одну таблицу СТАТЬИ ... добавь еще одно поле "тип статьи" и по нему разделяй моддинг/секреты/и т.п.
Для полной красоты сделай вторую таблицу "ТИПЫ СТАТЕЙ" с полями номер типа и название типа.

Так и поиск легче делать (всё в одной статейке) и данные записывать можно одним запросом, а не разные запросы под каждый тип. Так, смотри, и инъекций поуменьшится :-)

Спустя 14 минут, 26 секунд (3.11.2008 - 19:49) Sylex написал(а):
если ты все же проверяешь id - is_numeric() и strlen() - если одним условием, то убедись, что соединяешь их логическим И, т.е.

Цитата
if ( is_numeric() && strlen() )
или
if ( is_numeric() and strlen() )


а не

Цитата
if ( is_numeric() || strlen() )
или
if ( is_numeric() or strlen() )


а вообще рекомендую intval()

http://ru2.php.net/intval

Спустя 41 минута, 10 секунд (3.11.2008 - 20:30) kirik написал(а):
Цитата(Krist_ALL)
1. В статьях защита хорошая! Не верю шо там баг. Гоните 100% т.к там проверка ид на ис_нумерик и стрлен!
2. Пощадили? Да иди ты знаешь куда со своей пощадой! Я те устрою

1 - если люди узнают твой логин и пароль из базы, то наверное защита не такая и хорошая
2 - это ты зря так..
Цитата(Sephiroth_Lukaw)
люди вроде помогают
=)
С сайтом можно сделать что хочешь, начиная от того, что создать исполняемый файл, заканчивая тем, что можно угнать домен, и хостинг wink.gif Будь аккуратнее со словами!

Чирс!

Спустя 2 часа, 55 минут, 18 секунд (3.11.2008 - 23:25) Adil написал(а):
Цитата
1. Очень зол что взломали мой сайт.

Какой я нехороший. сейчас меня будет мучать совесть...

Цитата
2. Думаете я не находил инекций на других сайтах?

Главное искать их не чужих сайтах, а на своих...

Цитата
3. Узнали мой пароль эт плохо, но вы смогли сделать что то с сайтом? Ан нет.

Целью не было что-то сделать с сайтом, целью было показать тебе, что нефига кричать про дебилов, которые не проверяют входящие данные, в то время как на своем сайте есть такие дыры

Цитата
4. Если не трудна, напишите мне в аську 422271188 и раскажите баги сайта...

После твоего тона общения. не думаю что тебе начнут помогать...бойся чтобы и аську не угнали =)

Цитата
5. Кто спрашивал про дебила? Сам дебил

Значит ты признаешь...

Цитата
6. Модератор? Я не модер, эт ток написана, а у мну прав нет шоб удалить тему

И слава богу...



Цитата
1. В статьях защита хорошая! Не верю шо там баг. Гоните 100% т.к там проверка ид на ис_нумерик и стрлен!

И в статьях и в новостях... вопросик: ты на каждых разделах по другому проверяешь входящие данные,из-за уровня секретности?! )))

Цитата
2. Пощадили? Да иди ты знаешь куда со своей пощадой! Я те устрою

А можно узнать что ты устроишь?) Аж заинтриговал)))

Спустя 5 часов, 28 минут, 54 секунды (4.11.2008 - 04:54) Alchemist написал(а):
Цитата(Sylex @ 3.11.2008, 18:49) [snapback]53526[/snapback]
...
а вообще рекомендую intval()
http://ru2.php.net/intval

Слава Б-гу !! я не один такой !!! ураааа !!!

Спустя 5 часов, 3 минуты, 31 секунда (4.11.2008 - 09:58) AndryG написал(а):
Хочу извинится перед ApuktaChehov. Мы Вашу ветку превратили в откровенный мусорник.

Давайте вернемся к Вашему вопросу :-) У Вас получилось реализовать защиту?

Спустя 2 часа, 10 минут, 7 секунд (4.11.2008 - 12:08) Krist_ALL написал(а):
1. Я сейчас на даче и поэтому немогу исправить инекцию
2. Я сейчас на даче и немогу вам ничего сделать. Интересно что сделаю? Попрошу чуточку терпения.
3. 3ащата была нацелена на символ ' а вот про -1 я совсем забыл, непонимаю как иф(стрлен>7) ечо ерор мог не сработать...
4. Угонют асю? Попробуй
5. Цель-показать баги? А я просил лесть в мой сайт? Сказали бы шо мол есть и все,так вы ещж и структуру пошли глядеть
6. Мой тон? Я бы посмотрел на твой тон када я информатион_схема выложилбы на форум.
7. Советуете про устройства таблиц?я тож посоветую вам сделать аплоад аватарок, сменить двиг форума и сменить модеров/админов

Спустя 43 минуты, 11 секунд (4.11.2008 - 12:51) Sephiroth_Lukaw написал(а):
Цитата("Krist_ALL")
иф(стрлен>7) ечо ерор мог не сработать...
Мне уже интересно на исходник взглянуть...

Спустя 1 день, 4 часа, 56 минут, 45 секунд (5.11.2008 - 17:48) md5 написал(а):
Krist_ALL, а чем тебя не устраивает двиг форума, модеры и админы?
хуй уже с этими аватарками... кстати, которые мы только что включили, чтобы девачки не плакали

Спустя 1 час, 47 минут, 22 секунды (5.11.2008 - 19:35) Krist_ALL написал(а):
итак, я вернулся в москву, где у меня есть инет и
1. Баги исправил // проверьте, хрен че сделаете теперь
2. Какого хрена вы мою подпись постоянна редактите
3. Кто был причастен к иекции на моем сайте, тот ответит

Спустя 2 минуты, 41 секунда (5.11.2008 - 19:38) NRG написал(а):
Krist_ALL, убрал с тебя права модера.... ну тя нах..... ты какойто ебнутый и неадекватный....

Спустя 4 минуты, 21 секунда (5.11.2008 - 19:42) Krist_ALL написал(а):
NRg, а они у меня были? одно название на индексе! пытаючь чета удалить или поднять пишет нет прав!

Цитата
ты какойто ебнутый и неадекватный....

сам мудильник. Заметь , я тя первый не окорблял

Цитата
буду кодить за еду

Бомж штоли? biggrin.gif Идиотская подпись

Спустя 16 минут, 44 секунды (5.11.2008 - 19:59) Xakep написал(а):
корашная тема получилась...

Спустя 11 минут, 31 секунда (5.11.2008 - 20:10) NRG написал(а):
Цитата
Заметь , я тя первый не окорблял


Цитата
и сменить модеров/админов

Спустя 1 минута, 56 секунд (5.11.2008 - 20:12) Krist_ALL написал(а):
Вот настоящий флудер - NRG! в его сообщение только 2 цитаты а своего текста нет.. улет

Спустя 4 минуты, 24 секунды (5.11.2008 - 20:17) NRG написал(а):
еще одно возмущение и в БАН

Спустя 8 минут, 16 секунд (5.11.2008 - 20:25) kirik написал(а):
Цитата(Krist_ALL)
1. Баги исправил // проверьте, хрен че сделаете теперь

хуево исправил

Цитата(Krist_ALL)
3. Кто был причастен к иекции на моем сайте, тот ответит

Цитата(NRG)
ты какойто ебнутый и неадекватный....

тебе показали на твои ошибки, скажи "спасибо" и поправь. Нехер базар разводить

Цитата(Krist_ALL)
Цитата(NRG)
ты какойто ебнутый и неадекватный....
Заметь , я тя первый не окорблял

Это было не оскорбление, а констатация факта.

Цитата(Krist_ALL)
Бомж штоли? biggrin.gif Идиотская подпись

....

Krist_ALL, не обижайся, но ты дурак.
Цитата
Это было не оскорбление, а констатация факта.

Спустя 28 секунд (5.11.2008 - 20:25) Alchemist написал(а):
НЕТ !!! Зачем убивать курицу с золотыми яйцами ?! smile.gif в конце-концов смех продлевает жизнь smile.gif

Спустя 26 секунд (5.11.2008 - 20:26) Krist_ALL написал(а):
да пожалуйста. забанишь, пожалеешь. народ, сами ведь первые напали

Спустя 13 часов, 34 минуты, 40 секунд (6.11.2008 - 10:01) sergeiss написал(а):
С удовольствием прочитал всю тему smile.gif Поржал немало clapping.gif Если будет продолжение - я схожу за чипсами и за попкорном, чтоб приятнее было наблюдать.

Цитата(Krist_ALL @ 5.11.2008, 20:26) [snapback]53660[/snapback]
да пожалуйста. забанишь, пожалеешь. народ, сами ведь первые напали

Вот что меня поражает... Тут, на форуме, зачастую люди специально просят потестить их сайты на предмет взломоустойчивости. И говорят "спасибо" за любую подсказку. А тут подсказали-показали, чтоб исправить мог (для твоей же пользы!!!), а в ответ - матюги, угрозы и вообще полная неадекватность.
"Я фигею, дорогая редакция".

Спустя 35 минут, 5 секунд (6.11.2008 - 10:36) md5 написал(а):
да что там исправлять?
весь сайт один сплошной баг!

Krist_ALL, лечись

Спустя 5 минут, 39 секунд (6.11.2008 - 10:41) Krist_ALL написал(а):
Вот именно я непросил тестить мой сайт! а вы ешо зачемто начали тестить. сами лечитесь от своих багов

Спустя 15 минут, 5 секунд (6.11.2008 - 10:56) sergeiss написал(а):
Цитата(Krist_ALL @ 6.11.2008, 10:41) [snapback]53684[/snapback]
Вот именно я непросил тестить мой сайт! а вы ешо зачемто начали тестить. сами лечитесь от своих багов

Тоже, что ли, пойти потренироваться в хакерстве на твоем сайте? smile.gif

А ты вот представь, что кто-то "вообще левый" это сделает? И "накроется твой сайт медным тазом". И вообще. Люди не тестить начали твой сайт, а решили "потренироваться на кошках". Но потом пожалели "кошку", и решили дать ей шанс. А кошка, ничего не поняв, вытаращила глаза, выставила когти и шипит на всех окружающих smile.gif

Спустя 1 час, 2 минуты, 56 секунд (6.11.2008 - 11:59) Krist_ALL написал(а):
Цитата
А ты вот представь, что кто-то "вообще левый" это сделает? И "накроется твой сайт медным тазом". И вообще. Люди не тестить начали твой сайт, а решили "потренироваться на кошках". Но потом пожалели "кошку", и решили дать ей шанс. А кошка, ничего не поняв, вытаращила глаза, выставила когти и шипит на всех окружающих

Про кошку супппер!
тренироваться я разве запрещаю? тренеруйтесь сколько влезет. я и так замучился фиксить все.. дыр то много .

Спустя 34 минуты, 58 секунд (6.11.2008 - 12:34) AndryG написал(а):
У тебя письмо в личке лежит.
Вот еще дырка http://mobile-proff.ru/sitenews/news_show....s%20limit%209,1 -- исправляй

Спустя 15 минут, 19 секунд (6.11.2008 - 12:50) Krist_ALL написал(а):
все пофиксил

Спустя 34 минуты, 20 секунд (6.11.2008 - 13:24) AndryG написал(а):
Уважаемый, эта тема не про Вас и Ваш сайт -- создавайте тему в нужном разделе .. и Вам покажут еще ;-)

Спустя 27 минут, 20 секунд (6.11.2008 - 13:51) ApuktaChehov написал(а):
Привет всем!

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

Спасибо большое!

P.S. В ближайшие 2 недели, точно попробую вашу функцию.

Спустя 58 минут, 3 секунды (6.11.2008 - 14:49) Sylex написал(а):
Предлагаю завести форум "Курилка", или "Йумаристы", или нет.... "Вошедшие в историю"!! clapping.gif

Тема реально ржачная laugh.gif .

Krist_ALL, ужми еще понты !!!

Ты сайт закрыл что-ли?? acute.gif

Тренировки окончены!

Спустя 1 час, 35 минут, 48 секунд (6.11.2008 - 16:25) Krist_ALL написал(а):
Ща работает тока раздел новости,остальные я зыкрыл до завта,завтра открою.

Ща работает тока раздел новости,остальные я зыкрыл до завта,завтра открою.

Спустя 4 часа, 18 минут, 37 секунд (6.11.2008 - 20:44) Sephiroth_Lukaw написал(а):
Да это пиар ход сайта, я уверен, почти. xD

Спустя 2 часа, 9 минут, 29 секунд (6.11.2008 - 22:53) Adil написал(а):
Ребята вы видите что натворили?!!! У бедного парня уже паранойя: =))))

Цитата
В целях безопасности восстановление производится администратором в ручном режиме. Для восстановления пароля свяжитесь с администратором


_____________
Быстрый ответ:

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