Я использую PDO в php и поэтому не могу избежать имен таблиц или имен столбцов, используя подготовленные операторы. Будет ли это безошибочным способом реализовать его самостоятельно:
$tn = str_replace('`', '', $_REQUEST['tn']); $column = str_replace('`', '', $_REQUEST['column']); $sql = "SELECT * FROM `tn ` WHERE `column` = 23"; print_r( $pdo->query($sql)->fetchAll() );
Или есть еще какой-то способ, чтобы это можно было атаковать?
Вы можете использовать динамический белый список, запросив базу данных, какие столбцы действительны для данной таблицы базы данных. Это дополнительный sql-запрос, но безопасность хорошая.
select COLUMN_NAME from INFORMATION_SCHEMA.COLUMNS where TABLE_SCHEMA = :databaseName and TABLE_NAME = :tableName
Извлеките результаты, а затем просто убедитесь, что все имена динамических столбцов находятся в наборе результатов.
Я считаю, что взгляды включены в INFORMATION_SCHEMA.COLUMNS
, так что все должно работать просто.
Затем просто используйте обратные ссылки вокруг утвержденных имен столбцов при сборке динамического sql (предположим, вы используете только имена столбцов ascii, иначе у вас есть дополнительные соображения).