Php &引用;“鬼魂”;提交表格

Php &引用;“鬼魂”;提交表格,php,security,validation,forms,Php,Security,Validation,Forms,我有一个使用PHP的三部分注册表: 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 registr

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

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)

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

你知道刚才发生了什么事吗


谢谢

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

编辑: 手册中的空()说明: 返回值

如果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()手册中的说明:

如果测试已设置为NULL的变量,则isset()将返回FALSE。还请注意,空字节(“\0”)并不等同于PHP空常量

手册注释:

isset不能可靠地使用空字符串(不一定为NULL)计算变量。 即 $blankvar=”“;//isset将在这一点上返回true

这是处理将空白文本字段返回到脚本的HTML表单时常见的陷阱。你最好这样做:

如果($var!=“”) 返回true; 其他的 返回false


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

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

编辑: 手册中的空()说明: 返回值

如果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()手册中的说明:

如果测试已设置为NULL的变量,则isset()将返回FALSE。还请注意,空字节(“\0”)并不等同于PHP空常量

手册注释:

isset不能可靠地使用空字符串(不一定为NULL)计算变量。 即 $blankvar=”“;//isset将在这一点上返回true

这是处理将空白文本字段返回到脚本的HTML表单时常见的陷阱。你最好这样做:

如果($var!=“”) 返回true; 其他的 返回false


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

问题肯定在第3页。作为一个受过教育的猜测,我会说,你的“空白”-检查是否有缺陷


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

问题肯定在第3页。作为一个受过教育的猜测,我会说,你的“空白”-检查是否有缺陷


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

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

您可以通过在任何页面上调用curl来重现问题吗


是否有任何操作需要帖子,或者您正在使用GET进行操作?

是否所有这些电子邮件都可能是由爬行您的站点的机器人生成的

您可以通过在任何页面上调用curl来重现问题吗


是否有任何操作需要发布,或者您正在使用GET执行操作?

如果您发布了实际代码,我们可能会帮助您。大多数情况下,这个人都认为自己做得对。我在第3页的电子邮件地址上添加了一个regexp检查,成功地解决了这个问题。问题是,我只是检查会话[注册][电子邮件]是否已设置,而没有检查它是否有效。感谢您的回复:)如果您发布了实际代码,我们可能会帮助您。大多数情况下,这个人都认为自己做得对。我在第3页的电子邮件地址上添加了一个regexp检查,成功地解决了这个问题。问题是,我只是检查会话[注册][电子邮件]是否已设置,而没有检查它是否有效。谢谢你的回复:)哇,我在第3页打电话给curl就可以重现它了。它为什么起作用?当脚本注意到会话[注册][电子邮件]没有定义时,它不是应该将“curl”重定向到第1页吗?不,我的脚本中没有get。所有职位和会议。是的,它可能是一个机器人。哇,我在第3页通过调用curl可以复制它。它为什么起作用?当脚本注意到第1页时,不是应该将“curl”重定向到第1页吗