Daca va intereseaza subiectul stiti deja ca o masura contra SQL Injection este validarea a "user input".
Validarea parametrilor de intrare poate fi realizata prin mai multe metode printre care:
- Stabilirea caracterelor permise pentru parametrii de input si respingerea input-ului care nu corespunde.
- Respingerea input-ului cunoscut ca fiind rau intentionat (nume de proceduri stocate extinse: xp_cmdshell, secvente de escape gen --, caractere speciale ca apostroful de exemplu etc).
Prima varianta este de cele mai multe ori cea mai eficienta deoarece lista cu ce este acceptabil ca parametru pentru o aplicatie, este de cele mai multe ori stabila pe cand lista cu ce nu este acceptabil modificandu-se mereu.
Urmatorul exemplu demonstreaza de ce folosirea celei de a doua metode nu este eficienta:
Sa presupunem ca lista neagra cu parametrii de intrare contine functia @@VERSION. Un exemplu de parametru de intrare interzis ar fi 'SELECT @@VERSION'.
Ce spuneti insa despre 0x53454C45435420404056455253494F4E? La prima vedere nu prea seamna cu @@VERSION. Haideti sa rulam urmatorul cod:
DECLARE @sql VARCHAR(8000)
SELECT @sql = 0x53454C45435420404056455253494F4E
EXEC(@sql);
-- Output on my computer
Microsoft SQL Server 2005 - 9.00.2047.00 (Intel X86) Apr 14 2006 01:12:25 Copyright (c) 1988-2005 Microsoft Corporation Developer Edition on Windows NT 5.1 (Build 2600: Service Pack 2)
Interesant nu? Ca sa vedem ce este in spatele lui 0x53454C45435420404056455253494F4E avem o metoda simpla:
DECLARE @sql VARCHAR(8000)
SELECT @sql = 0x53454C45435420404056455253494F4E
SELECT CAST(@sql as VARCHAR);
-- Output
SELECT @@VERSION
0x53454C45435420404056455253494F4E este reprezentarea hexa a sirului de caractere 'SELECT @@VERSION'.
Oricum, orice metoda de validare folositi, este mult mai eficienta decat lipsa completa a validarii.
Cristian Andrei Lefter, SQL Server MVP
MCT, MCSA, MCDBA, MCAD, MCSD .NET,
MCTS, MCITP - Database Administrator SQL Server 2005
http://sqlserver.ro