2012-04-22 66 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");} ?>