提交的“幽灵”形式

时间:2009-11-13 00:37:10

标签: php security validation forms

我有一个使用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封电子邮件,每封电子邮件的间隔时间很短。我还检查了数据库,并保存了这些注册。并且注册信息都是BLANK(除了自动生成的字段,如date_added)

我很困惑,因为重定向导致电子邮件发送和数据库保存不起作用。

你对刚刚发生的事情有什么想法吗?

由于

3 个答案:

答案 0 :(得分:2)

在将数据字段插入数据库之前,如何检查数据字段是否为空白。确保使用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)

EDIT2:

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

来自手册的

isset()说明:http://us3.php.net/manual/en/function.isset.php

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

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

来自手册的评论:

isset无法可靠地评估带有空字符串的变量(不一定是NULL)。 即 $ blankvar =“”; // isset将在此返回true。

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

if($ var!=“”) 返回true; 其他 返回false;

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

答案 1 :(得分:1)

这个问题绝对存在于第3页。作为一个有根据的猜测我会说,你的“空白” - 检查是否有缺陷。

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

答案 2 :(得分:1)

所有这些电子邮件都可能是由机器人抓取您的网站生成的吗?

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

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