首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PHP,POST,COOKIE,JQUERY的帮助

PHP,POST,COOKIE,JQUERY的帮助
EN

Stack Overflow用户
提问于 2010-09-13 15:18:48
回答 2查看 1.8K关注 0票数 0

我在为客户的网站开发一个应用程序。故事是这样的,这家公司使用了一个名为synology的应用程序/ HDD,它基本上是一个连接到互联网的HDD盒,它允许预先创建帐户的客户端访问文件。这个接口是用CGI写的,我无法访问这个盒子(与网站不同的网络和位置)。

我们想要做的是允许一个登录表单从主网站(我正在构建)绕过(至少对用户:D)应用程序登录表单。

显然,我不能对不同的域执行jQuery ajax请求,它不能工作。所以我做的是

( 1)与jQuery合作的网站上的表格:

代码语言:javascript
复制
$("#login_submit").click(function(){
    var username= $("input#login_username").val();
    var passwd= $("input#login_passwd").val();
    var post_string = "username=" + username + "&passwd=" + passwd ;
    $.ajax({
        type : "POST",
        url: "login.php",
        data : post_string,
        success: function(response){

            if (response){
                $('.result').html("OK");
                window.location = "http://XX.XX.net:5000/webman/index.cgi";
             }
             else {
                 $('.result').html("INVALID");
             }
        }
    })
    return false;
}

2)在提交时通过POST调用login.php页面,通过POST传递用户和密码,page向远程语法服务器发出HTTP请求,并以JSON显然给出响应(?)我把它转换成一个PHP数组,这样我就可以看到“成功”键是真还是假,如果是真的,jquery代码将打印一条OK消息并重定向到远程系统服务器,在那里我可以访问我的数据登录!

代码语言:javascript
复制
<?php
function do_post_request($url, $data, $optional_headers = null)
{
  $params = array('http' => array(
              'method' => 'POST',
              'content' => $data
            ));
  if ($optional_headers !== null) {
    $params['http']['header'] = $optional_headers;
  }
  $ctx = stream_context_create($params);
  $fp = @fopen($url, 'rb', false, $ctx);
  if (!$fp) {
    throw new Exception("Problem with $url, $php_errormsg");
  }
  $response = @stream_get_contents($fp);
  if ($response === false) {
    throw new Exception("Problem reading data from $url, $php_errormsg");
  }
  return $response;
}

if ($_SERVER['REQUEST_METHOD'] == "POST"){
    $username = $_POST["username"];
    $passwd = $_POST["passwd"];

    $response =json_decode(do_post_request($url = "http://XX.XX.net:5000/webman/login.cgi", $data = "username=".$username."&passwd=".$passwd), true);

            if($response["success"]){
                $send = true;
            }
            else {
                $send = false;
            }
        echo  $send;
}

这里的问题是,login.cgi页面应该为该服务器设置一个会话cookie,但是使用这个PHP请求它就不会了,它会给出响应,但不会将cookie设置为浏览器。您知道我在维护jquery函数的同时,如何模拟后浏览器请求并设置cookie吗?也许我应该设置一些标题?如果将这个login.cgi作为“动作”做一个简单的表单,那么会话cookie是,但是用户当然会保留在我无法更改的页面上,因为我没有访问它的权限。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-09-13 16:36:56

使用stream_get_meta_data()提取从服务器<->语法请求返回的headers。如果代码的其余部分与适当的synology /参数一起正常工作,则从登录请求返回的标头应该包含对synology框上的进一步请求进行身份验证所必需的会话cookie。

然后,您可以将其存储在服务器<->用户通信的会话文件中,并为后续请求提取它。

评论后续行动:

是的,没错。由curl发起的请求完全由服务器端完成,完全不涉及客户端。虽然您可以通过curl检索synology会话/访问cookie,但无法将该cookie发送到客户端,使其看起来像是直接来自synology框。

例如,让我们假设头看起来如下所示:

代码语言:javascript
复制
Set-Cookie: sessionID=blahblahblah; path=/; domain=synologybox.com

提取会话ID并将其转发给客户端:

代码语言:javascript
复制
setcookie("sessionID", 'blahblahblah', 360000, '/');

然后客户端会将其存储为来自yourserver.com,而不是synologybox.com。此外,您也无法通过setcookie调用设置域:

代码语言:javascript
复制
setcookie("sessionID", 'blahblahblah', 360000, '/', 'synologybox.com')

这是行不通的,因为服务器<->客户端请求来自yourserver.com,它与synologbox.com完全不同。

如果没有对synology框的任何访问来入侵额外的身份验证设施,您很可能不得不构建一个完整的synology接口代理版本。

票数 1
EN

Stack Overflow用户

发布于 2010-09-13 15:21:15

如果您使用PHP进行此请求,则cookie将发送到您的服务器,而不是客户端。您不能从您的应用程序中为另一个域设置cookie,因此这是行不通的。你需要坚持客户端的方法。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3701769

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档