Уровень защиты, который вы ищете, обеспечивается обратными кавычками:
"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";
Я использую оболочку базы данных, которая имеет отдельные функции для очистки данных и идентификаторов базы данных, и это то, что делает последний :)
07.01.2010