wpdb-> insert: tôi có cần chuẩn bị chống lại SQL SQL không?


14

Tôi có cần sử dụng chuẩn bị wpdb trước khi wpdb-> insert không?

Nếu tôi đang chèn các giá trị vào bảng wordpress bằng wpdb-> insert, tôi có cần "dọn dẹp" dữ liệu của mình trước khi chèn nó hay phương thức này (wpdb-> insert) làm điều đó cho tôi không?

Câu trả lời:


21

Không, bạn không nên chuẩn bị hoặc thoát dữ liệu, lớp này được thực hiện cho bạn wpdb.

Từ tham chiếu lớp wpdb :

dữ liệu :

(mảng) Dữ liệu cần chèn (trong cột => cặp giá trị). Cả cột dữ liệu $ và giá trị dữ liệu $ phải là "thô" (không nên thoát SQL).

Tuy nhiên, nếu bạn đang viết SQL của riêng bạn thay vì sử dụng insertphương thức, thì có, bạn nên thoát bằng cách sử dụng prepare.


8
Để thêm một ghi chú: Cả insert& updatekhông cần điều đó. Nhưng nó nên được sử dụng với query.
kaiser

1

Sau đây là một cảnh báo cho lớp wpdb.

https://codex.wordpress.org/Class_Reference/wpdb

Một lời cảnh báo

Một số hàm trong lớp này lấy câu lệnh SQL làm đầu vào. Bạn phải SQL thoát tất cả các giá trị không đáng tin cậy mà bạn kết hợp vào truy vấn SQL để ngăn chặn các cuộc tấn công tiêm nhiễm SQL. Kiểm tra tài liệu để xem liệu chức năng bạn dự định sử dụng thoát SQL cho bạn hay dự kiến ​​nó sẽ được thoát trước.

Vì vậy, tôi đọc nó như là - lớp wpdb không tự động chuẩn bị hoặc thoát dữ liệu cho bạn.

Tôi khá chắc chắn rằng nếu bạn không thể tin tưởng 100% nguồn dữ liệu trong mã của mình, thì tôi khuyên bạn nên sử dụng lớp chuẩn bị (?).

Đừng nghĩ rằng sử dụng lớp chuẩn bị sẽ sửa nó mà không sử dụng lớp chuẩn bị đúng cách. Tôi khá mới với điều này vì vậy xin vui lòng gửi bất kỳ sửa chữa như là một trả lời nếu tôi không đúng.

$ wpdb-> chuẩn bị ("CHỌN * TỪ bảng WHERE ID =% d AND name =% s", $ id, $ name);

Trong tuyên bố trên, có 2 thuộc tính bổ sung. Một cho ID và một cho tên. Theo như tôi đọc, mỗi mục tương ứng với số lượng mục trong truy vấn của bạn. Ngoài ra% s = chuỗi,% d = số nguyên và% f = float.

Ngoài ra, từ cách đọc của tôi, nếu bạn không đặt các thuộc tính bổ sung vào, thì việc chuẩn bị sẽ thực sự không làm gì cả. Sẽ có một cảnh báo, nhưng nếu bạn tắt nó đi, có lẽ bạn sẽ không biết.

Dưới đây là một ví dụ từ chính tham chiếu lớp nơi họ thêm một lớp chuẩn bị vào một INSERT bên dưới.

https://codex.wordpress.org/Class_Reference/wpdb#Protect_Queries_Against_Query_Injection_Attacks

$ wpdb-> truy vấn ($ wpdb-> chuẩn bị ("INSERT INTO $ wpdb-> postmeta (post_id, meta_key, meta_value) VALUES (% d,% s,% s)", mảng (10, $ metakey, $ metavalue) ));

Mối quan tâm của tôi là câu trả lời nâng cao là không chính xác theo cùng một trang mà 'không ai' tham khảo. Tôi giả sử rằng bạn sử dụng chuẩn bị () chứ không phải các phương thức thoát php tiêu chuẩn khác vì tôi cũng đã trả lời đúng như vậy ... cho đến khi tôi đào sâu hơn.

Dù sao ... có lẽ mọi thứ đã thay đổi kể từ câu trả lời ban đầu.


hmmm, điều này nghe giống như một câu hỏi hơn là một câu trả lời
Mark Kaplun

Câu trả lời được chấp nhận là chính xác. Khi bạn sử dụng các hàm như $wpdb->insert(), $ wpdb-> update () `hoặc $wpdb->delete()dữ liệu phải là RAW. Trong tình huống bạn sử dụng ví dụ $wpdb->query()và chuyển câu lệnh SQL làm đầu vào, bạn nên thoát dữ liệu không đáng tin cậy.
nmr

nmr, tôi nghĩ bây giờ tôi đã hiểu Vì vậy, để làm rõ ... cho sự tỉnh táo của tôi ... những gì bạn đã sử dụng làm ví dụ là 'phương thức chèn và' phương thức xóa 'trái ngược với các ví dụ mà tôi đã sử dụng bằng' phương thức truy vấn '... (% wpdb -> truy vấn). Tôi có xóa câu trả lời của mình không? Hay bỏ nó?
Felixius

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.