2012-03-13 48 views
5

Tôi có thể sử dụng phần giữ chỗ nào với pymssql. Tôi nhận được các giá trị của tôi từ chuỗi truy vấn html để chúng là tất cả các chuỗi kiểu. Đây có phải là an toàn đối với tiêm sql?pymssql và giữ chỗ

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

Cơ chế nào đang được sử dụng trong trường hợp này để tránh tiêm?

Không có nhiều trong cách tài liệu cho pymssql ...

Có thể có một mô-đun python tốt hơn tôi có thể sử dụng để giao tiếp với SQL Server 2005.

Cảm ơn,

Barry

+0

Tôi đã thiếu các dấu ngoặc đơn, nhưng tôi không cần báo giá khoảng% s. – Baz

+0

À vâng, cũng không có trích dẫn nào trong câu hỏi được liên kết. Nên chú ý hơn. Xin lỗi vì đã làm phiền bạn không cần thiết. –

+0

Nhưng!Nó có thể giúp bạn trong việc tìm hiểu xem truy vấn của bạn có an toàn không nếu bạn chạy SQL Profiler và xem xét truy vấn thực tế được chuyển đến máy chủ. Nếu có vẻ như 'sp_executesql 'truy vấn của bạn', 'định nghĩa @var', giá trị arg', thì rất có thể phương pháp của bạn là SQL injection an toàn. –

Trả lời

4

Về việc tiêm SQL và không biết chính xác cách triển khai đó hoạt động như thế nào, tôi sẽ nói điều đó không an toàn.

Một số bước đơn giản để làm cho nó như vậy:

  1. Change rằng truy vấn vào một tuyên bố chuẩn bị (hoặc đảm bảo việc thực hiện trong nội bộ như vậy, nhưng dường như không giống như nó).

  2. Đảm bảo bạn sử dụng 'xung quanh đối số truy vấn của mình.

  3. Xác thực loại đối số dự kiến ​​(nếu tham số yêu cầu phải là số thực sự là số, v.v ...).

Chủ yếu ... số một là khóa. Sử dụng các câu lệnh chuẩn bị là dòng phòng thủ quan trọng nhất và có lẽ là cách dễ nhất để chống lại việc tiêm SQL.

Một số ORM quan tâm đến một số vấn đề này cho bạn (chú ý việc sử dụng rộng rãi từ một số), nhưng tôi khuyên bạn nên biết những vấn đề này và cách xử lý chúng trước khi sử dụng ORM.

Sớm hay muộn, bạn cần biết những gì đang xảy ra dưới những lớp tiết kiệm thời gian tuyệt vời đó.

3

Có thể có một mô-đun python tốt hơn tôi có thể sử dụng để giao tiếp với SQL Server 2005.

Vâng, lời khuyên của tôi đang sử dụng một ORM như SQLAlchemy để xử lý này.

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

Bạn có thể sử dụng one() nếu bạn muốn nâng cao một ngoại lệ nếu có nhiều hơn một hồ sơ, .first() nếu bạn muốn chỉ là kỷ lục đầu tiên hoặc .all() nếu bạn muốn tất cả hồ sơ.

Là một lợi ích phụ, nếu sau này bạn chuyển sang DBMS khác, mã sẽ vẫn giữ nguyên trừ URL kết nối.

Các vấn đề liên quan