безопасное экранирование имен таблиц / имен столбцов

Я использую 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, иначе у вас есть дополнительные соображения).