И веркор атак может быть и без звездочек..Просто * это огромная дыра...Вы выгружаете всю таблицу...Зачем? Это поле для маневров...А дал наводку, а не мануал или панацею..
Если таблицы действительно очень большие и колонок очень много, то перечисление этих колонок не является дурным тоном, и проверку на содержимое тоже еще никто не отменял....
Для просмотра ссылки Войди или Зарегистрируйся
Для просмотра ссылки Войди или Зарегистрируйся
Вы просто немного не понимаете о чем говорите, а именно сложности вызывает слово Injection в SQL Injection.
Сама по себе звездочка - вполне безопасна и не несет никакого вреда. Это никакая не огромная дыра и никакое не поле для маневров.
Сейчас вы из-за отсутствия аргументов кинулись в какие-то крайности, если у вас 150 столбцов - тогда вы будете перечислять их, если 5 столбцов - какой смысл? А если у вас ActiveRecord, тогда что? Там в любом случае надо выбирать все что есть и тут звездочка будет вам только в помощь. Зачем гонять на сервер запросы со 150 перечисленными полями, если выбирать все надо? Вы теряете производительность на пустом месте, величина запроса увеличивает сетевую нагрузку, перечисление - нагружает механизм разбора запроса перед исполнением в БД и т.д. А про скорость разработки я вообще молчу, сколько вы будете формировать такие запросы?
Звездочка - это не выборка всей таблицы, это всего-лишь предфинальное формирование результата (финальное - это ORDER). Не важно что вы напишете в SELECT, база данных все равно будет оперировать всеми столбцами гигантских таблиц. Не важно, select id from у вас там или select * from. SELECT работает перед ORDER BY, но после FROM, JOIN, GROUP, HAVING, WHERE.
Теперь поговорим об инъекции. Сама по себе инъекция не возможна при качественной фильтрации данных и работает она на более ранних этапах, чем SELECT. И если у вас есть id='$_GET['id']', то злоумышленника будет интересовать вовсе не то что у вас в селекте, он пришлет вам айдишник вида: 0';SELECT * FROM user_credit_cards;/*, а перед этим 0';SHOW TABLES;/*. Таким образом на сервере у вас уйдет
Код:
SELECT * FROM users where id='0';SELECT * FROM user_credit_cards;/*' and password=ноэтоуженеважноибокомментарий.
И заметьте, никакая ваша звездочка в этом запросе не участвует и никого не интересует.