1

完全なシナリオは、w3schools のような Web アプリケーションを作成しています。オプション。しかし、今はセキュリティについては置いておいて、Web アプリケーションのコア部分を作っています。

私の論理は次のとおりです。

  1. textarea を使用してユーザーから入力を取得し、ajax リクエストで POST メソッドを使用してそのデータを送信します。
  2. PHPファイル(ajaxがリクエストを送信した)で、投稿されたコンテンツを別のPHPファイルに書き込み、システム関数を使用してそのPHPコードを実行し、生成されたhtmlを.htmファイルに再度書き込みます。
  3. ajaxリクエストが送信されたファイル(最初のファイル)で、javascriptで.htmファイルの出力のiframeを使用して更新しています。

問題は:

エコー、システム関数を含むコードでは、すべて正常に機能しました。ただし、「+」などの記号を使用すると、投稿されたデータは html URL デコードに変換されます。

<?php
  echo "Hello, world";
?>

上記のコードは正常に動作します。

<?php
  $a = 10;
  $b = 20;
  echo $a+$b;
?>

動いていない。上記のコードは、PHP で記述されたファイル (POST データから書き込んでいるファイル) にチェックインすると、次のように記述されます。

<?php
  $a = 10;
  $b = 20;
  echo $a $b;
?>

「+」記号はスペースに変換されています。データは通常の html エンティティにデコードされていると思います。この全体のより良いロジックと、この問題を解決する方法はありますか。みんな助けてください。

ajax リクエストを使用してテキストエリア コー​​ドを送信しているファイル:

<title>Html Black Box</title>
<style>
    textarea{ 
    font-family: courier; font-size: 15px; height: 100%; width: 100%;}
    input {width: 100%; height: 100%; font-size: 40px;}
    iframe {width: 100%; height: 100%; }
</style>
<script>
function update(){
document.getElementById('tdop').innerHTML = "<img src=ajx_ima.gif>";
var form = document.getElementById('code_text').value;
var xmlhttp;
    if (window.XMLHttpRequest)
      xmlhttp=new XMLHttpRequest();
    else
      xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");

xmlhttp.open("POST", "process_php.php", true);
xmlhttp.setRequestHeader("Content-type","application/x-www-form-urlencoded");
xmlhttp.onreadystatechange=function()
  {
 if (xmlhttp.readyState==4 && xmlhttp.status==200)
    {
        var res = xmlhttp.responseText;
    document.getElementById('tdop').innerHTML = "<iframe src=out_php.htm id=out></iframe>";
    }

  }
    xmlhttp.send("code="+form);
}
</script>
<table border=0>
<tr>
<td>
    <textarea id="code_text" style="resize: none;"></textarea>
</td>
<td id="tdop">
    <iframe src="blank.htm" id="out" frameBorder="1"></iframe>
</td>
</tr>
<tr><td colspan="2" align="center"><input type="button" value="Update Page" onclick="update()"></td></tr>
</table>

受信データを書き込むファイル

<?php
$stringData = ''.isset($_POST['code']) ? $_POST['code'] : '';
$myFile = "buf_php.php";
$fh = fopen($myFile, 'w+');
file_put_contents($myFile, $stringData);
fclose($fh);
$myFile = "out_php.htm";
system("php buf_php.php > $myFile");
echo $stringData;
?>
4

1 に答える 1

3

投稿リクエストを介して、テキストエリアから「コード」を直接送信しています。特殊文字は、URL として処理されます。

これを回避するには、 encodeURIComponent() 関数を使用してこれらの特殊文字を JavaScript でエンコードする必要があります。escapes all characters except the following: alphabetic, decimal digits, - _ . ! ~ * ' ( )

....
 // var form = document.getElementById('code_text').value; //old line
 var form = encodeURIComponent(document.getElementById('code_text').value)
....

+-記号以外はすべて修正されます。したがって、+ を「%20」に置き換える必要があります。

...
 var form = encodeURIComponent(document.getElementById('code_text').value);
 form = form.replace('+','%20');
....

* を to に置き換えたいと言います。以前のURLは、それらを次のように置き換える「固定」機能を提供します。

function fixedEncodeURIComponent (str) {
    return encodeURIComponent(str).replace(/[!'()]/g, escape).replace(/\*/g, "%2A");
} 
于 2013-04-07T15:49:32.037 に答える