【问题标题】:Validate received values before using them在使用它们之前验证接收到的值
【发布时间】:2013-12-23 22:05:43
【问题描述】:

验证接收到的参数是否有意义,该参数仅用作比较器?

假设我收到了用户的电子邮件地址,我想检查它是否存在于数据库中。

我可以先检查它是否真的是一个电子邮件地址,然后尝试在数据库中找到它。例如:

$email = trim($_POST["email"]);

if (isEmail($email)) {
   if (isRegisteredEmail($email)) { // Will execute a SQL query
      echo "Email address registered";
   }
   else {
      echo "Email address is not registered";
   }
}
else {
   echo "This is not an email address";
}

或者我可以简单地做这样的事情:

if (isRegisteredEmail(trim($_POST["email"])) { // Will execute a SQL query
   echo "Email address registered";
}
else {
   echo "Email address is not registered";
}

我相信这可能更像是一个用户体验问题,但是......

【问题讨论】:

  • 这取决于您的系统是如何完成的以及“电子邮件”地址的用途。就个人而言,我会在电子邮件上进行验证,是的。

标签: php post get verification


【解决方案1】:

实际上,这取决于您的客户“谁为您的工作付费”的要求。

但通常是的,您应该验证所有内容。如果您不关心用户发送给您的内容,可能会发生很多奇怪的事情。我的意思是,在您的情况下,例如可以在数据库中插入多个电子邮件地址,如果这是一个时事通讯应用程序,则给定的用户可能会收到多封邮件。这可能很烦人且不专业。他们可以认为这是垃圾邮件。一般来说,做任何看起来像垃圾邮件的事情都是不好的。他们也可以将您的服务器列入黑名单,拒绝有效的邮件通信。

否则,输入验证是系统中的第一道防线。如果您正确验证所有内容,您可以拒绝许多不同的攻击。 (不同类型的注入技术、跨站脚本等)

【讨论】:

  • 你误会了。正如我在第一条评论中提到的,如果我要保存一些电子邮件,我会检查“它真的是电子邮件吗......?” ,但是如果我只需要知道这封邮件是否在我的数据库中呢?我是否必须再次检查它是否是电子邮件,然后“SELECT COUNT() FROM table WHERE email = ?;”或者我将选择每个收到的字符串(当然使用准备好的语句是安全的)
  • 根据您的情况,检查输入是否真的像电子邮件是值得的。您可以保存数据库查询。在这种情况下,您可能还必须关心 sql 注入。 3. 您的问题的一个方面可以是标准化来自用户用户的电子邮件地址。我的意思是删除空格,使它们小写。关键是要避免准重复。
【解决方案2】:

您将如何检查它是否已注册?

如果您使用 SQL 查询进行检查,并且 $email 来自不受信任的来源,则应在将其用于任何 SQL 查询之前对其进行过滤以防止 SQL 注入攻击。

所以在这种情况下是的,在调用 SQL 以查看它是否已注册之前,您必须验证它是一个有效或合理有效的电子邮件地址。

如果您正在查找它是否通过简短列表注册,例如从您的初始化文件中注册,那么没有,您不需要检查它。

【讨论】:

  • 我使用的是 SQL 准备好的语句,所以没关系。我的问题是,如果我必须检查“是的,那是电子邮件地址”或“那是用户的昵称”,而不仅仅是空字符串(例如)
【解决方案3】:

您实际上无法检查电子邮件是否有效(因为它属于该人或存在),但您可以检查它是否符合电子邮件标准。我将使用filter_var 函数来执行此操作,如下所示;

 if (filter_var($email, FILTER_VALIDATE_EMAIL)) {
      // Email conforms
 } else {
      // Email does not conform
 }

为了防止验证电子邮件的所有权,您可以要求用户首先通过向他们注册帐户的电子邮件地址发送唯一代码来验证它。为了让他们激活帐户,他们需要这个唯一的代码,该代码当然会发送到他们的电子邮件中。

另一种方法是向电子邮件发送一个随机密码,以便他们首次登录该帐户,然后强制他们在首次登录时更改密码。

下面的内容就是它的工作原理

$email = $_POST['email'];

if (filter_var($email, FILTER_VALIDATE_EMAIL)) {
      // Mysql query here for email matches
      // Check row count
      if ($rowCount) {
          echo 'Email is taken';
      } else {
          // Sign up the email sending them a random code
          echo 'We have sent a unique code to your email address which you need to enter at the address...';
      }
 } else {
      // Email does not conform
      echo 'The email you supplied is invalid';
 }

当然,您需要将发送电子邮件地址的代码存储在数据库中。我通常将它存储在登录次数中作为负值,并使用它来比较它,从而为自己节省一个数据库列。

希望这会有所帮助。

【讨论】:

  • 感谢您的评论,但我知道所有这些事情,我问的是不同的事情。另一种解释。如果我只需要知道是否使用了电子邮件地址(我将使用 SELECT ...),我应该检查用户是否向我发送了真正的电子邮件地址,还是可以检查数据库中的每个值?它不一定是电子邮件地址,也可以是昵称,在这种情况下,检查 if(!empty($_GET["nickname"])) 很重要,然后选择...?
【解决方案4】:

如果您想检查有效的电子邮件格式,您可以轻松使用 HTML 5 电子邮件字段。

http://www.w3schools.com/html/tryit.asp?filename=tryhtml5_input_type_email

它将检查诸如 name@something.com 之类的格式

或者你必须使用正则表达式。 这可能会有所帮助 How to validate an Email in PHP?

【讨论】:

  • 是的,但是如果我不通过 HTML 表单发送电子邮件/数据怎么办?
  • 如果你只需要检查邮箱地址是否注册,那么你不需要检查它是否是一个有效的邮箱。您可以使用 mysql_real_escape_string 来清理输入。
猜你喜欢
  • 1970-01-01
  • 2021-07-08
  • 2016-03-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-22
  • 2022-11-10
  • 2018-03-15
相关资源
最近更新 更多