Zde je mnohem bezpečnější alternativa:
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';
Co jsem změnil?
- Vždy používejte
dbo
prefix při vytváření / odkazování na objekty. - Názvy tabulek a sloupců jsou
NVARCHAR
a může být delší než 150 znaků. Mnohem bezpečnější je umožnit, aby se parametry přizpůsobily tabulce, kterou by někdo mohl přidat v budoucnu. - Přidáno
SET NOCOUNT ON
jako ochrana proti režii sítě a potenciálnímu odesílání sad chybných výsledků klientovi. @sql
by měl být vždyNVARCHAR
.- Použijte
QUOTENAME
kolem názvů entit, jako jsou tabulky nebo sloupce, aby se zabránilo vkládání SQL a také aby se zabránilo špatně zvoleným názvům (např. klíčovým slovům). - Pokud je to možné, používejte správné parametry (opět vám pomůže zmařit injektování SQL, ale také abyste nemuseli provádět všechny druhy escapování oddělovačů u parametrů řetězce).