将字符串发送到php服务器并使用它

时间:2015-09-24 18:17:56

标签: php xmlhttprequest

我试图将一个字符串发送到php服务器,但由于某种原因,我无法读取服务器上的字符串...我尝试了很多方法来键入它但似乎我从来没有得到正确的语法。有人有线索吗?

var command="";
if(document.getElementById("Text_1").value != "" && document.getElementById("Text_2").value != "")
        {
            command += " " + document.getElementById("Text_1").value + " " + document.getElementById("Text_2").value;
        }       

        alert(command);

        xmlhttp.open("POST", "server.php", false);
        xmlhttp.setRequestHeader('info', command)
                     //TRIED xmlhttp.setRequestHeader("info, command")
                     //TRIED xmlhttp.setRequestHeader('info', 'command')
                     //TRIED many others sketchy things...
        xmlhttp.send();
        //TRIED xmlhttp.send(command);
        var output = xmlhttp.responseText;

在php服务器上:

<?php

$parameter = $_POST['command']; 

$output = exec("someexecutable.exe $parameter");

echo json_encode($parameter);
?>

对于他们想知道,如果我用正确的字符串硬编码$参数,它就可以工作,所以可执行文件不是问题所在。服务器无法在$ _POST中获取字符串的值。

1 个答案:

答案 0 :(得分:3)

setRequestHeader用于在请求上设置标头。 Content-typeContent-length等内容。

您需要将数据传递给send()。要使$_POST生效,它们必须采用key=val&vey2=val2格式。实际上,在较新的浏览器中,您可以使用FormData

xmlhttp.open("POST", "server.php", false);

// To emulate a `<form>` POST
xmlhttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded");

// To get the response, you need to set a callback
xmlhttp.onreadystatechange = function(){
    // readyState 4 = complete
    // status = 200 OK
    if(xmlhttp.readyState == 4 && xmlhttp.status == 200){
        var output = xmlhttp.responseText;
    }
};

// Create the Form Data
var params = new FormData;
params.append('command', command);

xmlhttp.send(params);

P.S。在运行命令之前,您应该运行escapeshellarg()。如果人们可以在您的服务器上运行任意命令,那么这可能比仅仅SQL注入更糟糕。

<?php
$parameter = escapeshellarg($_POST['command']);
$output = exec("someexecutable.exe $parameter");
?>

P.P.S。 escapeshellarg()会使您的命令将整个 $_POST['command']字符串视为一个参数。如果您不想这样,那么您需要从JavaScript发布数组

// Create the Form Data
var params = new FormData;
params.append('command[]', document.getElementById("Text_1").value);
params.append('command[]', document.getElementById("Text_2").value);

xmlhttp.send(params);

现在$_POST['command']将是一个数组,所以你必须像这样运行命令:

<?php
$parameters = array_map('escapeshellarg', $_POST['command']);
$output = exec("someexecutable.exe ".implode(' ', $parameters));
?>