我想知道如何设置一个聪明的方法让我的所有输入'干净',这是一个在我的每个脚本开始时运行的程序。 我想创建一个类来做,然后在每个输入的开头添加一个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的每一个,为最后一个添加斜杠,然后运行参数化查询。 然后,如果您展示电子邮件,只需删除不是电子邮件的所有内容..
答案 0 :(得分:2)
有许多well-made PHP tested classes已经消毒了输入。为什么要另一个呢?此外,清理输入不仅仅是验证数据类型。它意味着检查sql注入,xss攻击等......
答案 1 :(得分:0)
你想做什么?如果您需要清理输入以将数据保存到数据库,那么没有比参数化查询更好的了。
有关示例,请参阅this。
答案 2 :(得分:0)
这个想法本身很好,但我想知道它是否真的非常有用。
首先,SQL注入和HTML注入可以(应该)以另一种方式受到保护。参数化查询阻止了SQL注入(这是必须拥有的日期和年龄); htmlspecialchars()
方法阻止了HTML注入,在将字符串输出到用户之前,应该将其称为。不要将编码的字符串存储在数据库中(或者更糟糕的是) - 一接收就对它们进行编码。与他们合作将是一个地狱。
除了这两次注射攻击外,你的方法会做什么?好吧,它可以为数字,电话号码,电子邮件,姓名和日期之类的东西做一些正则表达式。但那是关于它的。不幸的是,这只是您必须做的所有验证的一部分。您无法验证的其他常见情况是交叉检查输入(结束日期之前的开始日期),并检查值是否在允许的预定义值列表中(例如,对于<select>
元素)。您的应用程序中还有无数的自定义验证步骤。是否值得在“泛型类型验证”和“自定义规则验证”中拆分所有验证?我不知道。也许。或许这只会造成更大的混乱。