Sử dụng pysqlite Tôi đang thực hiện một quy trình để thực hiện điều gì đó với một số dữ liệu. Cùng một loại hoạt động được thực hiện trên các lĩnh vực tương tự trong nhiều bảng và cột, vì vậy tôi nghĩ tôi có thể parameterize câu lệnh SQL như hình dưới đây:pysqlite: Thay thế trình giữ chỗ cho tên cột hoặc bảng?
def foo():
column = 'c'
table = 't'
row = 1
# preferred approach, gives syntax error
c.execute('SELECT ? FROM ? WHERE id=?', (column, table, row))
# sanity check, works fine
c.execute('SELECT c FROM t WHERE id=?', (row))
# workaround, also works, but is this the right way?
c.execute('SELECT % FROM % WHERE id=?' % (column, table), row))
Các lỗi tôi nhận được không phải là rất hữu ích (sqlite3.OperationalError: near "?": syntax error
), nhưng tôi nhận được điểm: Pysqlite không đánh giá cao trình giữ chỗ được sử dụng theo cách này.
Có ai có thể chỉ ra những gì đang diễn ra ở đây cùng với cách thực hiện đúng cách trên?
Tính năng này có an toàn với SQL injection không? – berkelem
@berkelem: Dễ bị tiêm SQL. Thật không may, bởi vì các tên cột và bảng là unparametrizable, không có cách nào để tránh định dạng chuỗi. [Sử dụng danh sách trắng] (https://phpdelusions.net/sql_injection#whitelist) là phương pháp hay nhất ở đây. – unutbu