我是PHP新手,因此我剛剛發現,您剛剛發現可以直接訪問像domain.com/process.php這樣的頁面,並且頁面仍然可以運行。如何防止非法提交請求?
如何防止用戶直接訪問該頁面並確保他們在提交表單後進入process.php?
我是PHP新手,因此我剛剛發現,您剛剛發現可以直接訪問像domain.com/process.php這樣的頁面,並且頁面仍然可以運行。如何防止非法提交請求?
如何防止用戶直接訪問該頁面並確保他們在提交表單後進入process.php?
簡單地說,使用此代碼:
<?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();
*/
完美。有效。 – ariel 2012-04-22 02:43:48
看看這個。我做了一些編輯,使其更加用戶友好。 – yusufiqbalpk 2012-04-22 02:58:12
也許您正在尋找?也許有另一種或更好的方式來做到這一點,但我不確定。
if(isset($_POST['submit']))
{
///process form
}
在大多數情況下,這應該工作
,但某些情況下可能無法在這種情況下,你可以添加一個隱藏字段:
<input type='hidden' name='submit' />
隱藏字段應始終被提交。
使用會話阻止用戶直接訪問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;
}
即使這樣可以實現自動化,先去索引頁,然後進程頁自動,您可以使用驗證碼,以避免它。
下面是如何從運行這兩個使用一組會話的組合。如果請求是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");} ?>
也許你應該閱讀更多關於CSRF保護 – hamczu 2012-04-22 02:46:27