1

ここでちょっとした実験をしています。アプリに実際にログインしなくてもコードを実行するために使用するテスト ファイルがあります。

いずれにせよ、私は今日、ページを自己編集できるようにして、テキスト エディターを開く必要さえないので、特定の単純なタスクをより迅速に実行できるようにすることができると考えました。

ほとんどの場合、そのままで機能していますが、奇妙なことがわかりました。誰かがたまたま経験があるか、光を当てることができることを願っています。

ファイル全体のコードを投稿するのではなく、関連するものだけを投稿します。基本的な考え方は次のとおりです。

index.php:

<?php
if(isset($_POST['file'])) {
  // rewrite ourself
  $test_page = fopen('index.php', 'w');
  fwrite($test_page, $_POST['file']);
  fclose($test_page);
  header('Refresh: 0; ' . $_SERVER['PHP_SELF']);
  exit();
  die(); // we should never get this far...
}
?>
<?php <!-- All the tester stuff goes here --> ?>
<?php <!-- Nothing fancy just a bunch of function calls --> ?>
<!doctype html>
<html lang="en">
  <head>
  </head>
  <body>
    <div>
      <!-- a dump of the functions called in the tester area -->
    </div>
    <div>
      <form method='post'>
        <textarea name='file'>
<?php
$self = fopen('index.php', 'r');
while(!feof($self)) {
  echo fgets($self);
}
fclose($self);
?>
        </textarea>
        <input type="submit" value="Edit/Refresh">
      </form>
    </div>
  </body>
</html>

最後の 5 つの HTML タグがファイルに書き込まれていないことを除いて、すべてが正常に機能しています。より正確には、最後の 5 つの HTML タグが に書き込まれていtextareaません。これまでのところ、タグが PHP によって出力されると、明らかにテキスト領域が閉じられるというのが私の理論です。そのため、テキスト領域内でその終了タグを取得する方法を見つける必要があります。これはページのソースを見て確認したので、正しいと思います。

だから私は彼らを「逃れる」方法が必要だと思う...

セキュリティの面で良くないことはわかっていますが、これは私が使用する単なるローカル ページです (私のコンピューターの前に座っている人以外はアクセスできません)。したがって、明らかに存在する可能性のあるセキュリティの問題について議論する必要はありません...

すべての考えに感謝します!:)

4

3 に答える 3

3

問題を解決する最も簡単な方法は、次のものを置き換えることです。

echo fgets($self);

と:

echo htmlspecialchars(fgets($self));

そうすれば、テキスト ボックスに特殊文字が表示されますが、html としてレンダリングされません。

于 2012-07-31T21:47:24.080 に答える
0

これは本当に悪い考えです。なぜなら、何か問題が発生すると爆発して二度と機能しなくなり、バックアップがなければ永久に失われてしまうからです。

これが、人々が php スクリプトなどを使用して、基になるファイルを変更せずに Web ページを動的に生成する理由です。ディスクのどこかに保存されている設定をいくつか追加することをお勧めします。

于 2012-07-31T21:36:13.660 に答える
0

テキスト領域の終了タグを検索して置換できます。もう一度呼び出すときはその逆です。すべての html コードを置き換える関数がありますが、終了タグだけを実行したい場合は、str_replace() または str_ireplace() を使用してカスタム タグを作成することをお勧めします。

于 2012-07-31T21:51:33.010 に答える