И вот тут встает проблема, что не удается произвести запрос.
Собственно, код:
if (isset($_GET['list'])) {$list=$_GET['list']; //в данном случае попадает сюда значение furniture
$poisk = mysql_query("SELECT * FROM '$list' WHERE cath='tables'",$db);
$products = mysql_fetch_assoc($poisk);}
И тут,разумеется, встают проблемы, потому что php ругается, а что делать - непонятно, поскольку таблиц несколько и передаваться будут разные значения, а как из этих таблиц вытаскивать данные в данном случае - непонятно.
В идеале, должно получиться так:
if (isset($_GET['list'])) {$list=$_GET['list']; //в данном случае попадает сюда значение furniture
$poisk = mysql_query("SELECT * FROM furniture WHERE cath='tables'",$db);
$products = mysql_fetch_assoc($poisk);}
Как сделать так, чтобы нормально получилось получить значение из адресной строки по моему коду или же есть какой-то альтернативный и более разумный вариант?
Спустя 7 минут, 54 секунды (23.03.2012 - 17:48) Visman написал(а):
Я бы не рекомендовал подставлять имена таблиц из гет в запрос без проверки!
Массив создай с именами всех разрешенных таблиц и проверяй имя из гет на наличие в этом массиве.
Если есть, то можно и в запрос поставить.
Массив создай с именами всех разрешенных таблиц и проверяй имя из гет на наличие в этом массиве.
Если есть, то можно и в запрос поставить.
Спустя 48 секунд (23.03.2012 - 17:48) Visman написал(а):
'$list'
-->
`$list`
Спустя 29 минут, 5 секунд (23.03.2012 - 18:17) neitrosha написал(а):
Visman.
Отлично, спасибо, идея очень понравилась
Отлично, спасибо, идея очень понравилась
Спустя 1 час, 3 минуты, 32 секунды (23.03.2012 - 19:21) Placido написал(а):
Я делаю так. Обрамляю в запросе переменную обратными апострофами, а саму переменную, в которой лежит имя таблицы, прогоняю через str_replace() для того, чтобы исключить инъекцию. Вот так:
$list = str_replace("`", "``", $list);
$poisk = mysql_query("SELECT * FROM `$list` WHERE cath='tables'",$db);
Спустя 3 минуты, 43 секунды (23.03.2012 - 19:25) Visman написал(а):
$list = mysql_real_escape_string($list);
$poisk = mysql_query("SELECT * FROM `$list` WHERE cath='tables'",$db);
Спустя 3 минуты, 56 секунд (23.03.2012 - 19:29) Visman написал(а):
Placido, но все равно не верно, так как таблицы может не быть.
Нужна проверка через массив на допустимые имена таблиц.
Нужна проверка через массив на допустимые имена таблиц.
Спустя 12 минут, 37 секунд (23.03.2012 - 19:41) Placido написал(а):
Цитата (Visman @ 23.03.2012 - 18:25) |
$list = mysql_real_escape_string($list); |
mysql_real_escape_string() не экранирует обратные апострофы, и поэтому в этом случае инъекция возможна, например:
$list = 'databasename` WHERE 1+1 -- ';
Спустя 1 минута, 50 секунд (23.03.2012 - 19:43) Placido написал(а):
Цитата (Visman @ 23.03.2012 - 18:29) |
Нужна проверка через массив на допустимые имена таблиц. |
С этим согласен.