2015-07-28 2 views
0

Re редактирование ... этот вопрос НЕ был дан раньше!Могу ли я заставить страницу в истории удаляться?

Я понял, что изменение содержимого текущей страницы с помощью window.location заменило кешированную версию исходной страницы (из «последней» истории), так что вы действительно не смогли вернуться с помощью кнопки BACK браузера , Я даже видел, что это было опубликовано как решение, позволяющее злоумышленнику использовать кнопку BACK для повторной отправки формы письма много раз. Но это НЕ работает, потому что в случае электронной почты кнопка BACK просто вернет пользователя обратно к версии POST до версии.

Итак, я могу использовать javascript, чтобы сбросить форму, отключить кнопку SUBMIT, перейти на другую страницу после успеха или сделать все, что захочу на странице. Но все это ни для чего, если простой щелчок кнопки BACK, за которым следует SUBMIT, заставляет форму публиковать снова всего двумя щелчками.

Я знаю, что существует множество решений для предотвращения повторных попыток вредоносных форм, которые я могу попробовать, но у меня были проблемы с их работой, и поэтому я просто хотел бы знать, является ли удаление последней истории тупиком , Если есть способ, и он очень кросс-браузер дружественный, то я могу просто сделать его частью моих скриптовых действий, как только моя форма будет успешно обработана, и отобразится страница «спасибо». В принципе, я бы хотел, чтобы мое «спасибо» на странице «onload», чтобы стереть последнюю историю, или в браузере совместимый способ отключить кнопку BACK!

Для чего стоит, я включил код из простого теста, с которым я работал. Вы можете поместить некоторый барахл в полях и нажать submit. Варвары очищаются в PHP, поля формы очищаются в javascript, и вызывается новое «местоположение». К сожалению, нажатие кнопки BACK вернет вас к форме «предварительно размещенной», при этом все строки, которые вы добавили, остались неповрежденными.

<!DOCTYPE HTML> 
<html> 
<head> 
<title> Form Behavior Test</title> 
</head> 


<!-- 
<?php 

$name = $email = $comments = ""; 
$formDone = false; 

if ($_SERVER["REQUEST_METHOD"] == "POST") 
    { 
    $formDone = true; 
    $name = $email = $comments = ""; 

    } 
?> 
--> 

<body > 
<table border="1"><tr><td style ="text-align:right;" width=100%> 
<form name="contactform" id="contactform" method="post" enctype="multipart/form-data" action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]);?>"> 

Name: <input type="text" name="name" id="name" value="<?php echo $name;?>"><br> 
Email: <input type="text" name="email" id="email"value="<?php echo $email;?>"><br> 
<br> 
<div align="center"> ---- <span class="error">*</span> Message ---- <br> 
<textarea name="comments" id="comments" wrap="physical" cols="40" rows="10" ><?php echo $comments;?></textarea> 
</div> 

<input name="submit" id="submit" type="submit" value="Submit" > 
</form> 
</td></tr></table> 


<script language="JavaScript"> 
if (<? echo ($formDone == true) ? 'true' : 'false'; ?>) 
{ 
    document.getElementById("name").value = ""; 
    document.getElementById("email").value = ""; 
    document.getElementById("comments").value = ""; 
    document.getElementById("submit").value="Disabled"; 
    document.getElementById("submit").disabled=true; 

     // substitute with a thank you page 
    window.location = "http://google.com"; 

} 
</script> 

</body> 
</html> 
+0

https://developer.mozilla.org/en-US/docs/Web/API/Location/replace – nikhil

+0

Это не дубликат этого вопроса. Другой вопрос касается только PHP, это один из JAVASCRIPT. Пожалуйста, внимательно прочитайте, прежде чем маркировать как дубликат. – taxicala

+1

@taxicala Согласовано (и проголосовало за повторное открытие), но дублирование представления должно быть реализовано на стороне сервера.Любая клиентская сторона предназначена только для лучшего UX при срабатывании предупреждения. – o11c

ответ

0

После поиска довольно исчерпывающе, я не верю, что есть какой-нибудь способ, чтобы удалить страницу из истории, за исключением самых последних браузеров, которые поддерживают новые HTML-5 методов истории. Я по-прежнему открыт для решений, но на данный момент я думаю, что для меня проще всего настроить cookie в любое время, когда успешный адрес электронной почты обрабатывается моим PHP-кодом. Затем я также могу сделать PHP или javascript-фрагмент для файла cookie, и если он найден, я могу принимать всевозможные действия ... уничтожить все заполненные поля (как они были бы, если нажать кнопку BACK), блокировать по электронной почте, вежливо информировать пользователя о том, что он/она должен ждать (пока мой файл cookie не истечет), чтобы отправить другое электронное письмо, хотя форма и т. д.

Я не хотел этого делать изначально, потому что кнопка BACK на самом деле не перезагрузите страницу, она просто отобразит ее. Если бы был универсальный способ, совместимый с браузером, для того, чтобы страницы, которые были достигнуты с помощью обратных кнопок, фактически перезагружались, это никогда не было бы проблемой для начала. Так что даже с печеньем мои оборонительные действия не могли активироваться до тех пор, пока не будет нажата кнопка SUBMIT. Думаю, я смогу жить с этим. Кроме того, даже сегодня некоторые люди параноидальные о печенье и отключить их. Но если я хочу быть непреклонным в этом, я могу просто определить, когда я не могу установить cookie, и сообщить пользователю, что файлы cookie должны использовать мою форму электронной почты. Если это слишком большая сделка, хорошо!

Спасибо тем, кто внес свой вклад. Дело в том, что ответы LACK на самом деле очень полезный ответ. Когда я отправляю сообщение на любом форуме stackoverflow и не получаю ответы довольно быстро, его хороший красный флаг, что все будет запутано очень быстро, если я не буду рассматривать альтернативный подход! :-)

Смежные вопросы