Cách ngăn nhiều lần gửi biểu mẫu trên nhiều lần nhấp chuột trong PHPCách ngăn nhiều lần gửi biểu mẫu trên nhiều lần nhấp trong PHP
Trả lời
Bạn có thể vô hiệu hóa nút sau lần nhấp đầu tiên (sử dụng JavaScript) và cũng có kiểm tra ở mặt sau -end (chỉ trong trường hợp họ vô hiệu hóa JavaScript của họ) mà kiểm tra xem họ vừa mới gửi.
Có một số cách khác nhau để thực hiện việc kiểm tra ở mặt sau. Một cách sẽ là đặt biến phiên khi họ nhấp vào lần đầu tiên, điều này có thể cho phép hệ thống biết rằng nó đang xử lý. Nếu họ nhấp vào một thời gian thứ hai, thứ ba hoặc thứ tư, sau đó nó chỉ có thể kiểm tra biến phiên, và nếu điều đó chỉ ra rằng nó đã được nhấp, nó sẽ không xử lý.
Đó chỉ là một ví dụ - bạn có thể sử dụng đó làm khởi đầu.
Sử dụng mã thông báo duy nhất được tạo mỗi khi bạn hiển thị biểu mẫu và chỉ có thể sử dụng một lần; nó cũng hữu ích để ngăn chặn các cuộc tấn công CSRF và replay. Một ví dụ nhỏ:
<?php
session_start();
/**
* Creates a token usable in a form
* @return string
*/
function getToken(){
$token = sha1(mt_rand());
if(!isset($_SESSION['tokens'])){
$_SESSION['tokens'] = array($token => 1);
}
else{
$_SESSION['tokens'][$token] = 1;
}
return $token;
}
/**
* Check if a token is valid. Removes it from the valid tokens list
* @param string $token The token
* @return bool
*/
function isTokenValid($token){
if(!empty($_SESSION['tokens'][$token])){
unset($_SESSION['tokens'][$token]);
return true;
}
return false;
}
// Check if a form has been sent
$postedToken = filter_input(INPUT_POST, 'token');
if(!empty($postedToken)){
if(isTokenValid($postedToken)){
// Process form
}
else{
// Do something about the error
}
}
// Get a token for the form we're displaying
$token = getToken();
?>
<form method="post">
<fieldset>
<input type="hidden" name="token" value="<?php echo $token;?>"/>
<!-- Add form content -->
</fieldset>
</form>
Kết hợp với chuyển hướng để bạn duy trì hành vi lạc hậu và chuyển tiếp hoàn hảo. Xem mẫu POST/redirect/GET để biết thêm thông tin về chuyển hướng.
Có ai biết về bất kỳ vấn đề nào, chẳng hạn như vấn đề bảo mật, với mã này không? –
Tôi nghĩ rằng bộ lọc bị thiếu trên $ postedToken = filter_input (INPUT_POST, 'token'); – zeckdude
Bạn có thể thêm một cái gì đó như thế này
<input type="hidden" name="form-token" value="someRandomNumber">
Sau đó trên back-end, bạn có một cách tiết kiệm của việc xác định nhiều hình thức đệ trình. Tất nhiên, giải pháp này có một số hành lý vì bạn phải xóa biểu mẫu mà bạn biết đã xử lý xong, v.v.
Trong hầu hết các trường hợp, biểu mẫu bị vô hiệu hóa, chẳng hạn như tắt nút hoặc bằng cách thêm return false
vào sự kiện gửi biểu mẫu (không chắc chắn nếu điều này hoạt động mà không có jQuery).
Ồ, có vẻ như tôi hơi muộn với câu trả lời của tôi ... * upvoting câu trả lời khác * – Mike
Tôi khuyên bạn không nên tắt nút gửi, vì trong trường hợp xảy ra sự cố mạng tạm thời (nghĩa là yêu cầu không hoàn toàn), nếu người dùng chọn hủy đăng ký (phím Esc/nút Dừng), anh ấy không thể gửi lại khi dịch vụ mạng đã được khôi phục và thay vào đó sẽ phải tải lại trang và điền lại tất cả mục nhập biểu mẫu.
Đây là câu trả lời commom nhất cho vấn đề của bạn
có thể bạn chỉ giấu nút trên nhấp chuột? Nó sẽ không ảnh hưởng đến xử lý hình thức (như tôi biết vấn đề là ngay lập tức vô hiệu hóa nút) nhưng về cơ bản nó sẽ làm điều tương tự. Nếu bạn thực sự lo lắng về nó, bạn thậm chí có thể chỉ hiển thị một nút khác mà không thực sự làm bất cứ điều gì. Có thể là một công việc độc đáo xung quanh, nhưng dù sao cũng là một công việc.
- 1. Gửi biểu mẫu jQuery, ngăn không cho gửi nhiều lần sau lần gửi đầu tiên
- 2. Nhiều biểu mẫu hoặc nhiều lần gửi trong một trang?
- 3. Làm cách nào để ngăn chặn nhiều lần chèn khi gửi biểu mẫu bằng PHP?
- 4. Làm cách nào để gửi biểu mẫu chỉ một lần sau khi nhấp vào nhiều lần gửi?
- 5. Ngăn chặn mở Hoạt động nhiều lần
- 6. Ngăn chặn nhiều mẫu biểu mẫu
- 7. Tránh gửi biểu mẫu trùng lặp trong Asp.net MVC bằng cách nhấp vào gửi hai lần
- 8. Tránh gửi nhiều biểu mẫu
- 9. Mẫu ASP.NET MVC được tải qua ajax gửi nhiều lần
- 10. Ngăn chặn cùng một cửa sổ con nhiều lần trong biểu mẫu MDI
- 11. Chrome gửi yêu cầu nhiều lần
- 12. Làm cách nào để ngăn người dùng đăng dữ liệu nhiều lần trên trang web
- 13. jquery: gửi biểu mẫu hai lần
- 14. jQuery Nhiều Biểu mẫu Gửi
- 15. Phương pháp tốt để ngăn người dùng gửi biểu mẫu hai lần là gì?
- 16. Nhiều nút/biểu mẫu gửi trong Rails
- 17. Tệp phục vụ Apache/PHP nhiều lần
- 18. Biểu đồ lặp lại nhiều lần
- 19. Cách ngăn sự kiện bị ràng buộc nhiều lần
- 20. HttpWebRequest getRequestStream treo trên nhiều lần chạy
- 21. PostAuthenticateRequest cháy nhiều lần
- 22. Biểu mẫu PHP gửi email tới nhiều người nhận
- 23. IE10 - Phải nhấp 2 lần để gửi biểu mẫu sau khi chọn tệp để tải lên
- 24. Nhiều biểu mẫu HTML trên một trang
- 25. jQuery: Nhấp một lần vào nút, nhấp vào sự kiện kích hoạt hai lần trở lên
- 26. Gọi setContentView() nhiều lần
- 27. Sử dụng jquery để ngăn gửi lại biểu mẫu
- 28. Nhiều lần lặp
- 29. gửi nhiều biểu mẫu với AJAX
- 30. MVC asp.net: Gửi nhiều biểu mẫu
vô hiệu hóa nút gửi! –
Vì câu hỏi là về hành vi phía máy chủ (PHP), tôi khuyên bạn nên xem xét câu hỏi sau: http://stackoverflow.com/questions/218907/how-to-handle-multiple-submissions-server-side – Kel
'' – karim79