MySqlParameter as TableName - PullRequest
       25

MySqlParameter as TableName

2 голосов
/ 18 мая 2011

Я хочу использовать MySqlParameter для передачи tableName в запрос (для предотвращения инъекций slq)

MySqlCommand cmd = new MySqlCommand("select * from @table"), cn)
cmd.Parameters.AddWithValue("@table",TableName);

Но это не работает.Как я могу передать tableName в качестве параметра

PS Я пытался изменить @ на ? - не работает

1 Ответ

5 голосов
/ 18 мая 2011

Вы не можете передать имя таблицы в качестве параметра.Для этого нужно использовать динамический SQL, поэтому для этого нужно сконцентрировать строку, например

  MySqlCommand cmd = new MySqlCommand(String.Format("select * from {0}",tableName), cn)

Но поскольку пользователи вводят tableName, внедрение SQL возможно.Вы можете использовать этот SQL, чтобы определить, существует ли эта таблица перед запросом чего-либо из нее:

SELECT table_name
FROM information_schema.tables
WHERE table_schema = 'databasename'
AND table_name = 'tablename';

(Вы можете идеально параметризовать этот запрос, чтобы исключить внедрение SQL)

Как правило, будетосторожны с SQL-инъекцией.Но если вы используете это внутреннее (не для пользователя), то внедрение SQL не должно быть проблемой.

Лучше, вы можете создать хранимую процедуру для решения этой проблемы, как в моем другом ответе:

Унифицированный SQL-геттер с LINQ

...