2012-04-22 68 views
0

我是PHP新手,因此我刚刚发现,您刚刚发现可以直接访问像domain.com/process.php这样的页面,并且页面仍然可以运行。如何防止非法提交请求?

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

+0

也许你应该阅读更多关于CSRF保护 – hamczu 2012-04-22 02:46:27

回答

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

完美。有效。 – ariel 2012-04-22 02:43:48

+0

看看这个。我做了一些编辑,使其更加用户友好。 – yusufiqbalpk 2012-04-22 02:58:12

1

也许您正在寻找?也许有另一种或更好的方式来做到这一点,但我不确定。

if(isset($_POST['submit'])) 
{ 
    ///process form 
} 
在大多数情况下,这应该工作

,但某些情况下可能无法在这种情况下,你可以添加一个隐藏字段:

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

隐藏字段应始终被提交。

+0

嘿,我试过但页面仍然贯穿。处理代码是否需要放在括号内?我不能只用它来查看提交是否被点击或没有? – ariel 2012-04-22 02:37:24

+0

嘿,试试我更新的答案。 – 2012-04-22 02:40:11

+0

仍然无法使用。我不确定发生了什么事。我正在使用上面发布的相同片段。 – ariel 2012-04-22 02:42:25

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; 
} 

即使这样可以实现自动化,先去索引页,然后进程页自动,您可以使用验证码,以避免它。

0

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

表Page

<?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");} ?>