服务器端验证/编程和设计

时间:2014-02-05 06:51:02

标签: php forms validation sanitization

我已经坚持了一段时间了。我有一个位于index.php的表单。数据被发送到名为processuserform.php的php文件。我提取所有输入并将它们分配给它们自己的变量。以下看起来是在服务器端验证和清理表单的正确方法吗?

首先是表单本身,然后PHP文件将用于处理发送给它的数据。

<form method="POST" name="signup" action="php/processuserform.php">

    <input id="firstname" onkeyup="validateFirstName()"  placeholder="First Name" type="text" /><label id="firstnameprompt"></label>

    <br><br>

    <input id="lastname" onkeyup="validateLastName()"  placeholder="Last Name" type="text"/>
    <label id="lastnameprompt"></label>

    <br><br>

    <input id="Email" onkeyup="validateEmail()"  placeholder="Email" type="text" />
    <label id="Emailprompt"></label>

    <br /><br />

    <input id="Password" onkeyup="validatePassword()"  placeholder="Create Password" type="password" /><label id="Passwordprompt"></label>

    <br /><br />

    <strong>Male</strong><input id="Gender" type="radio" name="sex" value="male">
    <strong>Female</strong><input id="Gender" type="radio" name="sex" value="female">

    <br /><br />

    Click "Submit" if you agree to <a href="#">"Terms And Conditions"</a>
    <br>
    <input id="submit" onclick="return validateUserRegistration()" value="Submit" type="submit" name="submit"/>
    <label id="submitprompt"></label>
    <br><br>

processuserform.php

<?php

$first_name = ($_POST['firstname']);
$last_name = ($_POST['lastname']);
$email = ($_POST['Email']);
$pw = ($_POST['Password']);
$gender = ($_POST['Gender']);

// define variables and set to empty values
$first_nameErr = $last_nameErr = $emailErr = $pwErr = $genderErr = "";
$first_name = $last_name = $email = $pw = $gender = "";

if ($_SERVER["REQUEST_METHOD"] == "POST")
{
    if (empty($_POST["firstname"]))
    {
        $first_nameErr = "Name is required";
    }
    else
    {
        $first_name = test_input($_POST["firstname"]);
        // check if name only contains letters and whitespace
        if (!preg_match("/^[a-zA-Z ]*$/",$first_name))
        {
            $first_nameErr = "Only letters and white space allowed";
        }
    }

    if ($_SERVER["REQUEST_METHOD"] == "POST")
    {
        if (empty($_POST["lastname"]))
        {
            $last_nameErr = "Name is required";
        }
        else
        {
            $last_name = test_input($_POST["lastname"]);
            // check if name only contains letters and whitespace
            if (!preg_match("/^[a-zA-Z ]*$/",$last_name))
            {
                $last_nameErr = "Only letters and white space allowed";
            }
        }

        if (empty($_POST["Email"]))
        {
            $emailErr = "Email is required";
        }
        else
        {
            $email = test_input($_POST["email"]);
            // check if e-mail address syntax is valid
            if (!preg_match("/([\w\-]+\@[\w\-]+\.[\w\-]+)/",$email))
            {
                $emailErr = "Invalid email format";
            }
        }

        if (empty($_POST["Password"]))
        {
            $pwErr = "Password is required";
        }
        else
        {
            $pw = test_input($_POST["Password"]);
        }
    }
    if (empty($_POST["Gender"]))
    {
        $genderErr = "Gender is required";
    }
    else
    {
        $gender = test_input($_POST["Gender"]);
    }
}

function test_input($data)
{
    $data = trim($data);
    $data = stripslashes($data);
    $data = htmlspecialchars($data);
    return $data;
}

$hostname="this is correct";
$username="this is correct";
$password="this is correct";
$dbname="this is correct";

$db_conx = mysqli_connect($hostname, $username, $password) OR DIE ("Unable to connect to database! Please try again later.");

if(mysqli_connect_errno())
{
    echo mysqli_connect_error();
    exit();
}

$select = mysqli_select_db($db_conx,$dbname);

mysqli_query($db_conx,"INSERT INTO users (firstname, lastname, email, password, gender)
    VALUES ('$first_name', '$last_name', '$email', '$pw', '$gender')");
mysqli_close($db_conx);

header("Location: not/important.php")
?>

感谢大家的帮助。如果我正在消毒它并验证它是错误的,那么有人会介意给我一个例子,说明它应该如何使用我的一个输入作为例子吗?我可以使用帮助,因为这有点令人困惑。再次感谢!

3 个答案:

答案 0 :(得分:2)

你肯定想要验证服务器端(在javascript中进行验证根本不能保护你的数据!) 在任何情况下,您都应该让用户输入表单数据,POST,验证它以及是否有错误让您的php重新编写填写了现有数据的表单(因此用户无需再次输入)和针对有错误的条目的消息。

即。类似的东西:(非常简化!)

echo '<input id="firstname" value="' . $first_name . '"/>';
if( $first_nameErr != "" )
   echo 'Error: '.$first_nameErr;

此致, TonyWilk

答案 1 :(得分:1)

Javascript验证很好但仅用于UI目的,因为用户可以绕过该验证,因为javascript是基于客户端的。

对于禁用的javascript,我将按照Kuroi Neko的说法进行解释。

关于php端验证和javascript验证,你可以保留两者,这不是问题。但是在今天的良好实践中,我认为你应该使用基于ajax的表单这是一个很好的选择,如果发生错误你也不需要重新填充你的表单(我正在考虑javascript总是被启用)。

您必须在PHP代码中在服务器端进行所有验证,这是用户无法绕过的。在表单由ajax提交后,您将验证其中的所有表单字段。如果出现错误,则将错误消息返回给ajax请求并显示它们。如果没有错误,则执行您想要对表单数据执行的操作,然后将成功消息返回给ajax请求。

根据返回的ajax请求消息,您可以执行任何操作,显示错误/成功消息,成功后将用户重定向到另一个页面,或者只是隐藏表单并显示成功消息。

对于ajax表单提交,我建议您使用JQuery Form plugin。它非常易于使用,并支持不同的数据类型,如json,xml和html。在示例页面上,然后列出了工作代码,以便您可以轻松采用它。

答案 2 :(得分:0)

您没有显示JavaScript验证码。

麻烦的是,您将首先在JavaScript中执行相同的检查,然后在PHP中执行相同的检查。如果由于某种原因验证函数不匹配,结果可能不一致。

我的建议是:

1)如果您不打算支持禁用JavaScript的浏览器,只需删除PHP验证

即可

2)如果你想支持无脚本浏览器,你应该检测到JS被禁用并警告用户在验证后表单可能会被拒绝(填写一个长表单只是为了获取它真的很令人沮丧提交后出错)

如果您同时支持这两种验证,则应尽最大努力获得对称验证码,使用相同的regexp并以相同的顺序进行检查。

在JS和PHP之间共享代码并不容易,但您可以设计一种通用格式来验证字段,并让JS和PHP验证引擎使用相同的字段定义。
这将是最一致的方法,但它是很多工作,所以如果你只有一个表单来验证它可能不值得努力。

编辑:回答您的其他评论和问题

为了便于使用,动态获取JavaScript检查表单数据要好得多。它允许用户在提交表单之前知道所有正确的信息 PHP验证会生成一个错误页面并强制用户返回到表单页面,并且(取决于浏览器)可能会重新键入整组信息,除非您添加了一些PHP代码来填充以前值的字段。

只有在JavaScript被禁用或者您想要阻止恶意提交时(即某些黑客在不使用您的表单的情况下模拟帖子请求),您才应该使用PHP验证。

关于支持无脚本浏览器,我会说90%的现代网站无法正常工作(或提供糟糕的用户体验),禁用JavaScript和/或cookie,所以这不会是一个大问题恕我直言。
这完全取决于您的目标受众群体。