脚本访问未记录在导航历史记录中,会话信息未正确存储

Script visit not recorded in navigation history and session info not correctly stored

本文关键字:记录 信息 会话 存储 历史 访问 导航 脚本      更新时间:2023-09-26

我正在为MySql DB开发一个自定义CRUD。(请原谅我的英语)

注意:未正确复制的已编辑脚本(其中一个是第一个的重复副本。

我试图阻止Backspace导航插入、更新和删除脚本,因为这些脚本可能会产生不一致的DB条目。

CRUD生成列表、插入、查看、更新和删除脚本,以及附加的insert_DB、update_DB和delete_DB脚本,这些脚本携带适当的DB函数,或者会提醒用户对脚本的特权调用并将其重定向到主页。

为了防止这些页面的双重执行,插入、更新和删除页面会记录会话变量$_session["进程"]以及要执行的下一个进程。

DB脚本检查适当的$_SESSION['Process']值,然后继续执行DB操作。如果成功,将把浏览器重定向到特定表的"列表"页。

展望未来,这很好。但是,在用户被重定向到表列表脚本后,如果用户点击"退格",则用户不会被重定向到DB脚本(这将自动失败并提醒用户),而是被重定向到调用插入、查看或更新脚本,从而跳过DB脚本。DB脚本未记录在浏览器历史记录中。此外,初始List脚本没有显示正确的会话值。

例如:(示例仅限于显示预期功能,不包括最佳实践,也不包括数据库连接等。)

ListTest.php

<?php
session_start();
$_SESSION['DBName'] = "segucom_Responsive";
echo"Request DB Data collection form <br />";
echo "Session(Insert) as Received: ", print_r($_SESSION), "<br/>";
$_SESSION [ 'Process' ] = ""; 
session_write_close();
echo "Session(Insert) as Set: ", print_r($_SESSION), "<br/>";
?>
<form method="post" name="InsertCheck" action="ListFormTest.php" >
<p><input type="hidden" name="ListRequest" value="1" ></p>
<input type="submit" value="submit" />
</form>

ListFormTest.php

<?php
session_start();
echo"Collect data and sent to DB Insert script <br />";
echo "Session(Insert) as Received: ", print_r($_SESSION), "<br/>";
$_SESSION [ 'Process' ] = "Insert"; 
session_write_close();
echo "Session(Insert) as Set: ", print_r($_SESSION), "<br/>";
?>
<form  action="ListDBTest.php" method="post" name="InsertCheck" >
<p>Input Some data <input type="text" name="Data" ></p>
<input type="submit" value="submit" />
</form>

ListDBTest.php

<?php
session_start();
echo"Receive data and insert in to DB, Chek for Scorrect Session Process value <br />";
echo "Session(Insert) as Received: ", print_r($_SESSION), "<br/>";
if ($_SESSION[ 'Process' ] != "Insert") {
    $_SESSION [ 'Process' ] = "Ilegal"; 
    session_write_close();
echo "Session(Insert) as Set: ", print_r($_SESSION), "<br/>";
echo '<script type="text/javascript">  alert  ("ILEGAL FORM ACCESS,");
window.location="ListTest.php";</script>';
}
 $_SESSION [ 'Process' ] = "Legal"; 
echo "Session(Insert) as Set", print_r($_SESSION), "<br/>";
include "../../cgh/tcl.txt";
 $conn = connect();
$sql = "INSERT  INTO Test (`Data`) VALUES  ('" . $_POST[ 'Data' ] . "');";
$res = $conn->query($sql) or die("Could not write Record, $sql " .  print_r($conn->errorInfo()));
if ($res != FALSE ) {
$_SESSION[ 'Process' ] = "Processed";
/*sleep(10);*/
session_write_close();
echo "Session(Insert) as Set: ", print_r($_SESSION), "<br/>";
echo '<script type="text/javascript">   alert ("Record Inserted");
window.location= "ListTest.php";  </script>';
} else {
 $_SESSION [ 'Process' ] = "DB_Error"; 
/*sleep(10);*/
session_write_close();
echo "Session(Insert) as Set: ", print_r($_SESSION), "<br/>";
echo '<script type="text/javascript">   alert ("Record Not Inserted"); 
window.location= "ListTest.php"; 
</script>';
die();
}

?>

我该怎么做才能使这些脚本按预期工作?

我搜索了StackOverflow并在谷歌上搜索了这个问题,但没有得到任何有用的建议,有些建议导致了定时器和延迟的使用,但提到了AJAX或上传延迟。

我试过了,但没有成功,有几个建议可以保证Session Writing和HTML Refresh,比如:

session_write_close();
sleep(10);
<meta HTTP-EQUIV="Pragma" CONTENT="no-cache"> 
<body onLoad="document.location.reload();"> 

提前感谢

事实的结合使代码无法操作。。。

+)我希望在浏览器历史记录中记录一个ListDBTest.php,其中ListDBTestphp基本上是一个服务器端脚本,所以没有发送到浏览器的标题,只是一个警报,因此浏览器不会"访问页面"。。。

+)导航回页面会根据运行的浏览器产生不同的结果,而且很难在所有浏览器上100%清除页面。

我的问题的正确答案是实现PGR(Post-Get-Redirect)模式。https://en.wikipedia.org/wiki/Post/Redirect/Get乍一看,这并不容易理解,但示例如下:
http://solidlystated.com/design/best-way-to-process-forms-with-php/和http://phptutorial.codepoint.net/php_redirection会让你走一半以上的路。

在这里,需要注意的是,尽管PGR模式解决了大多数复制记录问题,但如第一篇文章中所述,在请求中包含"nonce"字段仍然是非常好的做法。

在服务器响应或互联网响应缓慢的情况下,您可能希望在"发布"后禁用"提交按钮",这样用户就不能在第一次发送两次表单。看看这个:http://www.the-art-of-web.com/javascript/doublesubmit/