2011-01-13 26 views
5

Tôi đang theo gương hướng dẫn nàyTại sao dụ zend này ngừng hoạt động khi tôi thêm một hash mẫu

mã dự án: http://akrabat.com/wp-content/uploads/zf-tutorial-layoutform.zip

hướng dẫn: http://akrabat.com/zend-framework/a-form-in-your-layout/

Mã dự án chạy như mong đợi, cho đến khi tôi thêm phần tử băm vào biểu mẫu. Tất cả những gì tôi làm là thêm mã này vào biểu mẫu dưới ứng dụng/biểu mẫu/Đăng ký.php

$hash = new Zend_Form_Element_Hash('hash'); 
$hash->setSalt('mysalt'); 
$this->addElement($hash); 

Mã bit bổ sung này ném mọi thứ. Khi tôi gửi biểu mẫu ngay bây giờ, nó cho tôi lỗi mà 2 mã thông báo không khớp.

Một số xử lý sự cố:

  • Vấn đề không phải là băm bản thân bởi vì nó hoạt động tốt trong các ví dụ khác của tôi.
  • Tôi nghĩ rằng phải làm thế nào với yêu cầu đang được xử lý trong ví dụ này, nhưng không chắc chắn vấn đề là chính xác. Tôi nghĩ rằng nó đã làm với số hop, nhưng khi tôi chỉnh sửa Zend_Form_Element_Hash và thay đổi số hop từ 1 đến 100, tôi vẫn có lỗi tương tự.

Đó là mức độ khắc phục sự cố mà tôi có thể nghĩ đến ở cấp chuyên môn của tôi với Zend. Vì vậy, nghĩ rằng đó là thời gian để yêu cầu bộ não lớn. Tôi hy vọng một người nào đó có thể tìm ra.

+0

Khi phần tử băm sử dụng zend_session có thể là một vấn đề. một điều khác để kiểm tra có thể là các bước nhảy cho đến khi xác thực khi băm hết hạn sau một hop (hoặc sau một thời gian chờ). – Fge

+0

Không có mã nào được mã hóa. Nhưng bạn có thể muốn so sánh nội dung phiên và dữ liệu biểu mẫu được gửi. ($ _SESSION so với $ _POST) và xóa mọi chuyển hướng để gỡ lỗi. – Fge

+0

Không trực tiếp. Nhưng đó là nhiều hơn sau đó một nếu trình duyệt của bạn cho thấy bất cứ điều gì khác sau đó các hình thức mục tiêu. Nhưng nếu bạn không chuyển hướng bạn thực sự nên kiểm tra $ _SESSION/$ _ POST. – Fge

Trả lời

2

Nó hoạt động cho bạn ngay cả sau khi bạn đã thêm phần tử băm vào biểu mẫu? Nếu vậy, bạn có thể vui lòng tải lên dự án của bạn và đăng bài dưới dạng câu trả lời riêng biệt không.

Tất cả những gì tôi đã làm là thêm mã bạn đã đăng và nó hoạt động tốt. Bạn đang sử dụng mã này ở đâu? Nghe có vẻ giống như một cái gì đó để làm với môi trường của bạn?

0

Từ: Zend_Form_Element_Hash

yếu tố này cung cấp bảo vệ khỏi các cuộc tấn công CSRF vào hình thức, đảm bảo dữ liệu được gửi bởi các phiên người dùng đã tạo ra hình thức và không phải bởi một kịch bản giả mạo. Việc bảo vệ được thực hiện bằng cách thêm phần tử băm vào biểu mẫu và xác minh nó khi biểu mẫu được gửi.

Tên của phần tử băm phải là duy nhất. Chúng tôi khuyên bạn nên sử dụng tùy chọn muối cho hai băm phần- với cùng một tên và muối khác nhau sẽ không va chạm:

$form->addElement('hash', 'no_csrf_foo', array('salt' => 'unique'));

Bạn có thể thiết lập các muối sau đó sử dụng setSalt ($ muối) phương pháp.

Nội bộ, phần tử lưu trữ số nhận dạng duy nhất sử dụng Zend_Session_Namespace và kiểm tra mã nhận dạng đó khi gửi (kiểm tra xem TTL chưa hết hạn). Trình xác thực 'Identical' sau đó được sử dụng để đảm bảo băm được gửi phù hợp với băm được lưu trữ.

Trình trợ giúp chế độ xem 'formHidden' được sử dụng để hiển thị phần tử trong biểu mẫu.

Tôi sẽ cố gắng:

$form->addElement('hash', 'unique_form_name', array('salt' => 'unique_salt'));

Tôi không thấy độc đáo mẫu name/băm trong mã của bạn và đây là lý do tại sao thẻ không mach.

+0

Không phải là chuỗi 'hash' đang được sử dụng để tạo thành phần tử tên duy nhất của nó? –

+0

Tên không phải là vấn đề. Nó hoạt động tốt với tên "băm". – user570783

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