验证PHP文件仅包含内部数组

时间:2016-01-20 22:00:39

标签: php arrays regex validation security

我有一个配置.php文件,其中包含一个数组( 是一个PHP数组),其中包含类似于:

的内容
<?php
return array(
  'api_key'     => 'e3awY0HoZr0c6L0791Wl2dA3',
  'user'     => 'Lequis',
  'timeout'     => '4'
);

这些文件由用户上传,我想验证用户是否添加了任何恶意代码,因为这些文件只包含一个数组,我想验证它实际上只是一个数组

2 个答案:

答案 0 :(得分:-1)

编辑:请参阅@ VolkerK关于如何防范恶意代码注入的评论。

就像@Jay Blanchard所说,实际上想一个更合适的数据结构(如JSON)可能会更好。但是,如果您确实想要坚持这种结构,可以使用PHP的is_array()(http://php.net/manual/en/function.is-array.php)函数在尝试将该数组传递给任何其他函数之前验证变量是否为数组。

这只会验证你有一个数组,而不是你的数组格式正确。更进一步,您可以使用count()(http://php.net/manual/en/function.count.php)函数验证数组的大小是否合适,这两个组合将确保您拥有一个存储有正确数量值的数组数组。

检查数组值是否格式正确的问题是一个不同的野兽。您可以运行所有键并将传递的键与可接受键的数组进行比较,如下所示:

function isValidArr($usrArr){

$apiParams = array('api_key', 'user', 'timeout');

for($i = 0; i < count($usrArr); $i++ {
   if(!strcmp($usrArr[$i], $apiParams[$i])) {
    return false;
   }
  }
}

然后检查与每个键相关的值,我假设api_key具有特定长度或在一个范围内,所以你可以检查它。对于超时,您可以确保该值是整数。要对用户名进行验证,您可以实现正则表达式以确保该值符合特定格式。

答案 1 :(得分:-2)

我不确定你要检查什么,一个或多个数组?

如果是数组,那么,我认为你可以简单地使用is_array($arr) func。

如果是值,则有一个很好的Symfony组件SymfonyOptionsResolver

您可以将其用作值类型/值等的验证器。

public function configureOptions(OptionsResolver $resolver)
{
    // ...
    $resolver->setAllowedTypes('host', 'string');
    $resolver->setAllowedTypes('port', array('null', 'int'));
}

或者使用一些规范化器并使用preg_match检查值:

public function configureOptions(OptionsResolver $resolver)
{
    // ...

    $resolver->setNormalizer('host', function (Options $options, $value) {
        if ('http://' !== substr($value, 0, 7)) {
            $value = 'http://'.$value;
        }

        return $value;
    });
}

检查documentation以获取更多信息。

这就是你要找的东西吗?