AsIs
là không an toàn, trừ khi bạn thực sự biết mình đang làm gì. Bạn có thể sử dụng nó để kiểm tra đơn vị chẳng hạn.
Truyền tham số không phải là không an toàn, miễn là bạn không định dạng trước truy vấn sql của mình. Không bao giờ làm:
sql_query = 'SELECT * FROM {}'.format(user_input)
cur.execute(sql_query)
Kể từ khi user_input
có thể là ';DROP DATABASE;'
chẳng hạn.
Thay vào đó, hãy làm:
sql_query = 'SELECT * FROM %s'
cur.execute(sql_query, (user_input,))
pyscopg2
sẽ làm sạch truy vấn của bạn. Ngoài ra, bạn có thể làm sạch trước các thông số trong mã của mình bằng logic của riêng bạn, nếu bạn thực sự không tin tưởng đầu vào của người dùng.
Per psycopg2
tài liệu của
:
Ngoài ra, tôi sẽ không bao giờ để người dùng cho tôi biết tôi nên truy vấn bảng nào. Logic (hoặc các tuyến) của ứng dụng sẽ cho bạn biết điều đó.
Về AsIs()
, per psycopg2
tài liệu của
:
Vì vậy, không sử dụng nó với đầu vào của người dùng.