2011-01-06 36 views

Trả lời

5

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.

30

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 CSRFreplay. 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.

+1

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? –

+0

Tôi nghĩ rằng bộ lọc bị thiếu trên $ postedToken = filter_input (INPUT_POST, 'token'); – zeckdude

1

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).

+1

Ồ, 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

1

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.

0

Đây là câu trả lời commom nhất cho vấn đề của bạn

0

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.

Các vấn đề liên quan