我正在使用Zend的insert()
函数在数据库表中插入记录。例如。从数据库模型对象,我调用Zend_Db_Table's insert()
函数并将传入的数据作为数组传递 - $data
,即
$this->insert($data);
$data
是一个数组。$data
的内容是混合数据类型 - 整数,货币,文本等。
为了验证传入的$data
数组,我编写了一个函数 verifyData($data)
。
private function verifyData(&$data) {
//Trim whitespace characters from incoming data.
foreach($data as $key => $val)
{
$data[$key] = trim($val);
if(empty($data[$key])) {
unset($data[$key]);
}
}
//Checking for not null table columns
if( empty($data['id']) || empty($data['name']) || empty($data['age'])) {
error_log("One of the required fields is missing");
return false;
}
else {
return true;
}
}
如上所述,这个函数:
- 修剪传入数据并取消设置 $data 数组中的任何字段(如果它们为空)。
- 然后,此函数检查是否存在必填字段,如果缺少任何必填字段,则返回 false。在这个特定的定义中,id,姓名和年龄是必需的。但是,我可能还想验证其他非必填字段。例如$data["薪水"]
我需要帮助/建议,以任何其他可能的方式向上述函数添加以下验证:
- 我想在插入数据之前检查数组每个元素的数据类型是否符合预期/将其转换为特定数据类型。
- 我想转换/处理传入的数据,以便处理SQL注入的任何威胁。
处理数据类型检查的一种方法是循环访问传入的数据数组,并将特定列值转换为其数据类型并进行验证。但是我想找出是否有任何有效/标准的方式来实现上述两点。
一个示例场景是,例如在我的网络表单上,当新人添加到数据库时,我需要输入姓名、年龄和薪水,其中姓名和年龄是强制性的。年龄和工资应仅以整数形式输入。我想在php级别实现这个限制,我正在使用Zend Framework。
任何帮助/建议将不胜感激。
一种简单的开始方法是使用 Zend_filter_Input,它使用 Zend_Validation 和 Zend_Filter 对数据集应用筛选和验证。
//A simple exaample of how you might use Zend_Filter_Input
private function verifyData(&$data) {
//Add any filters you want there are many standard filters, order of filters may matter
$filters = array(
'*' => 'StringTrim', //trim all fields
'id' => 'Digits' //filter for digits on id field
);
//add any validators you want there are many standard validators, order of validators may matter
$validators = array(
'*' => 'NotEmpty' //check all fields for empty()
);
$input = new Zend_Filter_Input($filters, $validators, $data) {
if ($input->isValid() {
return TRUE;
} else {
return FALSE
}
}
不用说这是一个不完整的例子,说明它是如何工作的,但它应该给你一个基本的想法。有许多不同的方法可以完成验证,找到一个你喜欢的方法并去做.
我个人最喜欢的是在输入阶段(表单、控制器......)进行基本的过滤和验证,然后在将数据发送到要插入到数据库中的映射器之前,在域模型中应用任何其他过滤或验证><。
祝你好运。。。
标准过滤器
标准调节器
insert
应该已经解决了您可能遇到的任何SQL注入问题。至于类型检查和转换,PHP 中有几种方法可用。例如,检查并转换为int
:
if(ctype_digit($something)) {
$something = (int)$something;
}
这实际上取决于您所需的特定验证。