我已经坚持了一段时间了。我有一个位于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")
?>
感谢大家的帮助。如果我正在消毒它并验证它是错误的,那么有人会介意给我一个例子,说明它应该如何使用我的一个输入作为例子吗?我可以使用帮助,因为这有点令人困惑。再次感谢!
答案 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,所以这不会是一个大问题恕我直言。
这完全取决于您的目标受众群体。