Vệ sinh dữ liệu: Thực tiễn tốt nhất với các ví dụ mã


15

Tôi đang cố gắng hiểu vệ sinh dữ liệu (không phải xác thực dữ liệu) để giúp tôi viết các chủ đề an toàn cho WordPress. Tôi đã tìm kiếm trên Internet cố gắng tìm một hướng dẫn toàn diện cho các nhà phát triển chủ đề chi tiết các thực tiễn tốt nhất. Có một số tài nguyên tôi đã tìm thấy bao gồm trang codex có tiêu đề Xác thực dữ liệu, mặc dù không có tài nguyên nào hữu ích cho tôi. Trang codex liệt kê các chức năng khử trùng có sẵn, cách sử dụng và những gì họ làm, nhưng không giải thích được tại sao bạn lại sử dụng cái này hay cái khác trong trường hợp nào bạn sẽ sử dụng chức năng khử trùng cụ thể. Mục đích của bài đăng này là yêu cầu tất cả mọi người đóng góp các ví dụ về mã xấu / không được mã hóa và cách viết lại để vệ sinh đúng cách. Đây có thể là mã chung để vệ sinh tiêu đề bài đăng hoặc bài đăng srcails hoặc các mã phức tạp hơn để xử lý vệ sinh$_POST dữ liệu cho các yêu cầu Ajax.

Ngoài ra, tôi muốn biết liệu các chức năng WordPress để thêm / cập nhật cơ sở dữ liệu (ví dụ: các chức năng được đề cập trong khối mã bên dưới) có tự động đảm nhiệm công việc vệ sinh cho bạn không? Nếu có, thì có bất kỳ trường hợp ngoại lệ nào khi bạn thực hiện các biện pháp bổ sung để vệ sinh dữ liệu được gửi đến các chức năng WordPress này không?

add_user_meta
update_user_meta
add_post_meta
update_post_meta
//just to name a few

Ngoài ra, việc khử trùng có cần phải được thực hiện khác đi khi lặp lại HTML trong PHP so với PHP nội tuyến của HTML không? Để rõ hơn về những gì tôi đang hỏi, đây là đoạn mã:

<?php echo '<div class="some-div ' . $another_class . '" data-id="' . $id . '" >' . $text . '</div>'; ?>

<div class="some-div <?php echo $another_class; ?>" data-id="<?php echo $id; ?>"><?php echo $text; ?></div>

Cả hai tuyên bố trên đều đạt được điều tương tự. Nhưng họ có cần phải được phân loại khác nhau không?


1
Nó có thể hữu ích nếu chúng tôi biết những gì bạn đang cố gắng vệ sinh. Chủ đề là để trình bày dữ liệu ... bạn chỉ cần vệ sinh dữ liệu mà người dùng đang gửi cho bạn và việc gửi thường được xử lý bởi các plugin.
EAMann

@EAMann Chức năng thoát như esc_attr, esc_html, v.v ... được xây dựng để thoát đầu ra. Đúng nếu tôi đã sai lầm. Trình bày dữ liệu có nghĩa là bạn đang xuất dữ liệu, do đó, việc thoát cũng được yêu cầu trong các chủ đề. Nếu không, sẽ không có nhu cầu cho các chức năng esc. Tôi muốn hiểu toàn bộ về vệ sinh trong các chủ đề WordPress và không giới hạn trong việc vệ sinh một hoặc hai đoạn mã.
Giăng

"Trình bày dữ liệu có nghĩa là bạn đang xuất dữ liệu, do đó, việc thoát cũng được yêu cầu trong các chủ đề" - không. Một lần nữa, bạn chỉ phải thoát dữ liệu mà bạn không tin tưởng
onetrickpony

@OneTrickPony Nó trở nên rõ ràng hơn đối với tôi. Chỉ cần chắc chắn rằng tôi hiểu điều này - tôi sẽ thoát nội dung bình luận nhưng sẽ không thoát khỏi ID bình luận hoặc ID bài đăng, nếu tôi xuất ra những nội dung này bằng HTML. Xin lỗi, để thực sự lỗi bạn với câu hỏi lần lượt.
John

2
"Bạn chỉ phải thoát dữ liệu mà bạn không tin tưởng" - Tôi hoàn toàn đồng ý. Điều duy nhất tôi muốn thêm là bạn không bao giờ nên tin vào dữ liệu;)
Ian Dunn

Câu trả lời:


12

Đây trang codex giải thích nó khá tốt tôi nghĩ.

Các chức năng quan trọng nhất và thường được sử dụng có lẽ là esc_attr. Lấy ví dụ này:

<a href="<?php print $author_url; ?>" title="<?php print $author_name; ?>"> 
  <?php print $author_name; ?>
</a>

Nếu $author_namechứa một "ký tự bạn sẽ đóng thuộc tính của mình và nếu ký tự đó được theo sau bởi onclick="do_something();"nó có thể trở nên tồi tệ hơn :)

Làm print esc_attr($author_name)đảm bảo rằng các ký tự như vậy được mã hóa và trình duyệt không làm những việc mà nó không phải làm.

Có một trường hợp bạn không cần đến nó: khi bạn đang mong đợi một số, trong trường hợp đó bạn chỉ có thể truyền dữ liệu đầu vào thành số nguyên, ví dụ:

print (int)$_POST['some_number'];


Các hàm meta * mà bạn đã liệt kê ở đó đã quan tâm đến việc vệ sinh đầu vào để lưu trữ cơ sở dữ liệu, vì vậy bạn không cần phải lo lắng về điều đó.

Các wpdb->prepare()phương pháp cần phải được sử dụng khi bạn làm DB truy vấn chính mình. Đây là một ví dụ:

$sql = $wpdb->prepare('
    UPDATE wp_posts SET post_title = %s WHERE ID = %d', 
      $_POST['title'], $_POST['id']);

$wpdb->query($sql);

Các từ khóa %s%dsẽ được thay thế bằng các giá trị $ _POST được khử trùng của bạn.

Một lỗi rất phổ biến tôi thấy trong nhiều plugin trong kho lưu trữ WP.org là chuyển một truy vấn đã được chuẩn bị sẵn cho nó (và được chuẩn bị rất tệ), như:

$wpdb->prepare('UPDATE wp_posts SET post_title = \''.$_POST['title'].' WHERE ...

Đừng làm điều này :)

Ngoài ra, việc khử trùng có cần phải được thực hiện khác đi khi lặp lại HTML trong PHP so với PHP nội tuyến của HTML không?

Cả hai tuyên bố trên đều đạt được điều tương tự. Nhưng họ có cần phải được phân loại khác nhau không?

Không.


Thx cho đầu vào của bạn. Giải thích của bạn không làm cho mọi thứ rõ ràng hơn cho tôi.
John

Một sự làm rõ nhỏ là cần thiết hơn nữa. Nếu tôi chuyển một chuỗi vào một var (ví dụ $ var = 'string';) trong PHP và lặp lại nó như một thuộc tính HTML, tôi có vệ sinh $ var khi lặp lại không. Hoặc chỉ cần vệ sinh nếu tôi đã lấy giá trị $ var từ cơ sở dữ liệu.
Giăng

Khi lặp lại nó trên màn hình, bằng cách này hay cách khác
onetrickpony

Vì vậy, nếu tôi hiểu bạn một cách chính xác, cho dù tôi đã chuyển chuỗi thành $ var trong mã PHP hay lấy dữ liệu từ cơ sở dữ liệu và chuyển vào $ var, cả hai đều yêu cầu tôi thoát đầu ra. Chính xác?
John

Có, nếu dữ liệu đó đến đầu vào của người dùng, ví dụ như tên của tác giả của một bình luận. Nếu bằng cách "chuyển chuỗi thành $ var trong mã PHP", bạn có nghĩa là bạn đã gán một giá trị mà bạn biết cho một biến, thì rõ ràng - không, bạn không phải vệ sinh biến đó
onetrickpony

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.