2012-03-13 187 views
5

我可以在pymssql中使用哪些佔位符。我從html查詢字符串中獲取我的值,以便它們都是字符串類型。這是安全的關於SQL注入?pymssql和佔位符

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

在這種情況下使用什麼機制來避免注射?

沒有在pymssql文檔的方式多...

也許有更好的Python模塊,我可以使用與SQL Server 2005

感謝接口,

Barry

+0

我錯過了括號,但是我不需要引用%s。 – Baz 2012-03-15 18:33:35

+0

啊是的,鏈接的問題中也沒有引號。應該更加關注。對不起,你不必要地打擾你了。 – 2012-03-15 18:37:25

+0

但是!如果運行SQL Profiler並查看傳遞給服務器的實際查詢,它可能會幫助您確定查詢是否安全。如果它看起來像'sp_executesql''你的查詢','@var definitions',arg values',那麼很可能你的方法是SQL注入安全的。 – 2012-03-15 18:42:50

回答

4

關於SQL注入,並不確切知道如何執行工作,我會說這是不安全的。

一些簡單的步驟來使其:

  1. 更改該查詢到一份聲明(或確保實施內部這樣做,但似乎並不像它)。

  2. 確保在查詢參數周圍使用'。

  3. 驗證您的參數的預期類型(如果請求參數應該是數字實際上是數字等)。

大多數......第一個是關鍵。使用預準備語句是防止SQL注入最重要也是最容易的一道防線。

一些ORM的照顧部分這些問題對你(注意充足的用字一些),但我會建議確保你知道這些問題,以及如何使用抽象像之前解決它們ORM。

遲早,您需要知道在這些節省時間的精彩層面下發生了什麼。

3

也許有更好的Python模塊,我可以使用與SQL Server 2005

好接口,我的建議是使用ORM SQLAlchemy的一樣來處理這一點。

>>> 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() 

您可以使用one(),如果你想,如果有一個以上的記錄,.first()如果你只想在第一個記錄或.all()如果你希望所有的記錄引發異常。

作爲一個好處,如果您稍後更改爲其他DBMS,則代碼將保持不變,除了連接URL。