0

我是 PHP 新手,所以当我学习时,我发现您可以直接转到 domain.com/process.php 之类的页面,并且该页面仍然可以运行。

如何防止用户直接访问该页面并确保他们在提交表单后访问了 process.php?

4

4 回答 4

1

也许你正在寻找这个?也许有另一种或更好的方法可以做到这一点,但我不确定。

 if(isset($_POST['submit']))
 {
     ///process form
 }

在大多数情况下,这应该可以工作,尽管在某些情况下可能不会,在这种情况下,您可以添加一个隐藏字段:

<input type='hidden' name='submit' />

应始终提交隐藏字段。

于 2012-04-22T02:34:36.750 回答
1

简单地说,使用这个代码:

<?php
if(!isset($_POST['submit']))
{
echo 'Try accessing this page by pressing submit button'. '<br />';
echo "<a href='form.html'>Goto Form Page</a>";
exit();
}
?>

// here 'submit' is the name attribute within your input tag for submit button
/*
It simply means if submit button is not pressed, echo the following message and 
exit don't run anything else. You can also use die('Your message here') 
instead of exit();
*/
于 2012-04-22T02:41:26.590 回答
0

使用 session 防止用户直接访问process.php. 就像在index.php使用session_start(); $_SESSION['access']="true";process.php页面中一样,

session_start(); 
<?php
if(isset($_SESSION['access'])){
?>
<form >.....your process form here....
<?php
}else{
echo "Direct access deny";
die;
}

即使这可以自动化,首先进入索引页面然后自动处理页面,您可以使用验证码来避免它。

于 2012-04-22T02:40:25.160 回答
0

以下是 2 个示例,说明如何使用设置会话和检查请求是否为 POST 的组合来阻止 process.php 运行(其他人提到只是submit设置了检查,但机器人只需要将该值添加到其参数,但是通过使用随机密钥,机器人必须访问表单页面并至少获取一次密钥,另外为了一些额外的安全性,您可以取消设置会话变量,以便 process.php 在每个表单视图中只运行一次,这将减慢(但不停止)蛮力或垃圾邮件发送者):

表单页面

<?php 
session_start();
$_SESSION['process_key']=md5(microtime(true));
?>
<p>Form</p>
<form method="POST" action="process.php">
  <input type="hidden" name="key" value="<?=$_SESSION['process_key'];?>">
  <p><input type="submit" value="Submit" name="submit"></p>
</form>

进程.php

<?php
session_start();

if($_SERVER['REQUEST_METHOD'] =='POST' && isset($_SESSION['process_key']) && $_POST['key'] == $_SESSION['process_key']){
    //process form
   ...
   ...
 unset($_SESSION['process_key']);
}else{
    header('Location: ./index.php');
    die;
}
?>

或者另一种方法是将表单发布回脚本并包含 process.php。

<?php 
//Form Page
session_start();
define('RUN',true);
if($_SERVER['REQUEST_METHOD'] =='POST' && isset($_SESSION['process_key']) && $_POST['key'] == $_SESSION['process_key']){
    //process form
    include('process.php');
    die;
}else{
$_SESSION['process_key']=md5(microtime(true));  
//echo form
?>
<p>Form</p>
<form method="POST" action="">
  <input type="hidden" name="key" value="<?=$_SESSION['process_key'];?>">
  <p><input type="submit" value="Submit" name="submit"></p>
</form>
<?php
} ?>

然后在 process.php 的顶部,如果它不包含在另一个文件中,则它不能运行:

<?php if (!defined("RUN")){header ("Location: ./index.php");} ?>

于 2012-04-22T03:42:48.623 回答