Hier is een veel veiliger alternatief:
ALTER PROCEDURE dbo.queryfunctions
@Tabname NVARCHAR(511),
@colname NVARCHAR(128),
@valuesname VARCHAR(150)
AS
BEGIN
SET NOCOUNT ON;
DECLARE @sql NVARCHAR(MAX);
SET @sql = 'SELECT * FROM ' + @Tabname
+ ' WHERE ' + QUOTENAME(@colname) + ' = @v';
EXEC sp_executesql @sql, N'@v VARCHAR(150)', @valuesname;
END
GO
EXEC dbo.queryfunctions N'dbo.education', N'eduChildName', 'Revathi';
Wat heb ik veranderd?
- Gebruik altijd
dbo
voorvoegsel bij het maken van / verwijzen naar objecten. - Tabel- en kolomnamen zijn
NVARCHAR
en kan langer zijn dan 150 tekens. Veel veiliger om de parameters toe te staan aan een tafel die iemand in de toekomst zou kunnen toevoegen. - Toegevoegd
SET NOCOUNT ON
als bescherming tegen netwerkoverhead en mogelijk het verzenden van foutieve resultatensets naar de klant. @sql
moet altijdNVARCHAR
. zijn .- Gebruik
QUOTENAME
rond entiteitsnamen zoals tabellen of kolommen om SQL-injectie te helpen tegengaan en ook om te waken tegen slecht gekozen namen (bijv. trefwoorden). - Gebruik waar mogelijk de juiste parameters (opnieuw om SQL-injectie te voorkomen, maar ook om te voorkomen dat u allerlei soorten scheidingstekens op tekenreeksparameters moet omzeilen).