2011-05-18 2 views
2

Je veux utiliser MySqlParameter pour passer tableName dans la requête (pour éviter les injections de SLQ)MySqlParameter comme TableName

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

Mais cela ne fonctionne pas. Comment puis-je passer tableName en tant que paramètre

P.S. J'ai essayé de changer @ à ? - ne fonctionne pas

Répondre

5

Vous ne pouvez pas passer le nom de la table comme paramètre. Vous devez utiliser SQL dynamique pour ce faire, vous devez donc à la concentration de la chaîne pour le faire, par exemple

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

Mais parce que les entrées des utilisateurs du tableName, l'injection SQL est donc possible. Vous pouvez utiliser ce SQL pour déterminer si cette table existe avant toute requête de celui-ci:

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

(Vous pouvez parfaitement paramétrer cette requête, si l'injection SQL sera éliminé)

En général, prenez garde de l'injection SQL . Mais si vous utilisez cette interne (ne pas exposer à l'utilisateur), l'injection SQL ne devrait pas poser de problème.

Mieux, vous pouvez construire une procédure stockée pour faire face à cela, comme dans mon autre réponse:

Unified SQL getter with LINQ

+2

-1. c'est une mauvaise approche pour utiliser la chaîne pure, parce que je pourrais passer 'tableName =" utilisateurs; DROP TABLE utilisateurs; "', et cela va supprimer la table – Stecya

+0

@Stecya: voir ma réponse mise à jour – Vimvq1987

+0

L'utilisateur va entrer le nom de table. Je préfère ne pas utiliser la procédure stockée, besoin d'une solution côté client – Stecya

Questions connexes