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

时间:2015-11-03 09:21:08

标签: javascript php session

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

注意:编辑过的脚本没有被正确复制(一个是第一个的重复...

我正在尝试阻止Backspace导航插入,更新和删除脚本,因为这些脚本可以生成insconsitent数据库条目。

CRUD生成列表,插入,查看,更新和删除脚本以及附加的insert_DB,update_DB和delete_DB脚本,这些脚本带有相应的数据库功能,或者会提醒用户非法调用脚本并将其重定向到主页。

为了防止这些页面的双重执行,插入,更新和删除页面记录了一个会话变量$ _SESSION ['Process'],其中包含要执行的预期下一个进程。

DB脚本检查适当的$ _SESSION ['Process']值并继续执行DB操作。如果成功,则会将浏览器重定向到特定表的List页面。

前进这个工作正常。但是在用户被重定向到表List脚本之后,如果用户点击“退格”,则用户不会被重定向到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();
}

&GT;

如果让这些脚本按预期工作,我该怎么办?

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

我试图无济于事,有几个方法可以保证会话写作和HTML刷新,如:

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

提前致谢

1 个答案:

答案 0 :(得分:0)

事实的组合使代码无法运行......

+)我期待一个ListDBTest.php被记录在浏览器历史记录中,其中ListDBTest.php基本上是一个服务器端脚本,所以没有标题发送到浏览器只是一个警报,因此浏览器没有&#34;访问页面&#34; ...

+)导航回页面,根据运行的浏览器产生了可变的结果,并且很难在所有浏览器上将页面重置为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模式解决了大多数重复记录问题,但仍然是非常好的做法,包括一个&#34; nonce&#34;如第一条所述,您的请求字段。

在服务器响应或互联网响应缓慢的情况下,您可能希望使用&#34;提交按钮&#34;在制作&#34; Post&#34;后禁用,因此用户无法在第一个实例中两次发送表单。看一下这个:http://www.the-art-of-web.com/javascript/doublesubmit/