发送无表单的 POST 数据

Posted

技术标签:

【中文标题】发送无表单的 POST 数据【英文标题】:Sending POST data without form 【发布时间】:2011-04-16 09:44:19 【问题描述】:

我可以在不使用表单的情况下将例如字符串或另一条信息发送到另一个 .php 文件而不被暴露[因此不是通过 GET 而是通过 POST 符合我所知道的]?

【问题讨论】:

听起来你需要使用会话。 尚不清楚您将数据从哪里发送到哪里。是客户端到服务器还是服务器到服务器或服务器到不同的服务器? 好吧,我将它从一个文件传递到同一服务器上的另一个文件 数据通过 POST 和通过 GET 几乎一样好,键值对不会显示在地址栏中,但信息仍会以明文形式传输,除非您正在使用 SSL,或者这严格来说是一种通过安全通信通道进行的服务器到服务器类型的事情。 POST 数据对用户非常可见(只是不是您的典型用户)。会议是要走的路。 【参考方案1】:

如果您不希望用户看到您的数据,请使用 PHP 会话。

用户仍然可以访问(和操作)发布请求中的数据。

在 PHP 会话上结帐 this tutorial。

【讨论】:

这不是一个好的解决方案,如果作者接受它作为一种解决方法。会话也比操纵发布请求更容易劫持(即通过“中间人”攻击) 为什么这是一个糟糕的解决方案?也许塞缪尔的过程是这样的,劫持会话不是问题。真正解决会话劫持(以不显眼的方式)的唯一方法是对所有与会话相关的请求使用 SSL。如果 Samuel 担心数据泄露,他应该使用 SSL。 @zolex,截取post数据有什么难的?只需坐在咖啡店里运行 WireShark 即可劫持 POST 数据。使用 cookie 重新创建请求并发布数据,一切顺利。如果您认为会话是一个不好的解决方案,那么 SSL 是唯一好的解决方案。 从咖啡店发送敏感数据时的经典用户失败;)顺便说一句,问题是如何使用 php 发送帖子数据,而不是在 url 中公开数据,即。它不会被网络服务器等记录下来。我认为这是主要目的......我的回答确实回答了这个问题,并且没有像你的那样提供一些开销解决方法。好吧,如果他对此感到满意。亲吻;)【参考方案2】:

如果您不需要表单,可以使用 AJAX 发送 POST 请求。

使用 jquery $.post 方法非常简单:

$.post('/foo.php',  key1: 'value1', key2: 'value2' , function(result) 
    alert('successfully posted key1=value1&key2=value2 to foo.php');
);

【讨论】:

那是javascript。 AJAX = 异步 Javascript 和 XML @Samuel,现在如果你说不允许使用 javascript,那么事情就变得相当不可能了 :-) 我不知道 AJAX 是 Javascript,我也不会真正使用 Javascript 这可能是这里最好的答案,使用 jquery 来完成繁重的工作,这在页面渲染后也可以工作。 问题标签是PHP,这不是PHP【参考方案3】:

使用 SESSION 发送您的数据,而不是发布。

session_start();
$_SESSION['foo'] = "bar";

在您收到请求的页面上,如果您绝对需要 POST 数据(一些奇怪的逻辑),您可以在开头的某个地方执行此操作:

$_POST['foo'] = $_SESSION['foo'];

post 数据的有效性与使用 POST 发送时一样。

然后销毁会话(或者如果您需要会话用于其他目的,则只需取消设置字段)。

销毁会话或取消设置字段很重要,因为与 POST 不同,SESSION 将保持有效,直到您明确销毁它或浏览器会话结束。如果你不这样做,你会观察到一些奇怪的结果。例如:您使用 sesson 过滤一些数据。用户打开过滤器并获取过滤后的数据。过了一会儿,他返回页面并期望过滤器被重置,但事实并非如此:他仍然看到过滤后的数据。

【讨论】:

【参考方案4】:

只需使用:file_get_contents()

// building array of variables
$content = http_build_query(array(
            'username' => 'value',
            'password' => 'value'
            ));
// creating the context change POST to GET if that is relevant 
$context = stream_context_create(array(
            'http' => array(
                'method' => 'POST',
                'content' => $content, )));

$result = file_get_contents('http://www.example.com/page.php', null, $context);
//dumping the reuslt
var_dump($result);

Reference:我对类似问题的回答:

【讨论】:

【参考方案5】:

查看这些函数的 php 文档,您可以使用它们发送 post reqeust。

fsockopen()
fputs()

或简单地使用类似 Zend_Http_Client 的类,它也基于套接字连接。

还使用谷歌找到了neat example...

【讨论】:

【参考方案6】:

function redir(data) 
  document.getElementById('redirect').innerhtml = '<form style="display:none;" position="absolute" method="post" action="location.php"><input id="redirbtn" type="submit" name="value" value=' + data + '></form>';
  document.getElementById('redirbtn').click();
<button onclick="redir('dataToBeSent');">Next Page</button>
<div id="redirect"></div>

您可以使用此方法创建一个新的隐藏表单,当单击按钮[下一页]时,其“数据”通过“post”发送到“location.php”。

【讨论】:

OP 在不使用表单的情况下要求解决方案。这个答案使用表格?

以上是关于发送无表单的 POST 数据的主要内容,如果未能解决你的问题,请参考以下文章

Laravel:通过无表单的 AJAX 向控制器发送数据

如何通过ajax从表单发送POST数据数组?

axios发送post请求,如何提交表单数据?

如何在 Swift 3 的 POST 请求中发送表单数据

简单表单不通过_POST发送数据[重复]

使用 HTML 表单发送 RAW 数据 POST 请求?