私は 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();
*/
おそらくあなたはこれを探していますか?おそらくこれを行う別の方法またはより良い方法があるでしょうが、私にはわかりません。
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
が設定されているとだけ述べていますが、ボットはその値をその値に追加するだけで済みます。 params、しかしランダムキーを使用することで、ボットはフォームページにアクセスしてキーを少なくとも1回取得する必要があります。また、セキュリティを強化するために、セッション変数を設定解除して、process.phpがフォームビューごとに1回だけ実行されるようにすることもできます。ブルート フォースやスパマーの動きを遅くします (しかし止めません):
フォームページ
<?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>
プロセス.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");} ?>