1

クロスドメイン AJAX POST クエリ用のプロキシを作成しようとしています。そのためには、クライアント (ブラウザ) のリクエストからの Cookie を、PHP バックエンドに送信する POST リクエストに追加する必要があります。これはHttpWebRequestを使用しています。これを行うために、それぞれの Request.Cookie を HttpWebRequest.CookieContainer オブジェクトに追加しています。何らかの理由で、追加した Cookie が PHP バックエンドに到達することはありません。

いくつかの検索から、CookieContainer オブジェクトが URI に依存していることがわかりました (説明する方法さえわかりません!)。おそらくそれが問題の原因です。ただし、Cookie のドメインを別のものに設定しようとしましたが、影響はないようです。したがって、URI は Cookie の Domain パラメータとは異なる意味を持っている可能性があります。もしそうなら、私は立ち往生しています。

代替ソリューションが存在する場合、私はすべて賛成です(プラグインを必要とせずにasp.netで自動クロスドメインプロキシを実行する方法があれば、それは私の命を救います!)。

これが私が使用しているコードです。

<%@ Page Language="VB" validateRequest="false" Debug="true" %>
<%@ Import Namespace="System.IO" %>
<%@ Import Namespace="System.Net" %>
<script runat="server">

    Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
        If Not Page.IsPostBack Then
            Dim displayValues As New StringBuilder()
            Dim CookieJar as New CookieContainer
            Dim objCookieColl as HttpCookieCollection
            Dim objThisCookie As HttpCookie
            Dim myCookie As HttpCookie
            Dim arr1() As String
            Dim myCount as Integer

            objCookieColl = Request.Cookies
            arr1 = objCookieColl.AllKeys
            Dim postedValues As NameValueCollection = Request.Form
            Dim nextKey As String
            For i As Integer = 0 To postedValues.AllKeys.Length - 1
                nextKey = postedValues.AllKeys(i)
                If nextKey.Substring(0, 2) <> "__" Then
                    displayValues.Append("&" & nextKey)
                    displayValues.Append("=")
                    displayValues.Append(Server.UrlEncode(postedValues(i)))
                End If
            Next

            Dim uri As New Uri("http://www.otherdomain.com/subfolder/backend.php")
            Dim data As String = displayValues.ToString
            If (uri.Scheme = uri.UriSchemeHttp) Then
                Dim postRequest As HttpWebRequest = HttpWebRequest.Create(uri)
            For index As Integer = 1 to UBound(arr1)
                objThisCookie = objCookieColl(arr1(index))
                Dim tempCookie As New Cookie(objThisCookie.Name, objThisCookie.Value, objThisCookie.Path, Request.ServerVariables("HTTP_HOST"))
                myCount = myCount + 1
                CookieJar.Add(tempCookie)
            Next
                postRequest.CookieContainer = CookieJar
                postRequest.Method = Request.HttpMethod
                postRequest.ContentLength = data.Length
                postRequest.ContentType = "application/x-www-form-urlencoded"
                Dim writer As New StreamWriter(postRequest.GetRequestStream())
                writer.Write(data)
                writer.Close()

                Dim myResponse As HttpWebResponse = postRequest.GetResponse()
                Dim x As Integer
                While x < myResponse.Headers.Count
                    Response.AppendHeader(myResponse.Headers.Keys(x), myResponse.Headers(x))
                    x = x + 1
                End While
                Dim reader As New StreamReader(myResponse.GetResponseStream())
                Dim responseString As String = reader.ReadToEnd()
                myResponse.Close()
                Response.Write(responseString)

            End If
        End If
    End Sub

</script>
4

2 に答える 2

0

.Net (あなたの状況では asp) を使用して実行されているサイトがあり、PHP を実行している別のアプリケーションに Cookie を渡したいということですか? これは行われるべきではないため、Cookieが別の「サイト」と共有されるのを防いでいると思います。ハッカーの攻撃ベクトルとしてよく使用されるため、サーバーがそれを防ごうとしていると思います.

于 2011-05-25T09:17:55.507 に答える
0

ASP が Cookie をどのように設定、保存、および処理するかについてはよくわかりません。しかし、あなたのPHPバックエンドで試してみてください

<?php
echo "<pre>";
print_r($_COOKIE);
echo "</pre>";
?>

このようにして、PHP が、読み取ろうとしている Cookie のように見える Cookie を見つけているかどうかを確認できます。ただし、このような言語を混在させることはお勧めできませんが、この必要性の背後には適切な論理があると確信しています。可能な代替案を提案できますか。おそらくいくつかのJavaScriptでギャップを埋めます。変数を Cookie に保存するように設定し、JavaScript を使用して Cookie を設定します。 http://www.w3schools.com/JS/js_cookies.asp JavaScript を使用して Cookie を設定する方法のリファレンスについては、PHP で JavaScript で設定した Cookie を取得できることを知っているので、これがいくつかの助けになることを願っています。 ASP の場合、そこでも JavaScript を使用できるはずです。

これがすべての解決策であるというわけではなく、最善ではないかもしれません。前面と背面を接続しようとしている多くのものにはこの概念を使用しませんが、相互に大きな害があるとは思いません.

于 2011-05-25T09:15:09.347 に答える