Уровень защиты, который вы ищете, обеспечивается backticks :
"SELECT * FROM `$db` WHERE 1";
Обратные метки используются для определения идентификаторов , которые в противном случае могли бы быть неоднозначными (т. Е. зарезервированные слова MySQL ), и если вы принимаете пользовательский ввод или имеете столбцы или базы данных с переменным именем, Вы обязательно должны использовать обратные пометки, или я могу обещать, что у вас будут проблемы в будущем. Например, что если у вас была система, в которой было создано временное имя поля с некоторым пользовательским вводом, только оказалось, что поле получило имя update
?
"SELECT field1,field2,update FROM table;"
Это с треском проваливается. Тем не менее:
"SELECT `field`,`field2`,`update` FROM table"
работает просто отлично. (На самом деле это реальный пример системы, над которой я работал несколько лет назад, с этой проблемой).
Это решает вашу проблему с точки зрения использования плохого SQL. Например, следующий запрос просто вернет ошибку «неизвестный столбец», где test; DROP TABLE test
- введенный код атаки:
"SELECT * FROM `test; DROP TABLE test`;"
Будьте осторожны: SQL-инъекция все еще возможна с обратными галочками!
Например, если ваша переменная $db
содержит данные, в которых имеет обратную черту , вы все равно можете ввести SQL-код обычным способом. Если вы используете переменные данные для имен баз данных и полей, вы должны удалить все обратные пометки, прежде чем вставлять их в свой оператор, а затем квалифицировать их обратными пометками один раз внутри.
$db = str_replace('`','',$db);
$sql = "SELECT * FROM `$db` WHERE 1";
Я использую обертку базы данных, которая имеет отдельные функции для очистки данных и очистки идентификаторов базы данных, и вот что делает последняя:)