Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
<;的预匹配;?php,<;?,和/或?>;_Php_Regex_Preg Match - Fatal编程技术网

<;的预匹配;?php,<;?,和/或?>;

<;的预匹配;?php,<;?,和/或?>;,php,regex,preg-match,Php,Regex,Preg Match,我对正则表达式不是很熟悉,我正在试图找到一个preg_match正则表达式,用于在文件中搜索以下任何字符串,如果找到它,它将停止它。我已经有了fopen和fgets和fclose设置,我只需要在preg_匹配中为以下php标记使用正则表达式: 因此,如果preg_match返回1,则将跳过此文件而不上载它。我正在使用$\u FILES数组通过post上传它,所以我希望我可以使用$\u FILES['file']['tmp\u name']变量来读取文件 感谢您在这方面的帮助:) 编辑 if (

我对正则表达式不是很熟悉,我正在试图找到一个preg_match正则表达式,用于在文件中搜索以下任何字符串,如果找到它,它将停止它。我已经有了
fopen
fgets
fclose
设置,我只需要在preg_匹配中为以下php标记使用正则表达式:

因此,如果preg_match返回1,则将跳过此文件而不上载它。我正在使用$\u FILES数组通过post上传它,所以我希望我可以使用$\u FILES['file']['tmp\u name']变量来读取文件

感谢您在这方面的帮助:)

编辑

if (in_array('application/x-httpd-php', $files[$filid]['mimetypes']) && ($_FILES[$value]['type'][$n] == 'application/octet-stream' || $_FILES[$value]['type'][$n] == 'application/octetstream'))
{
    $file_extension = strtolower(substr(strrchr($_FILES[$value]['name'][$n], '.'), 1));

    if ($file_extension == 'php')
    {
        // Reading the current php file to make sure it's a PHP File.
        $fo = fopen($_FILES[$value]['tmp_name'][$n], 'rb');
        while (!feof($fo))
        {
            $fo_output = fgets($fo, 16384);

            // look for a match
            if (preg_match([REG EX HERE], $fo_output) == 1)
            {
                $php = true;
                break;
            }
        }
        fclose($fo);
    }
}
好的,我很抱歉,但实际上,我要做的是我需要找到一个PREG匹配。因为如果它是一个PHP文件,我需要在数据库中将MIME类型设置为:application/x-httpd-PHP。因为我还允许在某些情况下上传PHP文件。所以希望我上面发布的代码现在对你们大家都更有意义

有人能帮我做一个
preg\u match
regex吗?

/(?:)/
/(?:<\?(?!xml)|\?>)/

(15个字符)

如果要分析文件,请尝试以下操作:

function containsPhp($file) {
    if(!$content = file_get_contents($file)) {
        trigger_error('Not a file');
        return false;
    }
    foreach(token_get_all($content) as $token) {
        if(is_array($token) && in_array(current($token), array(T_OPEN_TAG, T_OPEN_TAG_WITH_ECHO))) {
            return true;                
        }
    }
    return false;
}

。。。除了检查php扩展(php、php5、phtml、inc等)之外,

\?>”听起来很奇怪。为什么需要它?所以您要拒绝任何包含
的文件?为什么?只是不要把它当作PHP文件来处理。那你怎么把它当作PHP文件来处理呢?问题是,我想知道这是否是一个实际的PHP文件上传。。。那就是我必须检查它的内部,对吗?他们总是可以更改文件扩展名,所以这对我没有任何帮助。。。我能想到的唯一方法是在文件中搜索
字符串。您无法确定它。你可以在里面找到很多这样的符号组合的JPEG。Nobosy这样做是因为它毫无意义。您可以将文件上载到非webroot目录,然后使用另一个php文件下载它(download.php?id=123)。只需使用readfile和类似
application/octet-stream
的内容类型。如果必须使用web目录,请使用
.htaccess
阻止php在该目录中执行。内容嗅探已经一次又一次地被证明不是一种可行的方法。无需测试
Ok,那么我将如何更改仅
字符串的内容嗅探?您只需删除中间块,留下/(?:)/@Matt:是的,但这就是操作的内容asked@kemp-严格来说,OP要求只匹配PHP tagsOk,我不知道这里发生了什么,但在将文件扩展名从.XML更改为.php之后,我使用这种方法上传了一个XML文件。所以这根本不起作用。当我上传其他文件,例如.zip文件时,我在页面顶部大约出现100次此错误:
警告:输入中出现意外字符:
中的:“”(ASCII=5)state=1,并且ASCII更改为每个错误相同的不同值,但所有错误都指向这一行:
foreach(token\u get\u all($content)作为$token){
这种方法糟透了。它获得了2张赞成票,这一事实令人难以置信,而且做这件事的人的投票也很糟糕。无意冒犯,但正如我所说,将文件名从.xml更改为.php会返回真实的结果!我从来没有见过一个实例使用token_get_all()我的测试用例基于3.php文件,其中包括
我的XML文件
\?>|<\?((?=php)|(?!\w))