如何通过查询字符串文件名执行php代码而不包括?

时间:2018-03-11 07:31:52

标签: php

我正在尝试使用文件名作为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而不实际包含主索引中的文件。有可能吗?

2 个答案:

答案 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攻击。