我一直在写一个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
麦克
答案 0 :(得分:3)
只要包含标签,你就可以eval()包含混合html和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
答案 3 :(得分:1)
您需要将已解码的文件转储到另一个文件并include();
。 eval方法不起作用,因为如果文件中的第一项不是开始<?php
标记或PHP代码的有效位,它将以解析错误退出。
除此之外,您还需要使用不同的功能查找/替换加密文件中include()
,require()
,include_once()
和require_once()
的任何出现,确保在解密之前不要尝试执行另一个加密文件。你可以在执行(即解密)时执行此操作,但加密时间要好得多,以最大限度地减少在执行代码之前预取代码所需的时间。
您可以定义这些自定义函数来解密文件,并在加载器脚本中包含/要求它。
答案 4 :(得分:0)
您的问题描述有点模糊,但您的问题似乎可以通过output buffering解决。
答案 5 :(得分:0)
您是否尝试过对页面进行解密,然后解析文本以分割出任何内容,然后仅执行该代码?