【问题标题】:Server Side Validation/Programming and Design服务器端验证/编程和设计
【发布时间】:2014-03-01 11:35:54
【问题描述】:

我已经坚持了一段时间了。我有一个位于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")
?>

感谢大家的帮助。如果我正在对其进行消毒并错误地验证它,有人会介意以我的一个输入为例给我一个示例,说明它的外观吗?我可以使用帮助,因为这有点令人困惑。再次感谢!

【问题讨论】:

标签: php forms validation sanitization


【解决方案1】:

您肯定想要验证服务器端(在 javascript 中进行验证根本不会保护您的数据!) 在任何情况下,您都应该让用户输入表单数据,发布,验证它,如果有错误,让您的 php 重新编写表单并填写现有数据(因此用户不必再次输入)和针对有错误的条目的消息。

即类似于:(非常简单!)

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

你的, 托尼威尔克

【讨论】:

  • 非常感谢。这正是我所需要的。
【解决方案2】:

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

对于禁用 javascript,我将按照 Kuroi Neko 的说明进行操作。

关于 php 端验证和 javascript 验证,都可以保留,不会有问题。但是在今天的良好实践中,我认为您应该使用基于 ajax 的表单,这是一个不错的选择,而且如果发生错误,您也无需重新填充表单(我认为始终启用 javascript)。

您必须在服务器端使用用户无法绕过的 php 代码进行所有验证。通过 ajax 提交表单后,您可以验证那里的所有表单字段。如果有错误,则将错误消息返回给 ajax 请求并显示出来。如果没有错误,则对表单数据执行任何操作,然后将成功消息返回给 ajax 请求。

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

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

【讨论】:

  • 感谢您的信息。我将研究基于 ajax 的表单。据我所知,这听起来对用户和设计师来说是一种更好的体验。
【解决方案3】:

您没有显示您的 JavaScript 验证代码。

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

我的建议是:

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

2)如果你想支持无脚本浏览器,你应该检测到 JS 被禁用并警告用户表单可能在验证后被拒绝(填写长表单只是为了得到提交后报错)

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

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

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

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

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

关于支持无脚本浏览器,我想说 90% 的现代网站在禁用 JavaScript 和/或 cookie 的情况下将无法正常运行(或提供糟糕的用户体验),因此恕我直言,这没什么大不了的。
这完全取决于您所针对的受众群体。

【讨论】:

  • 感谢您的信息。我想支持那些启用了 Javascript 和没有启用 Javascript 的人。我不知道 Javascript 和 PHP 应该是一样的。我将重新调整我的 PHP 以匹配我的 Javascript。我是否按照我的做法对上述数据进行了清理和验证?非常感谢您的回复。
  • 我在 index.php 中有两个表格。一种供用户使用,一种供企业使用。我只是想让用户完成一项工作,然后我将致力于业务。
  • 不允许浏览器关闭 javascript 是否明智?
  • 不,这不明智(如果您在这里关注安全性)……用户仍然可以操作在打开 JS 的情况下发送的数据——而向您的服务器发送数据的客户端甚至不会必须是“浏览器”……
  • @CBroe 我就是这么说的。但是,如果目的是防止恶意帖子,则检查可能会更加残酷(即,您不必在输入无效的情况下表现得很好)。
猜你喜欢
  • 1970-01-01
  • 2023-03-12
  • 2011-05-30
  • 1970-01-01
  • 2012-09-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多