我是PHP的新手,因为我正在学习,我刚刚发现你可以直接访问像domain.com/process.php这样的页面,页面仍会运行。
如何阻止用户直接访问该页面并确保他们在提交表单后进入process.php?
答案 0 :(得分:1)
也许你在寻找这个?也许还有另一种或更好的方法,但我不确定。
if(isset($_POST['submit']))
{
///process form
}
在大多数情况下,这应该可行,但有些情况可能不会,在这种情况下,您可以添加隐藏字段:
<input type='hidden' name='submit' />
应始终提交隐藏字段。
答案 1 :(得分: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();
*/
答案 2 :(得分:0)
使用会话阻止用户直接访问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;
}
即使这可以自动化,首先转到索引页然后自动处理页面,你可以使用验证码来避免它。
答案 3 :(得分:0)
以下是2个如何停止使用set会话和检查请求是否为POST的组合来运行process.php的示例(其他人提到仅检查submit
已设置但是bot只需要将该值添加到其参数中,但是通过使用随机密钥,机器人必须访问表单页面并至少获取密钥一次,同样为了一些额外的安全性,您可以取消设置会话变量,因此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>
process.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");} ?>