这可以成为净化用户输入的有效且可靠的方法吗?

时间:2009-04-27 11:06:12

标签: php validation

我想知道如何设置一个聪明的方法让我的所有输入'干净',这是一个在我的每个脚本开始时运行的程序。 我想创建一个类来做,然后在每个输入的开头添加一个2个字母的前缀来标识输入的类型,例如:

in-mynumber
tx-name
ph-phone
em-email

所以,在我的脚本顶部我只运行一个函数(例如):

function cleanInputs(){
    foreach($_GET AS $taintedKey => $taintedValue){
        $prefix = substr($taintedKey, 0, 2);
        switch($prefix){
            case 'in':
                //I assume this input is an integer
                $cGet[$taintedKey] = intval($taintedValue);
                break;
            case 'tx':
                //i assume this input is a normal text
                //can contains onely letters, numbers and few symbols
                if(preg_match($regExp, $taintedValue)){
                    $cGet[$taintedKey] = $taintedValue;
                }else{
                    $cGet[$taintedKey] = false;
                }
                break;
            case 'em':
                //i assume this input is a valid email
                if(preg_match('/^[a-zA-Z0-9-_.]+@[a-zA-Z0-9-_.]+.[a-zA-Z]{2,4}$/', $taintedValue)){
                    $cGet[$taintedKey] = $taintedValue;
                }else{
                    $cGet[$taintedKey] = false;
                }
                break;
        }
    }
}

..所以我将创建其他2个数组,$ cGet和$ cPost分别使用$ _GET和$ _POST的干净数据,在我的脚本中我会查看使用这些数组,完全忘记$ _GET / $彦博 我甚至考虑添加第二个前缀来确定输入的最大长度...例如:     TX-25-名 ..但我不太确定这一点..如果我采取这种方式,也许OOP方法会更好。

你怎么看? 看起来是个好用的方法吗?

否定点表明我实际上可以看到(我还没有用过这种方式,这只是今天早上的奇迹) 1.如果我希望我的申请不受限制,那么前缀和程序必须很多; 2.我发送的变量名称会变得更长(但我们说的是3-6个字符,不应该是个问题)

任何建议都非常感谢!

修改

我不是要重新发明轮子,我的帖子不是关于消毒输入的问题,而是关于做这件事的程序。我使用htmlpurifier来清除html数据中可能的xss注入,当然我使用参数化查询。我只是想知道是否更好地接受输入输入,或者在开始时对它们进行全部清理,并认为它们在脚本的其余部分中是干净的。 我认为的方法不是奇迹,也不是太阳下的新东西,但我认为截断输入如果不是我方面的格式,可以是有用的......

为什么在'name'字段中检查sql注入,该字段必须只包含字母和撇号char? 只需删除不是letter或apostophe的每一个,为最后一个添加斜杠,然后运行参数化查询。 然后,如果您展示电子邮件,只需删除不是电子邮件的所有内容..

3 个答案:

答案 0 :(得分:2)

有许多well-made PHP tested classes已经消毒了输入。为什么要另一个呢?此外,清理输入不仅仅是验证数据类型。它意味着检查sql注入,xss攻击等......

答案 1 :(得分:0)

你想做什么?如果您需要清理输入以将数据保存到数据库,那么没有比参数化查询更好的了。

有关示例,请参阅this

答案 2 :(得分:0)

这个想法本身很好,但我想知道它是否真的非常有用。

首先,SQL注入和HTML注入可以(应该)以另一种方式受到保护。参数化查询阻止了SQL注入(这是必须拥有的日期和年龄); htmlspecialchars()方法阻止了HTML注入,在将字符串输出到用户之前,应该将其称为。不要将编码的字符串存储在数据库中(或者更糟糕的是) - 一接收就对它们进行编码。与他们合作将是一个地狱。

除了这两次注射攻击外,你的方法会做什么?好吧,它可以为数字,电话号码,电子邮件,姓名和日期之类的东西做一些正则表达式。但那是关于它的。不幸的是,这只是您必须做的所有验证的一部分。您无法验证的其他常见情况是交叉检查输入(结束日期之前的开始日期),并检查值是否在允许的预定义值列表中(例如,对于<select>元素)。您的应用程序中还有无数的自定义验证步骤。是否值得在“泛型类型验证”和“自定义规则验证”中拆分所有验证?我不知道。也许。或许这只会造成更大的混乱。