用户输入验证,客户端还是服务器端?[PHP/JS]

5
在将用户输入发送到服务器之前,使用JS还是PHP在服务器端进行验证更好?或者为了安全起见,两者都值得做吗?
我正在创建一个网站(目前非常简单),其中有成员区域/管理区域等。目前,我只有用户名和密码的用户输入,在未来会有更多内容(电子邮件、地址等),但检查数据的最佳实践是什么?
我是否应该对其进行大量的“if...else”语句,直到用户弄清楚为止?或者为每个用户输入的值设置单独的变量,并在正确或错误时将其设置为true或false?(例如电子邮件验证以确保其为电子邮件格式)
有很多方法可以做到这一点,但你会建议哪些方法?如果有10行代码就能完成工作,我不想写50行代码...如果这有意义的话 :p 任何帮助将不胜感激,谢谢! :)
6个回答

11

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

如果您仅使用客户端验证,则不良人士可能会利用漏洞攻击您的系统,发布未经验证的内容 - 破坏您的脚本,并可能利用您的系统。从安全角度来看,这非常糟糕。

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

因此,如果可能的话,请两者兼备。如果不能或不想这样做,则至少进行服务器端验证。仅使用客户端验证是灾难性的!


5

两全其美。

客户端可以提供用户所期望的响应性,而服务器端则可以保护您的数据。

我相信PHP有一些库可以帮助您,就像ASP.NET MVC提供了一种同时实现这两个目标的方法一样。


4

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

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


0

验证,一定要在服务器端进行。我可以在客户端篡改您的表单并填写疯狂的值,仍然可以得到验证。但我无法篡改服务器端的脚本。

因此,在进行客户端检查时,您只是节省了与服务器“通信”的一点时间。永远不要使用它来真正验证您的数据。


2
让我想知道你的职业是什么 ;) 不过我明白你的意思,我最好在网站上线之前确保验证所有内容。 - Shogun

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

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']]:''));
    }

}


我从未真正考虑过这种方式,似乎这是一种非常简单的生成和验证表单的方法,谢谢回复 :) - Shogun

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接