我最近问了这个问题Posting data with curl - actually refreshing to the next page,但我很快意识到解决方案并不是很好......
所以我在几个地方的PHP页面之间传递数据。这是我目前的问题:
我依赖Cookie,所以如果启用了Cookie,我会检查每个页面的顶部:
session_start();
if (!isset($_COOKIE['PHPSESSID'])) {
if ($_GET['rd'] == '1') {
header('Location: *redirect url*');
} else {
*refresh the page, setting 'rd' to '1'*
}
}
但是,由于这是每个页面上的“标题”,因此它必须是通用的。例如,发送给它的任何发布或获取数据(来自其他页面或表单)都应发送到重定向页面。
获取很容易,因为我可以将其包含在网址中,但我一直遇到Post的问题。
我从cURL开始将Post数据发送到下一页,但我意识到它实际上没有进入页面
$ch = curl_init($some_url);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, 'myvar=something');
curl_exec($ch);
curl_close($ch);$ch = curl_init($some_url);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, 'myvar=something');
curl_exec($ch);
curl_close($ch);
之后cURL不加载$ url;它返回它
所以我被建议使用Sessions,我很快意识到这不是一个很好的解决方案;
关于数字2,我设置了另一个会话变量,如果Post数据已移动到Session,则告诉以下页面。但是,每次我必须重置该变量时,它只会使事情变得复杂和不整洁。
示例: 我有一个注册页面,将表单数据发送到验证页面。这两个都有标题来检查cookie是否已启用。
发布数据被发送到验证页面,如果有问题,我无法将数据发布回验证页面(告诉用户有什么问题),我必须设置一个会话变量注册错误。每次,我都要取消注册错误变量。
现在我认为我不需要验证页面上的cookie,但我不想要任何漏洞,我不知道稍后会添加什么。
回到问题
我知道这是一项艰巨的任务,但如果有人能提供帮助,我们将非常感激!
答案 0 :(得分:1)
如果所有中间页面都在验证表单数据,请将其废弃;只需在同一PHP脚本中执行此操作即可。最简单的,您可以:
<?php
$yourkey = 'goeshere';
if (!isset($_COOKIE[$yourkey])) {
setcookie($yourkey, $value, $expires);
}
if (isset($_POST['submit'])) {
$errors = array();
// do validation here
// iterate over your fields and add any errors to $errors array
if (empty($errors)) {
// redirect if there are no errors, if you really need to
header('Location: success.php');
exit;
}
}
?>
<html>
<body>
<form method="post" action="">
<label for="name">Your name:</label>
<input type="text" name="name" value="<?php echo isset($_POST['name']) ? $_POST['name'] : ''; ?>" id="name" />
<input type="submit" name="submit" value="Submit" />
</form>
</body>
</html>
HTML页面中存在一个XSS漏洞echo
POST数据,但我会将此保留给您保护。
答案 1 :(得分:0)
我不确定这是否有用,但也许您可以尝试限制页数?我通常做的是在一个php页面上有形式和验证。您检查用户是否在开始时发送了一些内容,如果他发送了,检查它并显示任何错误。如果没有,请显示表格。