簡體   English   中英

執行 PHP 后,使用 Javascript 在 iframe 中加載 URL

[英]Load URL in an Iframe with Javascript once PHP is executed

盡管關鍵字PHP // Javascript // Load // 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 腳本似乎在執行命令后立即停止。 所以我也嘗試使用 Javascript 和 Jquery 和load()函數,但不知道把東西放在哪里。

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

感謝@chris-g 和大量調試會話,我能夠找到兩種解決方案來實現我的目標並解決問題。

以下是實現的步驟:

  • 啟動一個 PHP 會話並將一個隨機端口設置為變量。
  • 在 JavaScript 變量中獲取這個 PHP 變量。
  • 創建一個包含 3 個函數的外部 JavaScript 文件: formSubmit()changeUrl()bind() (表單提交、iframe src 和兩個函數的綁定)。
  • 創建一個調用bind()的按鈕。
  • 調整 PHP 腳本以獲取端口並在exec()使用它。

這應該可以工作,因為formSubmit()將數據發送到 PHP 腳本,並且changeUrl()在 iframe 中添加了正確的 src,但由於某種原因,它不是。
iframe 僅在“ttyd”進程終止時加載。

以下是代碼示例:

索引.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。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM