Php 没有 create_function 和 eval 的干净数据
Php clean data without create_function and without eval
我正在尝试创建一个 class 来清理品牌数据,然后再将其添加到我的数据库中。
如您所见,我添加了通用过滤器(可以在其他地方使用)。另一方面,一些领域将需要个性化清洁。这就是我在数组中创建 'function' 的原因。
我的代码目前可以正常运行,但是 create_function
函数已被弃用,我想删除它,但如果不使用 eval
.
,我找不到替代方案
你能帮我找到解决办法吗?谢谢。
<?php
class VehMarques
{
private static $fields_allowed = [
'_id' =>
[
'instanceof' => '\MongoDB\BSON\ObjectID',
],
'name' =>
[
'function' => 'if(!isset($name) && !isset($age)){return false;}',
],
'user' =>
[
'required',
'instanceof' => '\MongoDB\BSON\ObjectID',
],
'centre' =>
[
'required',
'instanceof' => '\MongoDB\BSON\ObjectID',
],
'time' =>
[
'instanceof' => 'MongoDB\BSON\UTCDateTime',
],
];
public static function add(array $fields)
{
$fields_options=array();
foreach(self::$fields_allowed as $key => $val)
{
foreach($val as $key1 => $val1)
{
if(in_array($val1, array('required')))
{
$fields_options[$val1][$key] = null;
}
else
{
$fields_options[$key1][$key] = $val1;
}
}
}
if(!empty(self::$fields_allowed) && !empty(array_diff_key($fields, self::$fields_allowed)))
{
return false;
}
if(!empty($fields_options['function']))
{
foreach($fields_options['function'] as $func)
{
$func = preg_replace('/$([a-zA-Z0-9]+)/', '$fields[\'\']', $func);
if(create_function('$fields', $func)($fields) === false)
{
return false;
}
}
}
if(!empty($fields_options['required']) && !empty(array_diff_key($fields_options['required'], $fields)))
{
return false;
}
if(!empty($fields_options['instanceof']))
{
foreach($fields_options['instanceof'] as $key => $val)
{
if(!($fields[$key] instanceof $val))
{
return false;
}
}
}
if(!isset($fields['_id']))
{
$fields['_id'] = new \MongoDB\BSON\ObjectID();
}
if(!isset($fields['time']))
{
$fields['time'] = new MongoDB\BSON\UTCDateTime();
}
return true;
}
}
$insert_marque = array(
'_id' => new \MongoDB\BSON\ObjectID(),
'name' => 'Test',
'user' => new \MongoDB\BSON\ObjectID(),
'centre' => new \MongoDB\BSON\ObjectID(),
'time' => new MongoDB\BSON\UTCDateTime()
);
var_dump(VehMarques::add($insert_marque));
?>
切勿使用可以从字符串创建可执行代码的函数的 eval。这是非常糟糕的做法。
改为使用回调:
class VehMarquesValidator
{
private $callbacks = [];
public function __construct()
{
$this->callbacks = [
[$this, 'validateVehMarques']
];
}
public function validate(array $fields)
{
foreach ($this->callbacks as $callback) {
if (!call_user_func($callback, $fields)) {
return false;
}
}
return true;
}
private function validateVehMarques(array $fields)
{
if(isset($fields['name'])) {
return true;
}
if(isset($fields['age'])) {
return true;
}
return false;
}
}
$validator = new VehMarquesValidator();
var_dump($validator->validate([
'name' => 'Test'
]));
var_dump($validator->validate([
'no_name' => 'Test'
]));
尽量避免使用静态方法。这也是不好的做法。
我正在尝试创建一个 class 来清理品牌数据,然后再将其添加到我的数据库中。
如您所见,我添加了通用过滤器(可以在其他地方使用)。另一方面,一些领域将需要个性化清洁。这就是我在数组中创建 'function' 的原因。
我的代码目前可以正常运行,但是 create_function
函数已被弃用,我想删除它,但如果不使用 eval
.
你能帮我找到解决办法吗?谢谢。
<?php
class VehMarques
{
private static $fields_allowed = [
'_id' =>
[
'instanceof' => '\MongoDB\BSON\ObjectID',
],
'name' =>
[
'function' => 'if(!isset($name) && !isset($age)){return false;}',
],
'user' =>
[
'required',
'instanceof' => '\MongoDB\BSON\ObjectID',
],
'centre' =>
[
'required',
'instanceof' => '\MongoDB\BSON\ObjectID',
],
'time' =>
[
'instanceof' => 'MongoDB\BSON\UTCDateTime',
],
];
public static function add(array $fields)
{
$fields_options=array();
foreach(self::$fields_allowed as $key => $val)
{
foreach($val as $key1 => $val1)
{
if(in_array($val1, array('required')))
{
$fields_options[$val1][$key] = null;
}
else
{
$fields_options[$key1][$key] = $val1;
}
}
}
if(!empty(self::$fields_allowed) && !empty(array_diff_key($fields, self::$fields_allowed)))
{
return false;
}
if(!empty($fields_options['function']))
{
foreach($fields_options['function'] as $func)
{
$func = preg_replace('/$([a-zA-Z0-9]+)/', '$fields[\'\']', $func);
if(create_function('$fields', $func)($fields) === false)
{
return false;
}
}
}
if(!empty($fields_options['required']) && !empty(array_diff_key($fields_options['required'], $fields)))
{
return false;
}
if(!empty($fields_options['instanceof']))
{
foreach($fields_options['instanceof'] as $key => $val)
{
if(!($fields[$key] instanceof $val))
{
return false;
}
}
}
if(!isset($fields['_id']))
{
$fields['_id'] = new \MongoDB\BSON\ObjectID();
}
if(!isset($fields['time']))
{
$fields['time'] = new MongoDB\BSON\UTCDateTime();
}
return true;
}
}
$insert_marque = array(
'_id' => new \MongoDB\BSON\ObjectID(),
'name' => 'Test',
'user' => new \MongoDB\BSON\ObjectID(),
'centre' => new \MongoDB\BSON\ObjectID(),
'time' => new MongoDB\BSON\UTCDateTime()
);
var_dump(VehMarques::add($insert_marque));
?>
切勿使用可以从字符串创建可执行代码的函数的 eval。这是非常糟糕的做法。
改为使用回调:
class VehMarquesValidator
{
private $callbacks = [];
public function __construct()
{
$this->callbacks = [
[$this, 'validateVehMarques']
];
}
public function validate(array $fields)
{
foreach ($this->callbacks as $callback) {
if (!call_user_func($callback, $fields)) {
return false;
}
}
return true;
}
private function validateVehMarques(array $fields)
{
if(isset($fields['name'])) {
return true;
}
if(isset($fields['age'])) {
return true;
}
return false;
}
}
$validator = new VehMarquesValidator();
var_dump($validator->validate([
'name' => 'Test'
]));
var_dump($validator->validate([
'no_name' => 'Test'
]));
尽量避免使用静态方法。这也是不好的做法。