sql >> Databáze >  >> RDS >> Sqlserver

sql argument uložené procedury jako parametr pro dynamický dotaz

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?

  1. Vždy používejte dbo prefix při vytváření / odkazování na objekty.
  2. 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.
  3. 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.
  4. @sql by měl být vždy NVARCHAR .
  5. 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).
  6. 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).


  1. Nelze najít uživatele '', protože neexistuje nebo nemáte oprávnění

  2. Při pokusu o přístup k serveru SQL Server 2008 v mé doméně se zobrazí chyba server nenalezen nebo nebyl přístupný

  3. PHP JSON Group o stejnou hodnotu

  4. Systém Windows nemůže najít „http://.127.0.0.1:%HTTPPORT%/apex/f?p=4950“. Ujistěte se, že jste jméno zadali správně, a zkuste to znovu