Bạn không thể đảm bảo rằng dữ liệu đến từ một hình thức . Yêu cầu POST chỉ là yêu cầu POST, nó có thể được tạo theo bất kỳ cách nào. Biểu mẫu HTML chỉ là một những cách rất thân thiện với người dùng. Máy chủ của bạn cần xác thực xem liệu dữ liệu nhận được qua yêu cầu POST có hợp lệ hay không và có nên hành động hay không.
Có nói rằng, có những thứ có thể giúp bạn hạn chế và xác thực dữ liệu đang được gửi. Trước hết, yêu cầu người dùng phải đăng nhập bằng cookie (phiên). Điều đó giúp loại bỏ các yêu cầu ngẫu nhiên của người dùng ẩn danh. Thứ hai, bạn có thể nhúng mã thông báo dưới dạng trường ẩn vào biểu mẫu mà bạn cũng lưu vào phiên của người dùng. Yêu cầu POST cần chứa mã thông báo đó để hợp lệ. Mã thông báo chỉ đơn giản là một chuỗi giả ngẫu nhiên.
Bạn có thể cải thiện điều này bằng cách chuẩn bị băm của các trường biểu mẫu mà bạn mong đợi người dùng gửi. Nếu giá trị biểu mẫu phải là chỉ đọc, bạn có thể đưa giá trị vào giá trị băm. Ví dụ.:
$rand = md5(mt_rand());
$hash = sha1('lastname:firstname:email:' . $rand);
$_SESSION['rand'] = $rand;
$_SESSION['hash'] = $hash;
// on form submit:
$keys = array_keys($_POST);
$checkHash = sha1(join(':', $keys) . ':' . $_SESSION['rand']);
if ($checkHash != $_SESSION['hash']) {
die('Form submission failed token validation');
}
Đó chỉ là một ví dụ nhanh, có thể bạn sẽ muốn sắp xếp các phím theo thứ tự abc để đảm bảo bạn sẽ nhận được cùng bảng băm vv Nó minh chứng cho khái niệm của người sử dụng cần phải có một thẻ duy nhất cho mỗi yêu cầu mặc dù ngăn cản ủ với các biểu mẫu và gửi nhiều hoặc ít dữ liệu hơn mong muốn.
Điều này vẫn không có nghĩa là người dùng thực sự đã sử dụng biểu mẫu của bạn để gửi dữ liệu.
Cảm ơn vì điều này tôi đã không nghĩ về những tác động khác của hành động này có thể có. Mặc dù tôi nghĩ rằng những vấn đề này có thể được ngăn chặn bằng cách sử dụng một cái gì đó như thế này 'if (! Isset ($ _ SESSION ['hash'])) {create hash} else {use existing hash}'. –