PDA

View Full Version : [help] re submit khi bấm nút back!



hocvui.net
24-07-2010, 17:44
Em đang làm một cái guestbook, cái mà lúc ngùo7i ta điền vào vá nhấn submit hay reload thì có cái thông báo nói là phải gửi ại hết mấy thông tin............ làm đi làm lại thì có thêm 1 bài y hệt trong data!

Em thấy cái VBB mình gửi bài rồi bấm back, reload, nó đâu có hiện ra như vậy!? Làm cách nào vậy mọi ngùo7i!

Làm ơn giúp em với, thank!

honnhienh
25-07-2010, 19:53
up cho nó mới nè. cũng thắc mắc như bác chờ 2 hôm nay chưa ai comment.

vnntech.com
25-07-2010, 20:44
Cái đó thì mình hay làm như này
1. khống trế bằng primary key cho data do, khi no save vao roi ma no refresh lại thì lúc đó nó bị duplicate key, thì nó sẽ ko lưu thêm vào được lần nữa.

2. khi save xong cho nó load lại page bằng redirec lại cái page đó luôn như vậy nó sẽ không còn lưu lại sự kiện submit

tham khảo vậy nhé....

thuyduongcd
26-07-2010, 09:32
Ở trang nhận action, khi get được thông tin, trước khi lưu vào DB cần kiểm tra thông tin này trong DB, xem đã có record nào giống hệt những thông tin này chưa. Nếu chưa thì tiến hành insert vào, còn có rồi nghĩa là đã bị resubmit. Khi đó thì hiện câu thông báo hoặc bỏ qua thao tác insert

honnhienh
26-07-2010, 19:00
Ở trang nhận action, khi get được thông tin, trước khi lưu vào DB cần kiểm tra thông tin này trong DB, xem đã có record nào giống hệt những thông tin này chưa. Nếu chưa thì tiến hành insert vào, còn có rồi nghĩa là đã bị resubmit. Khi đó thì hiện câu thông báo hoặc bỏ qua thao tác insert

quá trình này kiểm tra cũng không ộn lắm. nếu mà số lượng lớn thì hơi đuối. tôi thường làm sau khi insert song là cho nó nhay qua trang khác luôn. ở trang này muốn in gì thì in hi hi. Cũng mới nghĩ tới cách un_set mấy cái biến post or get di nhưng chưa thử. lúc nào đó thử mới được.
@vnntech.com cach đó cũng ộn tôi làm cái đăng ký theo cách đó thấy chạy ộn.

thuyduongcd
27-07-2010, 09:24
tôi thường làm sau khi insert song là cho nó nhay qua trang khác luôn
Cho dù nhảy đi đâu đi nữa thì nếu muốn người ta vẫn có thể back lại để cho nó duplicate.

khống trế bằng primary key cho data do, khi no save vao roi ma no refresh lại thì lúc đó nó bị duplicate key, thì nó sẽ ko lưu thêm vào được lần nữa.
duplicate key như vậy sẽ sinh lỗi trong câu lệnh. Khác nào tự mình bẫy lỗi mình.
Thứ hai, rất khó để tìm một primary key cho phù hợp. Vi dụ bảng comment cho blog đi, bạn sẽ sử dụng field nào làm key?

langtuquy
27-07-2010, 11:31
Dùng trigger và procedure/function để mySQL tự kiểm tra điều kiện INSERT có vẻ là giải pháp toàn diện cho vấn đề này.


DROP TRIGGER IF EXISTS `insert_record`;
DELIMITER //
CREATE TRIGGER `insert_record` BEFORE INSERT ON `table`
FOR EACH ROW BEGIN

CALL check_insert(NEW.field_1, NEW.field_2, NEW.field_3, NEW.field_2);
END
//
DELIMITER $$

DROP PROCEDURE IF EXISTS `check_insert`$$
CREATE DEFINER=`root`@`localhost` PROCEDURE `check_insert`(field_1 type, field_2 type, field_3 type, field_4 type)
BEGIN

DECLARE check INT;



SELECT count(*)

INTO check

FROM table

WHERE `field1` = field_1 AND `field2` = field_2 AND `field3` = field_3 AND `field4` = field_4;


IF (check = 0) THEN

INSERT INTO `table`(field1, field2, field3, field4)

VALUES (field_1, field_2,field_3, field_4);



ELSE

SELECT CONCAT('Khong the chen vao bang');

END IF;



END$$

DELIMITER ;

honnhienh
27-07-2010, 15:21
Cho dù nhảy đi đâu đi nữa thì nếu muốn người ta vẫn có thể back lại để cho nó duplicate.



mới access trang bạn có kiểm tra isset một giá trị trong $_POST hoặc $_GET mà.

thuyduongcd
28-07-2010, 09:15
Với $_GET thì khi back lại, url vẫn giữ nguyên, do đó $_GET vẫn tồn tại.
Với $_POST, khi back lại, trình duyệt sẽ hiển thị hộp thoại yêu cầu xác nhận việc post lại data mà người dùng ít ai chịu đọc (có thể vì lười hoặc đọc cũng không hiểu) nên cứ OK cho xong. Vậy là $_POST vẫn có tác dụng.

hocvui.net
02-08-2010, 21:30
Oh thì nếu kiểm tra record cũng được, chỉ là một số cấu trúc phải dùng tới cái cột id tự tăng lên. Làm như vậy cũng không được!

Em giải quyết vấn đề suy nghĩ hết cả nagỳ trời, tạm thời thì hơi ổn ổn rồi! này bằng cách:

Đặt code xử lý vào ngay cái trang có cái form
1. Ở đaọn code chèn vào cSDL sẽ check 1 biến sesion A và biến $_POST B có bằng nhau hay không mới chèn(2 biến này ở ngay bước sau)
2. Ngay khi load trang lấy ngay biến thời gian, đặt thời gian đó cho 1 biến session A và 1 input type hidden B

Trường hợp người dùng bấn nút Submit, tất nhiên ở giai đoạn 1 biến sesion A đã được đặt giá trị, và biến $_POST['B'] củng vậy, 2 thằng này nó bằng nhau! Sau khi SUbmit biến sesion A được đặt giá trị ngay lập tức, còn biến $_POST['B'] chỉ được đặt giá trị khi tiếp tục nhấn Sumit.

Nếu mà người dùng reload hay bấm back, cả cái mãng POST được gửi lai6 là mảng củ, sẽ không thực hiện được vụ isnert!


if($_POST['time']==$_SESSION['time']) {
//SQl Query
}
$now = time();
$_SESSION['time'] = $now;
//Html//
echo '
<form action="#" method="pots">
<input type="hidden" name="time" vaule="'.$now.'" />
</form>';


Thử thì chưa thấy lỗ thủng nào, mọi người nghĩ sao về phương pháp này!?

BnoL
02-08-2010, 23:23
- Sao ko dùng captcha nhỉ? :) Lúc resubmit thì captcha sẽ thay đổi nên mình check captcha là ok.

@hocvui.net: Cách của bạn cũng ok. Nhưng mà code của bạn có vấn đề. :)

honnhienh
02-08-2010, 23:53
bác này hay ha không biết giải pháp này ộn không ha, phát sing ra một cái capchar ngầm insert vào thành công là delete nó luôn. các pro coi giải pháp này thế nào. Mình thấy cũng hay ha.

hocvui.net
03-08-2010, 09:20
Capcha mỗi lần gửi làm cho member nó chán!

Biện pháp thì rấtnhiều, chỉ duy biện pháp tốt là có hơi ít!

honnhienh
03-08-2010, 10:57
mình đâu bắt người ta nhập đâu bác.

ngoc_viet08
05-08-2010, 00:26
redirect là xong mà , back chẳng an thua :|

2 form liên tiếp mới mệt

[=========> Bổ sung bài viết <=========]


mình đâu bắt người ta nhập đâu bác.
vậy nó chả có tác dụng gì .

haicop
05-08-2010, 14:19
Mình toàn submit form bằng Ajax, reload vô tư.

honnhienh
05-08-2010, 15:20
vậy nó chả có tác dụng gì .
sao khôgn bác. hàm insert nếu thành công xóa cái captcha đi (lúc insert kiểm tra cái captcha hog có thì đâu cho nó insert)

ngoc_viet08
06-08-2010, 23:42
thử đi rồi nói . đặt captcha ngầm rồi tự kiểm tra chả khác nào khóa cửa bằng ổ khóa và dắt chìa khóa ở đó :D

langtuIT
07-08-2010, 12:47
thử đi rồi nói . đặt captcha ngầm rồi tự kiểm tra chả khác nào khóa cửa bằng ổ khóa và dắt chìa khóa ở đó :D
Đừng nói như thế chứ, chắc trong đầu bạn cứ nghĩ captcha là phải hiện ra rồi để user nhập rồi check. Vậy bạn biết thế nào là khái niệm Token để chống CSRF form không?

Ý tưởng của bạn gì ở trên biến tấu cái captcha để giải quyết bài toán này khá hay. Các bạn không nhất thiết phải sử dụng captcha vì nó tốn resource. Cách giải quyết đơn giản là trong cái form submit, mình thêm 1 hidden input, có value là 1 giá trị session và tất nhiên random value. Như vậy, ở script kiểm tra trước khi insert, mình check cái token này trước, và đồng thời sau đó, generate một cái token value khác, để lỡ như người ta có refresh hay nhấn back thì cái token được gởi lên do form lúc trước đã invalid, như vậy sẽ đảm bảo không xử lý tiếp.

Ngoài tác dụng này, token được dùng phổ biến để giải quyết bài toán bảo mật chống lại CSRF. Các bạn có thể search để tìm hiểu thêm về Token.

Enjoy phping!

ngoc_viet08
08-08-2010, 01:21
Đừng nói như thế chứ, chắc trong đầu bạn cứ nghĩ captcha là phải hiện ra rồi để user nhập rồi check. Vậy bạn biết thế nào là khái niệm Token để chống CSRF form không?


Thanks vì kiến thức mới . ko hẳn là mình nghĩ captcha cần phải gõ . mình có thử phương pháp như Token nhưng ko đạt được kết quả mong muốn . giờ mới bik có pp token nên mới bik là có cách giải , đúng là mình còn hạn chế nhiều :)

zmt264
08-08-2010, 01:25
Em đang làm một cái guestbook, cái mà lúc ngùo7i ta điền vào vá nhấn submit hay reload thì có cái thông báo nói là phải gửi ại hết mấy thông tin............ làm đi làm lại thì có thêm 1 bài y hệt trong data!

Em thấy cái VBB mình gửi bài rồi bấm back, reload, nó đâu có hiện ra như vậy!? Làm cách nào vậy mọi ngùo7i!

Làm ơn giúp em với, thank!

Điều này cho thấy là bạn mất gốc, ko nắm rõ kiến thức căn bản về POST và GET thôi

kenphan19
08-08-2010, 10:52
Điều này cho thấy là bạn mất gốc, ko nắm rõ kiến thức căn bản về POST và GET thôi
liên quan gì đến POST và GET ở đây ! đó chỉ là 1 kỷ thuật, còn POST và GET chỉ mang nhiệm vụ truyền dữ liệu thôi mà :D