Come evitare iniezioni SQL lato DB in SQLServer, Oracle, MySQL

 Come evitare iniezione SQL: lato SQL Server (SP_EXECUTESQL)

In generale va evitato nel modo più assoluto la scrittura di query sql diamiche.

Va evitato cioè  l’uso lato SQL Server di sp_executesql e EXEC

Di seguito mostriamo come trasformare una query “dinamica” in una “statica”

 

CREATE PROCEDURE search_orders @custid   nchar(5)     = NULL,

@shipname nvarchar(40) = NULL AS

DECLARE @sql nvarchar(4000)

SELECT @sql = ' SELECT OrderID, OrderDate, CustomerID, ShipName ' +

' FROM dbo.Orders WHERE 1 = 1 '

IF @custid IS NOT NULL

SELECT @sql = @sql + ' AND CustomerID LIKE ''' + @custid + ''''

IF @shipname IS NOT NULL

SELECT @sql = @sql + ' AND ShipName LIKE ''' + @shipname + ''''

EXEC(@sql)

….

In tale esempio, a fronte di un form con parametri opzionali come custid e shipname, viene erroneamente utilizzata una query dinamica. Il modo corretto di procedere è invece il seguente.

1 Definire la stored procedure come:

 

CREATE PROCEDURE search_orders @custid   nchar(5)     = NULL,

@shipname nvarchar(40) = NULL AS

DECLARE @sql nvarchar(4000)

SELECT OrderID, OrderDate, CustomerID, ShipName
FROM dbo.Orders
WHERE ((@custid  IS NULL) OR (CustomerID like @custid))
AND   ((@shipname IS NULL) OR (ShipName LIKE @shipname))

….

 

2 Far sì che la stored procedure  va chiamata attraverso l’uso dei Parameters descritti nel paragrafo precedente.

 

La query così definita ha i seguenti vantaggi:

  1. E’ molto sicura
  2. E’ facile da mantenere (per esempio per aggiungere/togliere condizioni)
  3. E’ compilata come stored procedure, e quindi il suo piano di esecuzione viene ottimizzato dopo ogni esecuzione (una query passata ad EXEC è interpretata, compilata, ecc ogni volta e molte versioni di SQL Server di norma  non mantengono il piano di esecuzione di una query on the fly)
  4. Poiché le condizioni in OR sono facili da verificare, il database ottimizza automaticamente la query a fronte degli input, evitando le verifiche inutili. Per esempio se sono nulli entrambi gli input, il database effettua una semplice query
    SELECT OrderID, OrderDate, CustomerID, ShipName FROM dbo.Orders
  5. Non dipende da estensioni proprietarie e quindi è più facile da migrare a differenti versioni di SQL Server o di Oracle.
  6. E’ facile da leggere, capire e trascrivere.

 

Per maggiori informazioni

Phing

PHing Is Not GNU make; it’s a project build system based on Apache Ant. You can do anything with it that you could do with a traditional build system like GNU make, and its use of simple XML build files and extensible PHP “task” classes make it an easy-to-use and highly flexible build framework. Features include file transformations (e.g. token replacement, XSLT transformation, Smarty template transformations), file system operations, interactive build support, SQL execution, CVS operations, tools for creating PEAR packages, and much more.

via Phing.

A very good hosting provider

After my past experience with bad hosting provider, I am happy to say I have find a very good hosting service.
If you need VPS hosting, Rimuhosting is a very good choice.

After about two years with Rimuhosting, I can summarize their feature here:

  • They have a very good  entry-price for a virtual hosting
  • System aministrator has a very prompt response: on every issue I get support in 24 hours, also on Sunday
  • Rimuhosting uses a Xen virtualization mechanism which is very effective. I have tried other virtualized solution, which are worst.
  • Java hosting works well, without problems.
  • The default Bandwith is very huge (30GB). There is also  an automatic backup and a remote web-based shell out-of-the-box.
  • You can choose between high-end Linux distribution  (like Red Hat enterprise) and free one.