我应该重新验证已经在javascript中验证的php中的表单输入

时间:2015-04-20 08:12:46

标签: javascript php jquery regex

据我所知,javascript验证仅用于客户端的目的,并将漏洞排除在服务器端之外,我需要验证php中输入的安全性。

我已经验证了用户可以从客户端(使用javascript)在表单中输入哪些类型的输入,如下例所示:

if(/^([\w-]+(?:\.[\w-]+)*)@((?:[\w-]+\.)*\w[\w-]{0,66})\.([a-z]{2,6}(?:\.[a-z]{2})?)$/i.test(document.getElementById(idName).value)){
    return true;
}else{
    return false;
}

我已经测试过在php中的表单输入上完成了以下测试:

$fname = $lname = $saddress = $city = $state = $zip = $email = "";
if ($_SERVER["REQUEST_METHOD"] == "POST") {
    $fname = test_input($_POST["fname"]);
    $lname = test_input($_POST["lname"]);
    $saddress = test_input($_POST["saddress"]);
    $city = test_input($_POST["city"]);
    $state = test_input($_POST["state"]);
    $zip = test_input($_POST["zip"]);
    $email = test_input($_POST["email"]);
}

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

我是否还需要使用正则表达式重新验证用户能够以何种格式在PHP中输入哪些类型的输入?或者在客户端使用正则表达式验证时,在服务器端使用htmlentities就足够了吗?

非常感谢任何信息!

谢谢,Al

6 个答案:

答案 0 :(得分:5)

始终验证服务器端的所有内容。由于每个人都可以使用Findbugs或Chrome工具等工具通过浏览器更改您的javascript客户端代码,因此仅使用Javascript进行验证并不安全。

您在客户端验证的只是为用户提供更好的体验。

答案 1 :(得分:1)

您需要考虑的是退回 - 如果用户关闭JavaScript会怎么样?我有过这样的场合,我提供了一个整齐的Jquery来解决一个问题 - 只是因为它不适用于间歇性客户端。

您应该始终清理服务器端输入的表单输入。 否则,你可能很容易让自己处于漏洞状态。

PHP的过滤功能可以帮助您过滤/清理输入: http://php.net/manual/en/book.filter.php

至于正则表达式 - 考虑您是否需要在服务器端,它有一个您可能不需要的高开销 - 只要您正在清理输入并处理所有可能的错误。

答案 2 :(得分:1)

无论您在客户端使用何种验证,都应该始终验证服务器端的输入。用户可以在技术上向服务器发送任何内容并执行一些SQL注入或以其他方式发送错误或不允许的数据。

仅使用javascript帮助用户填写正确的内容(例如,如果他们输入了无效的电子邮件地址,立即通知他们)。

答案 3 :(得分:1)

是的,您必须完成服务器端验证。你不能相信JavaScript验证。因为javascript是在浏览器中运行的。因此用户可以控制它。也可以在浏览器上禁用javascript。在这种情况下,它将跳过验证。一个简单的例子我见过许多人使用这样的东西

 <form  name='frm' onSubmit='return validate();'>

使用检查工具可以将其更改为

<form name='frm'>

然后它会跳过客户端验证。

(客户端+服务器)验证需要更多时间。但是当你考虑安全性时,它并不重要。

答案 4 :(得分:0)

正如其他答案中所提到的,用户可以轻松绕过JS验证并直接发布到服务器,为此,只在服务器端验证表单,它会为您节省一些代码,但与此同时#&# 39;我需要节省更多的服务器资源。

答案 5 :(得分:-1)

是的,您还使用服务器端验证来验证输入。 请告诉我你想在服务器上验证哪个字段。