【问题标题】:"ghost" form submissions“幽灵”表单提交
【发布时间】:2009-11-13 00:37:10
【问题描述】:

我有一个使用 PHP 的 3 部分注册表单:

page 1 : collects info - has client & server side validation (for blank and invalid fields)
page 2 : collect more info - has server side validation (for blank and invalid fields)
page 3 : saves (db) and sends (email) the registration information

更多信息:

page 1 : saves all form information into session[registration] before going to page 2
page 2 : redirects to page 1 if session[registration][email] is blank
page 3 : redirects to page 1 if session[registration][email] is blank; destroys session after registration is successful

这在过去几个月一直运行良好,直到昨天,大约 25 封电子邮件发送给我,每封电子邮件间隔几秒钟。我还检查了数据库并保存了这些注册。并且注册信息都是空白的(除了自动生成的字段,比如date_added)

我很困惑,因为由于重定向,电子邮件发送和数据库保存不应该工作。

你知道刚刚发生了什么吗?

谢谢

【问题讨论】:

  • 如果您发布了实际代码,我们或许可以为您提供帮助。大多数情况下,人们认为他们做得对。
  • 我设法通过在第 3 页中添加对电子邮件地址的正则表达式检查来解决此问题。问题是我只是检查了会话 [注册] [电子邮件] 是否已设置,但没有t 检查它是否有效。感谢您的所有回复:)

标签: php security validation forms


【解决方案1】:

在将数据字段插入数据库之前,您如何检查它们是否为空白。确保使用 empty() 检查该字段是否为空白。如果您使用字符串比较运算符(即 if ($str != "") ),如果 $str 的值为 false、null、0 等,可能会导致意外结果...

编辑: 手册中的empty()描述:http://us.php.net/manual/en/function.empty.php 返回值

如果 var 具有非空且非零值,则返回 FALSE。

以下的东西被认为是空的:

* "" (an empty string)
* 0 (0 as an integer)
* "0" (0 as a string)
* NULL
* FALSE
* array() (an empty array)
* var $var; (a variable declared, but without a value in a class)

编辑2:

isset() 只检查变量是否被赋值。如果变量包含空字符串,isset() 将返回 true,因为即使是空字符串也有值('\0' 标记 php 中字符串的结尾)。

isset() 手册中的描述:http://us3.php.net/manual/en/function.isset.php

如果测试已设置为 NULL 的变量,

isset() 将返回 FALSE。另请注意,NULL 字节(“\0”)不等同于 PHP NULL 常量。

来自手册的评论:

isset 不能可靠地评估带有空白字符串(不一定为 NULL)的变量。 IE。 $blankvar = ""; // isset 将在此返回 true。

在处理向脚本返回空白文本字段的 HTML 表单时,这是一个非常常见的陷阱。你最好这样做:

如果 ($var != "") 返回真; 别的 返回错误;

这更多的是一种编程习惯而不是函数的缺点。因此,如果您有初始化变量的习惯,如果您的代码或 php 项目变得非常大,您可能会遇到 isset() 问题。

【讨论】:

  • 我使用 isset($var) 检查电子邮件是否已设置。如果没有,请转到第 1 页。在这种情况下使用 isset() 好吗?
  • 不,isset() 只检查变量是否被赋值。如果变量包含空字符串,isset() 将返回 true,因为即使是空字符串也有值('\0' 标记 php 中字符串的结尾)。 isset() 来自手册:us3.php.net/manual/en/function.isset.php isset() 如果测试已设置为 NULL 的变量,将返回 FALSE。另请注意,NULL 字节(“\0”)不等同于 PHP NULL 常量。
【解决方案2】:

问题肯定在第 3 页。作为有根据的猜测,我会说,您的“空白”检查是否有缺陷。

你应该使用 ie。一个很好的正则表达式来测试电子邮件是否有效,并确保在检查字段长度之前删除空格(即 - 空格与空/空白字段不同)

【讨论】:

  • 正则表达式很好。我已经尝试了我能想到的所有可能的错误电子邮件地址/字符串,包括空白支票。
  • 顺便说一句,我的正则表达式在第 1 页。在第 3 页: if(!isset($_SESSION['registration']['email'])) { header('Location: register. php'); }
【解决方案3】:

是否所有这些电子邮件都是由爬取您网站的机器人生成的?

您能否通过在您的任何页面上调用 curl 来重现该问题?

是否有任何操作需要 POST,或者您是否使用 GET 进行操作?

【讨论】:

  • 哇,我可以通过在第 3 页调用 curl 来重现它。为什么它会起作用?当脚本注意到 session[registration][email] 未定义时,脚本不应该将“curl”重定向到第 1 页吗?
  • 不,我的脚本中没有 GET。所有 POST 和 SESSION。是的,它可能是一个机器人。
猜你喜欢
  • 2014-07-08
  • 1970-01-01
  • 2017-08-08
  • 1970-01-01
  • 1970-01-01
  • 2018-06-16
  • 1970-01-01
  • 2011-07-09
  • 1970-01-01
相关资源
最近更新 更多