2012-06-08 44 views
6

Tôi có một số mã bằng Python đặt giá trị char (80) trong một sqlite DB.Bảo vệ chống lại SQL injection trong python

Chuỗi được lấy trực tiếp từ người dùng thông qua trường nhập văn bản và được gửi trở lại máy chủ bằng phương thức POST trong cấu trúc JSON.

Ở phía máy chủ, tôi hiện đang chuyển chuỗi tới phương thức gọi hoạt động SQL UPDATE.

Nó hoạt động, nhưng tôi biết nó không an toàn chút nào.

Tôi hy vọng rằng phía máy khách không an toàn, vì vậy mọi bảo vệ sẽ được đặt ở phía máy chủ. Tôi có thể làm gì để bảo đảm hoạt động UPDATE một lần nữa SQL injection?

Một chức năng sẽ "trích dẫn" văn bản để không nhầm lẫn giữa trình phân tích cú pháp SQL là những gì tôi đang tìm kiếm. Tôi mong đợi chức năng như vậy tồn tại nhưng không thể tìm thấy nó.

Edit: Dưới đây là mã hiện tại của tôi thiết lập các char tên trường label:

def setLabel(self, userId, refId, label): 
    self._db.cursor().execute(""" 
     UPDATE items SET label = ? WHERE userId IS ? AND refId IS ?""", (label, userId, refId)) 
    self._db.commit() 
+0

Không hỗ trợ python truy vấn tham số? –

+0

@Jeremy. Có ... nhưng nó thực sự cho dù thư viện python cho bất kỳ cơ sở dữ liệu cụ thể hỗ trợ nó (mà tất cả họ AFAIK làm). – Gerrat

+0

Có. Vì vậy, xem xét câu hỏi của tôi như yêu cầu nó những gì tôi làm là đủ để đảm bảo bảo vệ chống lại tiêm sql. – chmike

Trả lời

7

Từ các tài liệu:

con.execute("insert into person(firstname) values (?)", ("Joe",)) 

này thoát "Joe", vì vậy những gì bạn muốn là

con.execute("insert into person(firstname) values (?)", (firstname_from_client,)) 
+0

Tôi đã cập nhật câu hỏi của mình bằng mã mà tôi hiện đang sử dụng. Tôi đã làm nó như bạn đề nghị. Nó có nghĩa là mã của tôi là an toàn chống lại SQL injection? – chmike

+0

Tôi quên rằng "thoát" có nghĩa là bảo vệ chống lại tiêm sql. Tôi đã cho bạn câu trả lời vì ví dụ. Cảm ơn bạn rất nhiều vì đã chia sẻ kiến ​​thức của bạn và giúp đỡ tôi. – chmike

0

noooo ... SỬ DỤNG BIND BIẾN! Đó là những gì họ đang có. Xem this

Tên khác cho kỹ thuật là parameterized sql (Tôi nghĩ rằng "biến liên kết" có thể là tên được sử dụng với Oracle cụ thể).

+0

Biến BIND là gì? Bất kỳ URL nào để đề xuất? Thêm câu trả lời. – chmike

+0

Chắc chắn ... RDBMS bạn đang sử dụng? – Gerrat

+0

Tôi đang sử dụng sqlite ngay bây giờ. Nó chưa phải là phiên bản sản xuất của ứng dụng web của tôi. – chmike

1

.execute() của DB-API hỗ trợ thay thế thông số sẽ đảm bảo thoát cho bạn, được đề cập ở gần đầu tài liệu; http://docs.python.org/library/sqlite3.html phía trên Không bao giờ thực hiện việc này - không an toàn.

+0

Cảm ơn bạn đã tham khảo. Tôi nhớ bây giờ đọc điều này một thời gian dài trước đây và áp dụng kể từ đó. Tôi không biết nó đang bảo vệ tôi chống lại SQL injection. Thật tuyệt. Tôi đã làm đúng cách. Xin lỗi vì không cho bạn câu trả lời. Martijn có ít điểm hơn bạn và anh ấy đưa ra một ví dụ có ích cho những người như tôi đang tìm kiếm câu trả lời cho câu hỏi này. – chmike

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