2012-03-13 11 views
5

Quali segnaposti posso usare con palestreqq. Sto ottenendo i miei valori dalla stringa di query html in modo che siano tutti di tipo stringa. Questo è sicuro per quanto riguarda l'iniezione sql?palestre e segnaposto

query = dictify_querystring(Response.QueryString) 
employeedata = conn.execute_row("SELECT * FROM employees WHERE company_id=%s and name = %s", (query["id"], query["name"])) 

Quale meccanismo viene utilizzato in questo caso per evitare iniezioni?

Non c'è molto in termini di documentazione per pymssql ...

Forse v'è una migliore modulo python ho potuto utilizzare per interfacciarsi con SQL Server 2005.

Grazie,

Barry

+0

Mi mancava la parentesi, ma non ho bisogno di virgolette intorno a% s. – Baz

+0

Ah sì, non c'erano citazioni nella domanda collegata. Dovrebbe avere pagato più attenzione. Scusa per esserti infastidito inutilmente. –

+0

Ma!Potrebbe aiutarti a scoprire se la tua query è sicura se hai eseguito SQL Profiler e hai dato un'occhiata alla query effettiva passata al server. Se assomiglia a 'sp_executesql 'la tua query', '@var definizioni', arg values', allora molto probabilmente il tuo metodo è sicuro per SQL-injection. –

risposta

4

Riguardo all'iniezione SQL, e non sapendo esattamente come funziona l'implementazione, direi che non è sicuro.

alcuni semplici passaggi per lo rendono così:

  1. cambiamento che query in una dichiarazione preparata (o assicurarsi che l'applicazione fa internamente in modo, ma non sembra come esso).

  2. Assicurarsi di utilizzare "attorno agli argomenti della query.

  3. Convalidare il tipo previsto degli argomenti (se i parametri di richiesta che dovrebbero essere numerici sono effettivamente numerici, ecc.).

Per lo più ... il numero uno è la chiave. L'utilizzo di istruzioni preparate è la linea di difesa più importante e probabilmente più semplice contro l'iniezione SQL.

prendersi cura Alcuni di ORM di alcuni di questi problemi per voi (nota l'ampio uso della parola qualche), ma vorrei consigliare fare in modo di sapere questi problemi e come lavorare intorno a loro prima di utilizzare un'astrazione come un ORM.

Prima o poi, è necessario sapere cosa sta succedendo in quei meravigliosi livelli di risparmio di tempo.

3

Forse c'è una migliore modulo python ho potuto utilizzare per interfacciarsi con SQL Server 2005.

Bene, il mio consiglio sta usando un ORM come SQLAlchemy a gestire questo.

>>> from sqlalchemy.ext.sqlsoup import SqlSoup 
>>> db = SqlSoup('mssql:///DATABASE?PWD=yourpassword&UID=some_user&dsn=your_dsn') 
>>> employeedata = db.employees.filter(db.employees.company_id==query["id"])\ 
           .filter(db.employees.name==query["name"]).one() 

È possibile utilizzare one() se si vuole sollevare un'eccezione se non v'è più di un record, .first() se si desidera solo il primo record o .all() se si desidera che tutti i record.

Come vantaggio collaterale, se successivamente si passa ad altri DBMS, il codice rimarrà lo stesso ad eccezione dell'URL di connessione.