Модераторы: skyboy, MoLeX, Aliance, ksnk

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Сортировка БД и защита от SQL Injections 
:(
    Опции темы
Aliance
Дата 25.5.2006, 01:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


I ♥ <script>
****


Профиль
Группа: Модератор
Сообщений: 6418
Регистрация: 2.8.2004
Где: spb

Репутация: 3
Всего: 137



Необходимо реализовать сортировку БД, через get данные. Так же нужно учитывать безопастность, тем самым обрубив возможность для SQL Injections. Вот мой код:
Код

$sort = mysql_real_escape_string($_GET['sort']);
$field = mysql_real_escape_string($_GET['field']);

if (!empty($sort) && !empty($field)) {
   $sql = "SELECT * FROM `таблица` ORDER BY `{$field}` {$sort}";
} else {
   $sql = "SELECT * FROM `таблица` ORDER BY `id` ASC";
}

$result = mysql_query($sql) or die('Ошибка подключения к БД');


URL domen.com/index.php?m=staff&sort=asc&field=nick - все работает.
URL domen.com/index.php?m=staff&sort=asc&field=nick' - выводит Ошибка подключения к БД. Но, если я не ошибаюсь, функция mysql_real_escape_string должна обрубать все недозволенные символы?! 
PM MAIL WWW ICQ Skype   Вверх
vasac
Дата 25.5.2006, 09:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1060
Регистрация: 4.5.2006

Репутация: 3
Всего: 36



Aliance, mysql_real_escape_string() не обрубает символы - она их экранирует.
Т.е. здесь сортировка пойдет все равно nick'.
Будет тоже самое, что написать:
domen.com/index.php?m=staff&sort=XXX&field=kakayato_laga
т.е. ничего не будет.
 
PM WWW   Вверх
Vaulter
Дата 25.5.2006, 10:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1724
Регистрация: 30.12.2002
Где: бункер

Репутация: 3
Всего: 22



Aliance, 
Код

$result = mysql_query($sql) or die('Ошибка подключения к БД: '.mysql_error());

и тайное станет явным 


--------------------
PM MAIL WWW ICQ   Вверх
Aliance
Дата 25.5.2006, 14:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


I ♥ <script>
****


Профиль
Группа: Модератор
Сообщений: 6418
Регистрация: 2.8.2004
Где: spb

Репутация: 3
Всего: 137



Цитата(Vaulter @  25.5.2006,  11:44 Найти цитируемый пост)
и тайное станет явным

вот этого как раз делать нельзя, иначе злоумышленник получит информацию.

так в целом мой код правильный, injection не пройдет? 
PM MAIL WWW ICQ Skype   Вверх
vasac
Дата 25.5.2006, 14:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1060
Регистрация: 4.5.2006

Репутация: 3
Всего: 36



Цитата

вот этого как раз делать нельзя, иначе злоумышленник получит информацию

Так не на нормальном же сайте делать, а у себя при разработке.

А что делает mysql_real_escape_string() с различными символами можно узнать достаточно просто:
Код

print mysql_real_escape_string( $query );
 
PM WWW   Вверх
-=Ustas=-
Дата 25.5.2006, 18:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ustix IT Group
****


Профиль
Группа: Участник Клуба
Сообщений: 2222
Регистрация: 21.1.2005
Где: Краснодар

Репутация: 17
Всего: 69



Цитата(Aliance @  25.5.2006,  14:19 Найти цитируемый пост)
так в целом мой код правильный, injection не пройдет?

Я бы не стал передавать открыто поля таблицы. 


--------------------
В искаженном мире все догмы одинаково произвольны, включая догму о произвольности догм.
-----
PM WWW ICQ Skype   Вверх
Opik
Дата 25.5.2006, 21:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Vingrad developer
Сообщений: 1918
Регистрация: 6.10.2004
Где: Рига

Репутация: 2
Всего: 55



Aliance, 
mysql_escape_string предназначена не для того.
У тебя неправильный подход. 
сделай лучше что то типо того:
Код

switch($_GET['orderby'])
{ 
    case 1: $oder = 'ORDER BY test ASC'; break;
    case 2...
}
$query = mysql_query("SELECT ...".$order);

и уже ссылки типа:
script.php?orderby=1 
PM MAIL Skype   Вверх
Aliance
Дата 25.5.2006, 22:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


I ♥ <script>
****


Профиль
Группа: Модератор
Сообщений: 6418
Регистрация: 2.8.2004
Где: spb

Репутация: 3
Всего: 137



ИМХО это извращение smile Да и я читал много о том, что mysql_escape_string нужно использовать каждый раз, когда данные от пользователя вставляются в sql запрос. Но доверился твоему опыту и сделал как ты посоветовал.

Вот что получилось:
Код

$sort = intval($_GET['sort']);

switch($sort) { 
   case 1:
      $sql = 'SELECT * FROM `таблица` ORDER BY `поле` DESC';
      break;
   case 2:
      $sql = 'SELECT * FROM `таблица` ORDER BY `поле` ASC';
      break;
   case 3:
      $sql = 'SELECT * FROM `таблица` ORDER BY `поле` DESC';
      break;
   case 4:
      $sql = 'SELECT * FROM `таблица` ORDER BY `поле` ASC';
      break;
   case 5:
      $sql = 'SELECT * FROM `таблица` ORDER BY `поле` DESC';
      break;
   case 6:
      $sql = 'SELECT * FROM `таблица` ORDER BY `поле` ASC';
      break;
   default:
      $sql = 'SELECT * FROM `таблица` ORDER BY `поле` ASC';
      break;
}

$result = mysql_query($sql) or die('Ошибка подключения к БД');


Добавлено @ 23:00 
Цитата(-=Ustas=- @  25.5.2006,  19:04 Найти цитируемый пост)
Я бы не стал передавать открыто поля таблицы. 

а чего тут такого? поле id есть в 90% таблиц, либо его вариации smile да и если у меня есть имена пользователей, не тружно догадаться, что поле называется name, login или nick smile 
PM MAIL WWW ICQ Skype   Вверх
-=Ustas=-
Дата 26.5.2006, 08:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ustix IT Group
****


Профиль
Группа: Участник Клуба
Сообщений: 2222
Регистрация: 21.1.2005
Где: Краснодар

Репутация: 17
Всего: 69



Цитата(Aliance @  25.5.2006,  22:58 Найти цитируемый пост)
а чего тут такого? 

Да в общем-то ничего, это конечно дело твое, можешь и кода чуть-чуть выложить на страничку ;)

Цитата(Aliance @  25.5.2006,  22:58 Найти цитируемый пост)
Вот что получилось:

ИМХО, это по-моему слишком громаздко, я бы на твоем месте сделал бы следующим образом:
Код

<?php

$field = array();
$field[0] = 'id';
$field[1] = 'title';
$field[2] = 'sort';
$field[3] = 'content';
$field[4] = 'other';

$sort  = intval($_GET['sort']);
$order = (array_key_exists($sort, $filed)) ? $field[$sort] : $field[0];
$sql = 'SELECT * FROM `таблица` ORDER BY `'.$order.'` DESC';

?>
 


--------------------
В искаженном мире все догмы одинаково произвольны, включая догму о произвольности догм.
-----
PM WWW ICQ Skype   Вверх
vasac
Дата 26.5.2006, 10:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1060
Регистрация: 4.5.2006

Репутация: 3
Всего: 36



Цитата

а чего тут такого?

Конкретно в данном примере м.б. и ничего особенного. Только SQL-инъекции, с которыми вы так усиленно боретесь, происходят именно от того, что в запрос вставляются данные непосредственно полученные от пользователя.
 
PM WWW   Вверх
-=Ustas=-
Дата 26.5.2006, 10:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ustix IT Group
****


Профиль
Группа: Участник Клуба
Сообщений: 2222
Регистрация: 21.1.2005
Где: Краснодар

Репутация: 17
Всего: 69



Цитата(vasac @  26.5.2006,  10:00 Найти цитируемый пост)
Конкретно в данном примере м.б. и ничего особенного. Только SQL-инъекции, с которыми вы так усиленно боретесь, происходят именно от того, что в запрос вставляются данные непосредственно полученные от пользователя.

Солидарен smile 


--------------------
В искаженном мире все догмы одинаково произвольны, включая догму о произвольности догм.
-----
PM WWW ICQ Skype   Вверх
jsse
Дата 26.5.2006, 11:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 99
Регистрация: 1.5.2006
Где: Кривой Рог

Репутация: нет
Всего: 2



Правильный подход к решению у -=Ustas=- с помощью массива,
тогда не возникнет проблемы с неправильным названием поля,
но если требуется удалить ненужные символы можно поступить так:

Код

$sort = preg_replace("([^a-zA-Z0-9])", "", $_GET['sort']);
$field = preg_replace("([^a-zA-Z0-9])", "", $_GET['field']);


т.е. оставить только те символы, которые будут присутствовать в названии поля таблицы. 
PM WWW Skype   Вверх
Aliance
Дата 26.5.2006, 14:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


I ♥ <script>
****


Профиль
Группа: Модератор
Сообщений: 6418
Регистрация: 2.8.2004
Где: spb

Репутация: 3
Всего: 137



jsse, не вижу в этом необходимости - данные, передаваемые в адресе строки - числа. Функции intval() должно хватить smile

vasac, я решал задачу не в целом, а под данный конкретный пример smile


-=Ustas=-, мне нужно делать и desc и asc сортировку. Тогда уж нужно твой вариант переписать так, чтобы была матрица?! 
PM MAIL WWW ICQ Skype   Вверх
-=Ustas=-
Дата 26.5.2006, 14:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ustix IT Group
****


Профиль
Группа: Участник Клуба
Сообщений: 2222
Регистрация: 21.1.2005
Где: Краснодар

Репутация: 17
Всего: 69



Хм... зачем еще матрица, по аналогии с полями:
Код

<?php

$field = array();
$field[0] = 'id';
$field[1] = 'title';
$field[2] = 'sort';
$field[3] = 'content';
$field[4] = 'other';

$sort  = intval($_GET['sort']);
$type  = (intval($_GET['order'])) ? 'DESC' : 'ASC';
// т.е. _GET['order'] если 1, то DESC, если 0 то ASC
$order = (array_key_exists($sort, $filed)) ? $field[$sort] : $field[0];
$sql = 'SELECT * FROM `таблица` ORDER BY `'.$order.'` '.$type;

?>
 


--------------------
В искаженном мире все догмы одинаково произвольны, включая догму о произвольности догм.
-----
PM WWW ICQ Skype   Вверх
Aliance
Дата 26.5.2006, 20:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


I ♥ <script>
****


Профиль
Группа: Модератор
Сообщений: 6418
Регистрация: 2.8.2004
Где: spb

Репутация: 3
Всего: 137



Цитата(-=Ustas=- @  26.5.2006,  15:51 Найти цитируемый пост)
$type  = (intval($_GET['order'])) ? 'DESC' : 'ASC';

а если $_GET['order'] будет установлено в ghdghdt какую-нибудь? 
PM MAIL WWW ICQ Skype   Вверх
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Базы Данных | Следующая тема »


 




[ Время генерации скрипта: 0.0587 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.