如何防止自定义发布请求到表单的“操作”页面

时间:2013-03-16 11:15:38

标签: php html form-submit

我正在制作一个表单,我希望只有在提交表单时才能访问提交的PHP页面,从而阻止对我的PHP页面的自定义请求。

这是我的form.html:

<html>
    <head>
        <title>Name/Surname form</title>
    </head>
    <body>
        <form id="form1" method="POST" action="processData.php">
            Name: <input type="text" id="name" name="name"><br>
            Surname: <input type="text" id="surname" name="surname"><br>
            <input type="submit" value="Submit form">
        </form>
    </body>
</html>

然后我的processData.php:

<?php
    if(!isset($_POST['name'],$_POST['surname'])) die;

    include ("config.php");

    //connect
    $mysqli = new mysqli($dbhost, $dbuser, $dbpassword, $dbname); //variables from config.php

    //check connection
    if (mysqli_connect_errno()) {
        printf("Connect failed: %s\n", mysqli_connect_error());
        exit();
    }


    if ($stmt = $mysqli->prepare("INSERT INTO name_surname_table (name, surname) values (?, ?)")) {

        //bind
        $stmt->bind_param('ss', $name, $surname);

        //set
        $name=$_POST['name'];
        $surname=$_POST['surname'];

        //execute
        $stmt->execute();

        //close
        $stmt->close();
        }
    else {
        //error
        printf("Prepared Statement Error: %s\n", $mysqli->error);
    }
?>

问题是,如果我在上一页中没有提交表单的情况下执行自定义发布请求,则数据会提交给数据库,这意味着自动程序可以在我的数据库中放入任何需要的内容...我可以阻止这个吗?

谢谢!

4 个答案:

答案 0 :(得分:4)

您可以通过多种方式阻止机器人自动提交表单:

  1. 使用Captcha或一些简单的计算字段(例如What gives 3 + 2 ?

  2. 使用令牌

  3. 使用$_REQUEST变量进行检查

  4. 令牌可以像这样完成:

    session_start();
    //generate a unique string
    $token = uniqid(rand(), true);
    //Store the token
    $_SESSION['token'] = $token;
    //Store the token_time
    $_SESSION['token_time'] = time();
    

    向表单添加隐藏的输入:

    <input type="hidden" name="token" id="token" value="<?php echo $token;?>"/>
    

    而不是在将表单提交到数据库之前:

    session_start();
    //If token exists
    if(isset($_SESSION['token']) && isset($_SESSION['token_time']) && isset($_POST['token']))
    {
        //If it's the same as the posted one
        if($_SESSION['token'] == $_POST['token'])
        {
            //For example 15 mins ago
            $old_time = time() - (15*60);
            //If token hasn't expired
            if($_SESSION['token_time'] >= $old_time)
            {
               //Do your queries here
            }
        }
    }
    

答案 1 :(得分:0)

您可以在表单中包含一个隐藏字段,其中包含一个到期的密码...

生成表单时,可以通过在时间上运行哈希计算代码,或者甚至只选择一个随机数。然后将其存储在会话中并将其插入您发送的表单中。

处理表单提交时,请检查以确保密码与会话中存储的密码相同。

答案 2 :(得分:0)

您应该为表单进行基于令牌的身份验证。

在显示表单的页面中,首先使用随机代码设置会话变量。

//generate this using whatever random code generation method you prefer.
$_SESSION["token"] = "your-random-code";

在您的论坛中有一个隐藏字段,如下所示。

<input type="hidden" name="token" value="<?php echo $_SESSION['token'] ?>">

在提交处理程序php文件中,执行如下所示的检查。

if(isset($_POST['token']) && $_POST['token'] == $_SESSION['token'])

答案 3 :(得分:0)

从根本上说,您无法阻止恶意客户端向您的服务器发送“不正确”的数据。您可以自行检测该情况并正确处理错误情况。

如果只有某些用户能够提交数据,那么显然你需要某种形式的登录系统。然后,您可以信任来自登录用户的任何数据,并拒绝其他所有数据。

如果您只是想知道客户端在上一页上加载了表单,您可以添加一个包含“nonce”的隐藏字段 - 一个随机字符串,其值存储在服务器上的某个位置,例如PHP会话中。如果提交的随机数与预期值不匹配,则拒绝输入。请注意,这确实保证用户在浏览器中与表单进行交互,只保证他们下载了表单(因为程序仍然可以提取现时并刺激提交表单)