2010-05-30 62 views
2

我不是很熟悉的正则表达式的,我试图找到搜索任何一个文件中的以下字符串的正则表达式的preg_match,如果发现它会阻止它。我已经有fopenfgetsfclose设置我只需要使用正则表达式一个的preg_match内以下PHP标签:的preg_match为<?PHP,<?, and/or ?>

<?php <? ?>

所以如果的preg_match返回1比这将跳过此文件,而不是上传它。我使用的$ _FILES数组通过后上传它,所以我希望我可以用$ _FILES [“文件”] [“tmp_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); 
    } 
} 

OK,我很抱歉,但实际上,我在做什么是我需要找到一个PREG匹配。因为如果它是一个PHP文件,我需要将数据库中的MIME TYPE设置为:application/x-httpd-php。因为我也允许在某些情况下上传PHP文件。所以希望我上面发布的代码对你现在更有意义。

有人可以请帮我一个preg_match正则表达式吗?

+0

听起来很奇怪。你为什么需要它? – 2010-05-30 15:45:44

+3

所以你要拒绝它有'<?php'任何文件,''?为什么?只是不要把它作为PHP文件来处理。 – Gumbo 2010-05-30 15:50:31

+0

你如何处理它作为PHP文件?问题是我想知道它是否是上传的实际PHP文件...这是我必须检查它的内部,对吧?他们可以随时改变文件扩展名,这样就不会帮我任何...唯一的方法我能想到的是把文件中搜索'<?php',''字符串。 – SoLoGHoST 2010-05-30 15:54:14

回答

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

(15个字符)

+1

不需要测试'<?php',因为'<?php'已经被<??匹配。 – Gumbo 2010-05-30 15:52:42

+0

好的,那么我怎样才能改变这只''字符串? – SoLoGHoST 2010-05-30 15:56:33

+0

你只需删除中心块,留下/(?:<\?|\?>)/ – ABach 2010-05-30 16:03:58

2

如果要分析该文件,而不是尝试以下操作:

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等)。

+0

好吧,我不知道这里发生了什么,但是我在将.xml文件扩展名更改为.php后,使用这种方法上传了一个XML文件。所以这根本不起作用。 – SoLoGHoST 2010-05-30 19:05:41

+0

当我上传其他文件时,例如.zip文件,我在页面顶部出现约100次这样的错误:'警告:输入中意外的字符:''(ASCII = 5)state = 1 in'和ASCII变化为每个错误的不同值,但所有错误都指向这一行:'foreach(token_get_all($ content)as $ token){' – SoLoGHoST 2010-05-30 19:09:47

+0

这种方法很糟糕。获得2票的这一事实令人难以置信,而且这样做的人民的投票不合理。没有冒犯,但正如我所说的,将.xml文件名改为.php将返回为TRUE!我从来没有见过使用token_get_all()实际返回肯定结果的一个实例。 – SoLoGHoST 2010-05-30 19:23:47

1
\?>|<\?((?=php)|(?!\w))