За последние 24 часа нас посетили 17490 программистов и 1712 роботов. Сейчас ищут 1534 программиста ...

Экранирование названия таблиц

Тема в разделе "PHP и базы данных", создана пользователем [code], 31 окт 2014.

  1. [code]

    [code] Новичок

    С нами с:
    14 июл 2014
    Сообщения:
    32
    Симпатии:
    0
    Добрый вечер!
    Вот, например, у меня есть следующий запрос:
    "SELECT name FROM $table WHERE id=$id"
    Переменная $id у меня заэкранирована, а $table я экранировать не могу, иначе в любом случае будет ошибка. Следовательно вопрос, что с этим делать? Если я не ошибаюсь, то злоумышленник может подсунуть мне в $table что - нибудь необычное, и все будет очень плохо. Или можно просто $table в обратные кавычки поместить и этого достаточно будет для безопасности?
     
  2. metadon

    metadon Активный пользователь

    С нами с:
    6 фев 2006
    Сообщения:
    779
    Симпатии:
    0
    А $table разве пользователь выбирает?
    Используй подготовленные запросы http://habrahabr.ru/post/141127/
     
  3. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    и можешь и должен
     
  4. [code]

    [code] Новичок

    С нами с:
    14 июл 2014
    Сообщения:
    32
    Симпатии:
    0
    $table я через $_GET получаю. Без подготовленных запросов никак?

    Если, например, в $table лежит "users", то после экранирования будет "'users'", следовательно в запросе:
    SELECT FROM 'users' WHERE id=$id
    В этом случае выдает ошибку, хотя если убрать экранирование, то все ок. Если как - то по - другому можно, то подскажи, я за этим и написал на форум.
     
  5. metadon

    metadon Активный пользователь

    С нами с:
    6 фев 2006
    Сообщения:
    779
    Симпатии:
    0
    Вместо одинарной кавычки используй вот этот знак `
    Прочитай книгу про mysql
    И используй подготовленные запросы.
     
  6. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    во-первых, там не должно быть таких кавычек. Во-вторых, не будет там того, что ты написал. Читай доку.
     
  7. Хыиуду

    Хыиуду Активный пользователь

    С нами с:
    3 июн 2014
    Сообщения:
    618
    Симпатии:
    5
    Даже если без подготовленных запросов, без плейсхолдеров, сурово, по-крестьянски:
    Код (PHP):
    1. $allowed_tables=array('users', 'news', 'comments', 'goods');
    2. if (in_array($_GET['table'], $allowed_tables)) die('Что за хрень вы от меня просите?'); 
    Но все равно не вижу никакого оправдания тому, что имя таблицы передается через GET. У вас как-то явно очень неоптимально спроектирована система.