我正在尝试使用文件名作为index.php?q=script1
之类的查询字符串动态执行php代码。到目前为止我所做的工作只有当我在主索引中使用include作为传递文件时才有效。
<?php
include("class.php");
if (!empty($_GET['q'])) {
$sp = $_GET['q'];
$sp = basename($sp);
$location = 'src/scripts/' . $sp . '.php';
if (file_exists($location)) {
file_get_contents($location); // Tried, does not work
shell_exec('php -f /' . $location); // This does not work either
include($location); // This works
}
}
?>
我正在寻找一种方法来执行em而不实际包含主索引中的文件。有可能吗?
答案 0 :(得分:0)
<强> TRY 强>
if (!empty($_GET['q']))
{
$sp = $_GET['q'];
$sp = basename($sp);
$location = __DIR__.'/src/scripts/' . $sp . '.php';
if (file_exists($location))
{
$output = shell_exec('php -f /' . $location);
//to see output
echo $output;
}
}
答案 1 :(得分:0)
如果您不希望包含文件,则至少有三种不同的方法可以让PHP脚本执行。我测试了一个引用以下文件的查询字符串:
<强> hello.php:强>
<?php
function greet() {
$h = "hello";
$w = "world";
return "$h, $w!";
}
echo greet();
为了便于执行hello.php,可以使用以下代码中描述的任何技术:
<?php
if ( !empty( $_GET['q'] ) ) {
$host = $_SERVER['HTTP_HOST'];
$uri = rtrim(dirname($_SERVER['PHP_SELF']), '/\\');
$file = basename( htmlentities( $_GET['q'] ) ); // "hello.php";
if (file_exists($file)) {
/*$contents = file_get_contents("http://$host$uri/$file"); // works
print_r($contents);*/
/*$output = shell_exec('php -f ./' . $file); // works, too
print_r($output);*/
if (headers_sent()) { // tip fr:https://stackoverflow.com/a/8028987/701302
$url = "http://$host$uri/$file";
die("Please click this link: <a href=\"$url\">$url</a>");
}
else
{
header("Location: http://$host$uri/$file");
exit;
}
}
}
使用file_get_contents(),您需要传入网址或相对网址。如果将路径传递给文件,则该函数将自行检索脚本而不是执行它。另外,对于file_get_contents(),如果要捕获变量,则需要为变量赋值。
另一种方法是使用带有-f选项的命令行PHP的shell_exec()来解析和执行PHP文件。使用此功能时,如果要访问该值,则必须将任何返回值分配给变量。
最后,您可以指示PHP使用header()将Web服务器重定向到指定的文件。
注意:如果不进行某些验证,则不应使用$ _GET变量。此代码检查是否存在值以及使用htmlentities()来避免XSS攻击。