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 请求发送 textarea 代码的文件:

<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');
....

你说你想把*换成。前一个URL为您提供了一个“固定”功能,将其替换为:

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