Php问题eval / html / php

时间:2011-08-24 19:47:37

标签: php html eval encryption

我一直在写一个php / html页面编码器/解码器......我知道它已经存在但是它是一个大学项目所以继续使用XDDD

我编码了我要保护的页面,假设用base64_encode假设,当我收到任何页面的请求时,我有一个读取编码页面的加载器,解密它并用eval执行它。当我尝试解密并执行混合的php / html页面时,会出现真正的问题。显然eval无法执行html代码所以我的问题是我真的变得疯狂分裂执行php代码的页面并打印html?如果我包含一个编码的php或php / html页面,我真的必须在这里重用这个方法吗?

我希望有人可以真正帮助我,因为我在截止日期前还有一周的时间,而且我现在无法改变项目。

这里的函数和$ param [0]中的fisrt调用我得到了名为

的文件名
function MyInclude($filename)
{
// create the temp file
$temp_filename = "tmp.php";
$handle = fopen($temp_filename , 'w+');
if (!$handle)
  die('Error creating temp file');

// write the decrypted data, close the handle
$tmp=file_get_contents($filename);

$data=MCrypt_Decode($tmp,'PFL_EPU_V100_mia');

fwrite($handle,$data );
fclose($handle);

// start output buffering to contain any output the script creates
ob_start();

try {
 include($temp_filename);
} catch (Exception $e) {
 die('There was an error in the encrypted file, cannot process');
}

// get the output, clear the buffer
$output = ob_get_contents();
ob_end_clean();

//destroy the temp file
unlink($temp_filename);

// now you can output the buffer, if desired:
echo $output;
}

MyInclude($param[0]);

这里的$ param [0]文件

<?php
 session_start();
 $_SESSION['title']='Home';
 MyInclude("header.php");
?>

<body>
    sono il body <?php echo APP_PATH; ?>
</body>

<?
echo "boss";
 MyInclude("footer.php");
?>

关于它的任何想法???或者你需要一些其他代码?让我知道T_T

麦克

6 个答案:

答案 0 :(得分:3)

只要包含标签,你就可以eval()包含混合html和php的字符串。

http://php.net/manual/en/function.eval.php

答案 1 :(得分:3)

eval()遇到php关闭标记(?>)时,它会停止尝试将其视为php代码,只是回显所有内容,直到它出现在php开放标记中。

您问题的典型解决方案是这样的:

$file = ... //Your decoded php/html code here

$file = '?>' . $file; //Add a close tag to the beginning;

ob_start();
eval($file);
$output = ob_get_clean();

echo $output; //Or do something else with it... really, if you're 
              //just going to be echoing it you can skip the output buffering

答案 2 :(得分:2)

是否可以解密页面,将其写入文件,然后include它?这将让PHP解释器做它最擅长的 - 解释PHP文档。这将包括HTML / PHP组合,而不依赖于eval

概要是:

// create the temp file
$temp_filename = "tmp.php";
$handle = fopen($filename , 'w');
if (!$handle)
  die('Error creating temp file');

// write the decrypted data, close the handle
fwrite($handle, $decrypted_data);
fclose($handle);

// start output buffering to contain any output the script creates
ob_start();

try {
 include_once($temp_filename);
} catch (Exception $e) {
 die('There was an error in the encrypted file, cannot process');
}

// get the output, clear the buffer
$output = ob_get_contents();
ob_end_clean();

//destroy the temp file
unlink($temp_filename);

// now you can output the buffer, if desired:
echo $output;

功能参考

fopen:http://us2.php.net/manual/en/function.fopen.php

fwrite:http://us2.php.net/manual/en/function.fwrite.php

fclose:http://us2.php.net/manual/en/function.fclose.php

ob_start:http://us2.php.net/manual/en/function.ob-start.php

ob_get_contents:http://us2.php.net/manual/en/function.ob-get-contents.php

ob_end_clean:http://us2.php.net/manual/en/function.ob-end-clean.php

取消关联:http://www.php.net/manual/en/function.unlink.php

答案 3 :(得分:1)

您需要将已解码的文件转储到另一个文件并include();。 eval方法不起作用,因为如果文件中的第一项不是开始<?php标记或PHP代码的有效位,它将以解析错误退出。

除此之外,您还需要使用不同的功能查找/替换加密文件中include()require()include_once()require_once()的任何出现,确保在解密之前不要尝试执行另一个加密文件。你可以在执行(即解密)时执行此操作,但加密时间要好得多,以最大限度地减少在执行代码之前预取代码所需的时间。

您可以定义这些自定义函数来解密文件,并在加载器脚本中包含/要求它。

答案 4 :(得分:0)

您的问题描述有点模糊,但您的问题似乎可以通过output buffering解决。

答案 5 :(得分:0)

您是否尝试过对页面进行解密,然后解析文本以分割出任何内容,然后仅执行该代码?