Bạn có thể chỉ array_map
strip_tags
-$_POST
, nhưng nó là đẹp hơn nhiều để viết một chức năng tùy chỉnh cho việc thu thập dữ liệu từ nó:
function post_data($name) {
global $post_cache;
if (in_array($name, $post_cache)) {
return $post_cache[$name];
}
$val = $_POST[$name];
if (is_string($val)) {
$val = strip_tags($val);
} else if (is_array($val)) {
$val = array_map('strip_tags', $val);
}
$post_cache[$name] = $val;
return $val;
}
Điều này sẽ làm cho mã của bạn dễ đọc hơn (những người khác nhìn vào nó thường sẽ giả rằng $_POST['foo']
là dữ liệu trong trường biểu mẫu foo
, không phải đôi khi bạn đã xử lý trước), sẽ không gây ra sự cố với plugin hoặc thư viện để truy cập trực tiếp $ _POST, giúp dễ dàng thêm logic vào $_POST
tiền xử lý (unescape khi magic quotes được kích hoạt là một trong những phổ biến) mà không cần săn lùng tất cả các nơi s trong mã của bạn, nơi bạn đã sử dụng dữ liệu POST, và giúp bạn tiết kiệm từ nhức đầu rất lớn khi bạn nhận ra có một vài lĩnh vực POST, nơi bạn cần thẻ HTML. Nói chung, đó là một ý tưởng thực sự tồi tệ để trực tiếp thay đổi bất kỳ siêu dữ liệu nào.
Ngoài ra, tốt hơn là vệ sinh dữ liệu trên đầu ra chứ không phải trên đầu vào. sử dụng khác nhau sẽ đòi hỏi các phương pháp khác nhau, ví dụ, nếu bạn sử dụng
<div class="user_photo">
<img src="<?php echo photo_path($user_id) ?>" alt="<?php echo $user_name ?>" />
</div>
sau đó $user_name
là một vector tấn công XSS và strip_tags
không giúp chống lại nó ở tất cả; bạn sẽ cần htmlspecialchars. Nếu dữ liệu người dùng được sử dụng làm URL, bạn sẽ cần một phương pháp khác để bảo vệ chống lại các URL javascript:
v.v.
Tuyệt vời.Điều này thật đúng với gì mà tôi đã tìm kiếm. –
Điều này sẽ không bảo vệ khỏi XSS khi có các trường biểu mẫu có các tên như 'foo [bar]' hoặc 'foo []' mà PHP tự động chuyển thành mảng. – Tgr
@Tgr: vâng, điều này sẽ hoàn toàn thất bại như bạn đã nói, nhưng tôi nghĩ anh ta có ý tưởng tùy chỉnh theo những gì anh ta cần – w00d