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

Twitter il gradasso

C’è una cosa fantastica di Internet: se qualsiasi società prova a fare la furba, inserendo delle righe scritte in piccolo quando revisiona la sua API da 1.0 a 1.1, state certi che ci sarà  almeno una persona che si leggerà tutto, troverà la fregatura e sputtanerà la summenzionata società.

E’ quello che è successo con Twitter, e Marco Arment analizza nei dettagli le “novità” della nuova Twitter API che passa dalla versione 1.0 alla 1.1.

Vi rimando all’articolo per i dettagli, ma in buona sostanza Twitter sta cercando di fare in modo che “se voi fate qualcosa di interessante con Twitter, bhe ora dovete collaborare con noi…per continuare a farlo….”:

Continue reading “Twitter il gradasso”

MySQL Installing MySQL on Mac OS X

If you’re trying to use MySQL with phpMyAdmin, you’ve set up the phpMyAdmin’s config.inc.php, and you’re getting an error saying “Client does not support authentication protocol requested by server; consider upgrading MySQL client”, you need to set the password on the mysql command line using the OLD_PASSWORD(‘password’) routine.

For example:

tcsh: mysql

mysql> SET PASSWORD FOR root@localhost = OLD_PASSWORD(‘mypassword’);

via MySQL :: MySQL 5.0 Reference Manual :: 2.11 Installing MySQL on Mac OS X.

The destiny of MySQL?

Slashdot underlines there are too much forks of MySQL on the way.

After leaving MySQL, Michael “Monty” Widenius started its own code fork, backed up with a company.

The nerds think the destiny of MySQL is unclear, but it is still too early to get a clear vision.

After acquisition of Sun by Oracle, it is difficult to see a future for MySQL.
Oracle has already a “non-commercial” developer-based license of Oracle, and there will be little interest in maintaining a competitor. The two forks above was an early signs of “brains escape” from MySQL.

Anyway, we will go forward to see what will happen.