Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/264.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何防止非法提交请求?_Php_Forms_Validation_Isset - Fatal编程技术网

Php 如何防止非法提交请求?

Php 如何防止非法提交请求?,php,forms,validation,isset,Php,Forms,Validation,Isset,我是PHP新手,所以在我学习的过程中,我刚刚发现您可以直接访问domain.com/process.PHP这样的页面,该页面仍然可以运行 我如何防止用户直接访问页面,并确保他们在提交表单后进入process.php?也许您正在寻找这个?也许还有其他更好的方法,但我不确定 if(isset($_POST['submit'])) { ///process form } 在大多数情况下,这应该有效,但在某些情况下可能无效,在这种情况下,您可以添加一个隐藏字段: <input t

我是PHP新手,所以在我学习的过程中,我刚刚发现您可以直接访问domain.com/process.PHP这样的页面,该页面仍然可以运行


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

也许您正在寻找这个?也许还有其他更好的方法,但我不确定

 if(isset($_POST['submit']))
 {
     ///process form
 }
在大多数情况下,这应该有效,但在某些情况下可能无效,在这种情况下,您可以添加一个隐藏字段:

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


应始终提交隐藏字段。

使用会话防止用户直接访问
process.php
。像在
index.php中一样
使用
session_start()$_会话['access']=“true”
和在
process.php
页面中

session_start(); 
<?php
if(isset($_SESSION['access'])){
?>
<form >.....your process form here....
<?php
}else{
echo "Direct access deny";
die;
}
session_start();
…您的流程表在此。。。。

简单地说,使用以下代码:

<?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();
*/

//这里的“提交”是“提交”按钮的输入标记中的名称属性
/*
这仅仅意味着如果未按下submit按钮,则回显以下消息并
退出,不要运行其他任何操作。您也可以使用die('您的消息在这里')
而不是退出();
*/

以下是两个示例,说明如何通过组合使用设置会话和检查请求是否为POST来停止process.php的运行(其他人提到只需设置checking
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>

形式


嘿,我试过了,但页面仍在运行。处理代码是否需要放在括号中?我不能只使用它来查看是否单击了提交吗?仍然不起作用。我不确定发生了什么。我使用的是与您在上面发布的相同的代码段。也许您应该阅读更多有关CSRF保护的信息。请查看此内容。我已经做了一些编辑以进行修改它更加方便用户。
<?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;
}
?>
<?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
} ?>