在将POST重定向到GET而不传递URL中的变量时,是否有一种线程安全的方法来传递变量?
我想要实现的是这个。我有一个页面,其中包含一个允许用户上传图像的表单。该表单由浏览器作为POST发送到我的服务器。如果图像上传成功,页面将被重定向到GET,我想在其中显示用户刚刚上传的图像。我可以想到在两个页面之间传递变量的唯一安全方法是通过GET参数。
ImageUpload.php
$imageID = processImageUpload();
if($imageID){
redirect("/ImageDisplay.php?uploadedImageID=".$imageID)
}
ImageDisplay.php
$uploadedImageID = getRequestVariable('uploadedImageID');
if($uploadedImageID != FALSE){
//Display the image just uploaded with an 'image uploaded success!' message
}
//Display all the other images
虽然这不是世界上最糟糕的事情,但将变量作为GET参数包含在内有点难看。它也有点误导,好像用户点击重定向页面上的刷新,将看到'图像上传成功!'再次发送消息,即使他们还没有上传图片。
是否存在另一种将变量从POST页面传递到GET页面的线程安全方法?
使用会话或cookie变量并不安全,因为可能会同时上传两张图片,因此可能存在竞争条件。
我以为我可以使用重定向,然后阅读引荐来源标题,例如:
然而,似乎引用者始终是持有上传表单的页面,而不是任何中间步骤。
除了作为GET参数之外,还有其他方法可以将变量从一个请求传递到另一个请求吗?
答案 0 :(得分:1)
我认为传递GET参数是一个很好的选择,原因如下:
您可能会做的只是在请求完成后重写网址,以便使用 imageName 参数看起来网址不够丑。
我认为保持会话中的数据应该是最后的手段。会话中的数据使应用程序很难在运行时进行扩展。在关闭该服务器上的所有会话之前,无法关闭服务器以进行维护。基本上会话数据会带来很多麻烦。
答案 1 :(得分:1)
我建议的方法很难看,但它不会向用户显示查询字符串中的变量。
考虑如下修改 ImageUpload.php 文件(未经测试的代码):
$imageID = processImageUpload();
if($imageID){
<?php
<!Doctype html>
<html>
<head>
<title>Upload successful! Redirecting...</title>
<script type="text/javascript">
window.onload = function () {
document.getElementById("redirectionForm").submit();
return;
}
</script>
</head>
<body>
<div style="text-align: center; padding: 50px; font-style: italic;">
Image upload successful!
<br />
Please wait while you are redirected...
</div>
<form id="redirectionForm" action="ImageDisplay.php" method="post">
<input type="hidden" name="uploadedImageID" value="<?php echo $imageID; ?>" />
</form>
</body>
</html>
?>
}
这将在客户端输出一个表单,然后将用户重定向到 ImageDisplay.php 以及相关的POST数据信息。
答案 2 :(得分:-1)
您可以设置自定义标题,如:
header('X-UploadedImageID: 123');
您可以headers_list()访问标题:
headers_list();
这个var_dump()
看起来像是:
array(2) {
[0] =>
string(35) "X-Powered-By: PHP/5.3.19"
[1] =>
string(22) "X-UploadedImageID: 123"
}
因此,要获得123,您只需要执行以下操作:
$headers = headers_list();
echo str_replace('X-UploadedImageID: ', '', $headers[1]);
哪个会给你:123
确保在输出任何数据之前和调用标题位置重定向之前设置这些标题。
将您的ImageUpload.php更改为:
$imageID = processImageUpload();
if($imageID){
header('X-UploadedImageID: ' . $imageID);
redirect("/ImageDisplay.php");
}
将您的ImageDisplay.php更改为:
$headers = headers_list();
$uploadedImageID = str_replace('X-UploadedImageID: ', '', $headers[1]);
if($uploadedImageID != FALSE){
//Display the image just uploaded with an 'image uploaded success!' message
}