5

在将用户输入发送到使用 JS 的服务器或使用 PHP 的服务器端之前验证用户输入是否更好?或者,为了安全起见,两者都值得做?

我正在创建一个具有会员区/管理区/等的站点(目前非常简单)。目前我只有用户名和密码的用户输入,将来会有更多(电子邮件,地址等),但检查数据的最佳做法是什么?

在用户正确之前,我是否会向它抛出大量“if...else”语句?或者可能为用户输入的每个值设置单独的变量,如果正确或错误,将其设置为 true 或 false?(如电子邮件验证以确保它是电子邮件格式)

有很多方法可以做到这一点,但你会建议哪些?当我可以用 10 行代码完成这项工作时,我不想写 50 行代码……如果这有意义的话:p

任何帮助将不胜感激,谢谢!:)

4

6 回答 6

11

服务器端验证是必须的,客户端验证是加分项。

如果您只使用客户端验证,那么邪恶的人会入侵您的系统并发布未经验证的内容 - 破坏您的脚本,并可能利用您的系统。从安全的角度来看,这是非常糟糕的。

也就是说,您还应该包括客户端验证,因为这比往返服务器要快得多,并且可以为您的用户提供即时反馈。这将使您的用户满意,并使他们回到您的网站。

因此,如果可能,请同时使用两者。如果您不能/不会,那么至少在服务器端进行。仅客户端验证是灾难的根源!

于 2012-01-08T19:18:51.757 回答
5

两者都做。

客户端提供用户期望的响应能力,服务器端保护您的数据。

我确信 PHP 有一些库可以帮助您,就像 ASP.NET MVC 所做的那样,它提供了一种一步完成这两种操作的方法。

于 2012-01-08T19:18:57.840 回答
4

出于安全原因,输入验证当然应该在服务器端进行。

但是,为了避免向服务器发送包含无效数据的请求并将响应发送回客户端,最好也进行客户端验证。这将使您的网站更具响应性。因此,为用户友好性添加客户端验证。

于 2012-01-08T19:19:26.403 回答
0

验证,总是服务器端。我可以在客户端篡改您的表单并填写疯狂的值并仍然得到验证。我不能篡改服务器端脚本。

因此,在检查客户端时,您只需节省一点与服务器“交谈”的时间。切勿使用它来验证您的数据是否真实。

于 2012-01-08T19:20:42.243 回答
0

当然你不能只依赖 JavaScript,如果有人禁用了它怎么办?JavaScript 只是为了让网站对用户更加友好,并且他不必每次犯错时都等待服务器。服务器端是供你自己使用的,以免你的系统出错!

于 2012-01-08T19:20:51.350 回答
0

您应该在服务器端验证这一点。客户端验证是可选的。您可以声明字段的验证类型,并为您的表单构建通用验证器。如果您不知道我的意思,请尝试查看 AngularJs 声明式代码构建。它是构建表单的最佳方式,Angular 也是构建表单的良好且非常快速的框架。

http://angularjs.org/

http://docs.angularjs.org/#!/cookbook/advancedform

看看这行:

<input type="text" name="form.address.line1" size="33" ng:required/> <br/>
    <input type="text" name="form.address.city" size="12" ng:required/>,
    <input type="text" name="form.address.state" size="2" ng:required ng:validate="regexp:state"/>
    <input type="text" name="form.address.zip" size="5" ng:required
  validate="regexp:zip"/>

对于您的服务器端,您还可以定义一些结构,其中将包含表单字段、验证方法和每个字段的错误字符串。然后在循环中,根据您的信息结构验证每个字段。您可以轻松管理以这种方式构建的表单。

PHP 中的示例:

表格数据:

$formData = array (
    array(
     'ID' => "name",
     'validate' => '/.+/',
     'label' => 'Your name',
     'errorMsg' => "This field is required",
     'type' => 'text' 
    ),
 array(
         'ID' => "Phone number",
         'validate' => '/^[0-9+ ]+$/',
         'label' => 'Numer telefonu',
         'errorMsg' => "Please provide proper telephone number",
         'type' => 'text'
        )
);

验证器和表单生成器(对不起,这里的代码简单而混乱):

$s = '';
foreach ($formData as $input){
    $s .= sprintf('<label for="%s">%s</label>',$input['ID'],$input['label']);
    if (isset($_POST[$input['ID']]) && !empty($input['validate']) && !preg_match($input['validate'],$_POST[$input['ID']])){
        $error = true;
         $s .= sprintf('<div class="formErrorValidate">%s</div>',$input['errorMsg']);
    }
    if (isset($_POST[$input['ID']])) $htmlMsg = str_replace('%'.$input['ID'].'%',$_POST[$input['ID']],$htmlMsg);
    if ($input['type'] == 'textarea'){
        $s .= sprintf('<textarea name="%s" id="%s">%s</textarea>',$input['ID'],$input['ID'],(isset($_POST[$input['ID']])?$_POST[$input['ID']]:''));
    } else {
        $s .= sprintf('<input type="%s" name="%s" id="%s" value="%s"/>',$input['type'],$input['ID'],$input['ID'],(isset($_POST[$input['ID']])?$_POST[$input['ID']]:''));
    }

}

于 2012-01-08T19:21:03.580 回答