【问题标题】:Load URL in an Iframe with Javascript once PHP is executed执行 PHP 后,使用 Javascript 在 iframe 中加载 URL
【发布时间】:2021-11-02 11:32:03
【问题描述】:

尽管关键字 PHP // Javascript // 加载 // URL 在网络上显示了很多结果,但我无法在脑海中说清楚。我正在尝试通过真实案例研究来学习,但我现在有点迷茫。

我为一些命令行脚本构建了一个 Web 界面。
1 - 用户在 HTML 表单中输入单词,
2 - 表单提交到 PHP 脚本,
3 - 脚本在服务器上执行命令并在 HTML 页面中返回结果。
到目前为止一切顺利。

但是脚本可能需要很长时间来处理,所以我想改变结果的显示方式。
我想使用 [ttyd][1],这是一个终端共享实用程序,可以让我实时获得漂亮的结果:
1 - 用户输入HTML 表单中的一个词,
2 - 表单提交给 PHP 脚本,
3 - 脚本在服务器上执行命令,打开一个端口,然后等待 HTTP 连接,
4 - 建立 HTTP 连接,结果显示在 iframe 中。
并在 HTML 页面上返回结果。

这是我的 PHP 示例:

<?php

require __DIR__ . "/vendor/autoload.php";

ini_set("display_errors", "1");
ini_set("display_startup_errors", "1");
error_reporting(E_ALL);

//Securize user inputs 
function securize($p)
{
    $v = htmlspecialchars($p); //Convertir les caractères spéciaux
    $v = trim($v); //Supprimer les espaces dans la requête
    $v = rtrim($v); //Supprimer les espaces à la fin de la requête
    $v = strtolower($v); //Tout mettre en minuscule
    $v = strip_tags($v); //Supprimer les balises html dans la requête
    $v = stripslashes($v); //Supprimer les slash dans la requête
    $v = stripcslashes($v); //Supprimer les backslash dans la requête
    $v = escapeshellcmd($v); //Protège les caractères spéciaux du Shell
    return $v;
}

//Tool selector
if (isset($_POST["search"])) {
    $term = securize($_POST["search"]);
    if (!empty($term)) {
        $port = rand(5000, 6000); //Get a random port for ttyd
        if ($_POST["tool"] == "ghunt") { 
            if (mailValidate($term)) {
                $tool = "python3 ghunt.py email";
                $cli = (craft($tool, $term, $port));
                passthru($cli);
                die();
            } else {
                echo "<script type='text/javascript'>alert('$term n\'est pas une adresse mail valide');</script>";
                die();
            }
        }
}

// Mail validation
// Takes user input
function mailValidate($p)
{
    if (filter_var($p, FILTER_VALIDATE_EMAIL)) {
        $v = true;
    } else {
        $v = false;
    }
    return $v;
}


// Command prep
// Takes command line + User input + port
function craft($tool, $term, $port)
{   
    $v = "ttyd -o -R -p $port $tool $term";
    return $v;
}

?>

到目前为止,我所有的尝试都失败了。
我尝试设置 PHP 重定向 header("Location: http://ipadress:$port/")
但是 PHP 脚本似乎在执行命令后立即停止。 所以我也尝试用load()函数使用Javascript和Jquery,但是不知道该放哪里。

PHP 不能处理多个“动作”,例如执行和重定向吗?

这是我的 HTML 表单的示例:

<body>
    <form method="POST" action="search.php" target="iframe">
        <fieldset>
            <legend>Recherchez un mail, un téléphone ou un pseudo...</legend>
            <input type="search" placeholder="mail, téléphone ou pseudo" name="search">
            <br>
                <div class="fields">
                <fieldset>
                    <legend>Email</legend>
                    <input type="radio" name="tool" value="ghunt">
                    <label for="ghunt"><b><div class="tooltip">Ghunt<span class="tooltiptext">Informations d'un compte google</span></div></b></label>
                </fieldset>
                </div>
            <input class="button" type="submit" name="submit" value="Seek">
        </fieldset>
    </form>
        <iframe id="ttyd" name="iframe"> </iframe>
</body>

非常感谢您的灯 [1]:https://github.com/tsl0922/ttyd

【问题讨论】:

  • 一个 PHP 脚本运行,收集输出,然后完成。然后将输出作为服务器的响应发送到浏览器(并显示,除非使用 ajax 请求 URL)。然而,ttyd 创建了一个显示远程终端的 Web 服务器。要在您的网络应用程序中使用它,您需要选择一个固定端口,然后将 iframe src 设置为yourserver:fixed_port。,该标题行重定向到 ttyd 服务器,因此理论上它应该可以工作;表单是如何发送到服务器的?你能显示表单的 HTML 吗? iframe 在这里有什么影响?你是用 jQuery 提交表单吗?
  • 感谢@ChrisG 的快速回复,我想避免一个固定的端口同时让多个用户。我将在第一篇文章中添加 HTML 表单。但是,如果我使用尚不存在的地址设置 iframe,它会显示错误,对吗?
  • 是的,您会收到超时/无法连接错误。
  • 发送该表单将使浏览器导航到结果。因此 iframe 消失了,浏览器只会显示 PHP 脚本的输出。它没有输出任何东西。您可能需要使用 ajax 发送请求,然后将 iframe src 设置为 ttyd 服务器 url。这需要知道 PHP 选择的端口。
  • 不确定我是否理解。如果没有 TTYD “增强”,结果会正确显示在给定的 iframe 中。如果我需要使用ajax提交请求,为什么不能在这里定义随机端口?

标签: javascript php html jquery


【解决方案1】:

感谢@chris-g 和大量调试会话,我能够找到两种解决方案来实现我的目标并解决问题。

以下是实现的步骤:

  • 启动 PHP 会话并将随机端口设置为变量。
  • 在 JavaScript 变量中获取这个 PHP 变量。
  • 创建一个包含 3 个函数的外部 JavaScript 文件:formSubmit()changeUrl()bind()(表单提交、iframe src 和这两个函数的绑定)。
  • 创建一个调用bind()的按钮。
  • 调整 PHP 脚本以获取端口并在 exec() 中使用它。

这应该可以工作,因为formSubmit() 将数据发送到 PHP 脚本,changeUrl() 在 iframe 中添加了正确的 src,但由于某种原因,它没有。
只有在“ttyd”进程终止时才会加载 iframe。

以下是代码示例:

index.php

<?php
// Start the session and set a random port in the "ttyd" variable
session_start();
$_SESSION["ttyd"] = rand(5000, 6000);
?>

<!DOCTYPE html>
<html>
  <head>
    [...]
  </head>
  <body>
    <script>var site = '<?php echo "http://51.91.108.124:$_SESSION[ttyd]"; ?>'</script> <!-- Grab session "ttyd" var in JavaScript -->
    <script src="js.js"></script> <!-- Include JS script file -->
    <form name="osint" method="POST" action="search.php" target="iframe">
      <fieldset>
        <legend>Recherchez un mail, un téléphone ou un pseudo...</legend>
        <input type="search" placeholder="mail, téléphone ou pseudo" name="search">
            [...]
        <div class="fields">
          <fieldset>
            <legend>Email</legend>
            <input type="radio" name="tool" value="ghunt">
            <label for="ghunt"><b>
                <div class="tooltip">Ghunt<span class="tooltiptext">Informations d'un compte google</span></div>
              </b></label>
          </fieldset>
            [...]
        </div>
            [...]
        <input type="button" class="button" onclick="bind();" value="Seek!">
      </fieldset>
    </form>
    <iframe class="iframe" name="iframe"> </iframe>
  </body>
</html>

js.js

//Form submission
function formSubmit() {
    document.forms["osint"].submit();
}
//Load iframe
function changeUrl() {
    document.getElementsByName("iframe")[0].src = site;
}
//Bind functions
function bind(){
    changeUrl(); formSubmit();
}

搜索.php

<?php
session_start();
require __DIR__ . "/vendor/autoload.php";

//Securize user inputs
function securize($p)
{
    $v = htmlspecialchars($p); //Convertir les caractères spéciaux
    $v = trim($v); //Supprimer les espaces dans la requête
    $v = rtrim($v); //Supprimer les espaces à la fin de la requête
    $v = strtolower($v); //Tout mettre en minuscule
    $v = strip_tags($v); //Supprimer les balises html dans la requête
    $v = stripslashes($v); //Supprimer les slash dans la requête
    $v = stripcslashes($v); //Supprimer les backslash dans la requête
    $v = escapeshellcmd($v); //Protège les caractères spéciaux du Shell
    return $v;
}
//Mail validation
function mailValidate($p)
{
    if (filter_var($p, FILTER_VALIDATE_EMAIL)) {
        $v = true;
    } else {
        $v = false;
    }
    return $v;
}
//Command line crafting
function craft($port, $loc, $tool, $term)
{   
    $ttyd = "ttyd -o -R -t rendererType=webgl -t disableLeaveAlert=true -t disableReconnect=true -p $port";
    $v = "$loc && $ttyd $tool $term";
    exec($v);
}
//Choix de l'outil
if (isset($_POST["search"])) {
    $term = securize($_POST["search"]);
    if (!empty($term)) {
        if (isset($_POST["tool"])) {
            if ($_POST["tool"] == "ghunt") {
                if (mailValidate($term)) {
                    $location = "cd /home/www-data/GHunt";
                    $tool = "python3 ghunt.py email";
                    $cli = (craft($_SESSION["ttyd"], $location, $tool, $term));
                    die();
                } else {
                    echo "<script type='text/javascript'>alert('$term n\'est pas une adresse mail valide');</script>";
                    die();
                }
        } else {
        echo "<script type='text/javascript'>alert('On ne fais pas de magie. Choisissez un outil !');</script>";
        die();
        }
    } else {
        echo "<script type='text/javascript'>alert('La nature a horreur du vide, entrez un terme de recherche');</script>";
        die();
    }
}

?>

问题与 iframe 有关。表单(target="iframe")和changeUrl()都应该在同一个iframe中输入数据,造成麻烦。

由于表单不应该返回数据,我只需要更改表单的目标并将其发送到隐藏的 iframe。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-03-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多