【问题标题】:Should I re-validate form inputs in php that are already validated in javascript我是否应该重新验证已经在 javascript 中验证的 php 中的表单输入
【发布时间】:2015-06-26 20:36:09
【问题描述】:

我了解 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 中以 AGAIN 形式输入的输入类型?还是在服务器端使用 htmlentities 就足够了,而在客户端使用正则表达式验证?

非常感谢任何信息!

谢谢,艾尔

【问题讨论】:

  • 是的,用户可以改变你js的行为或者禁用js
  • @madalinivascu 他们只能改变我的 js 的行为,而不是其他人,对吗?然后我会假设这个用户是一个恶意用户,我现在不应该只担心使用 htmlentities 来防止我的网站出现漏洞吗?
  • 考虑如果用户在浏览器上禁用 javascript,您的输入将未经验证发送
  • @madalinivascu 好的,谢谢,看来我也会在服务器端进行验证!

标签: javascript php jquery regex


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    您需要考虑的是回退 - 如果用户关闭 JavaScript 会怎样?我曾经提供过一个简洁的 Jquery 来解决问题 - 只是它对间歇性客户不起作用。

    您应该始终清理来自服务器端的表单输入。 否则你很容易让自己暴露在漏洞面前。

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

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

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        【解决方案4】:

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

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

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

        <form name='frm'>
        

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

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

        【讨论】:

          【解决方案5】:

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

          【讨论】:

            【解决方案6】:

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

            【讨论】:

            • 我已经在 javascript 中对它们进行了验证,因此使用相同的正则表达式在我的 php.ini 中创建验证不会太困难。我要验证的字段是上面的,然后是一些。
            猜你喜欢
            • 2011-07-11
            • 1970-01-01
            • 2020-06-21
            • 1970-01-01
            • 2022-01-04
            • 1970-01-01
            • 2020-09-25
            • 2014-04-24
            • 1970-01-01
            相关资源
            最近更新 更多