源代码是这样,不知道哪里没有考虑到,网站一直提示  对不起,您提交的表单来源错误,请重新登录!,高手能不能帮忙分析一下?,一个表单提交
url:='https://my.ename.cn/cas/sso';
  tempstr:=httpGet(url);
  sCookie:='';
  for i:=0 to IdHTTP1.Response.RawHeaders.Count-1 do
  begin
    if UpperCase(Copy(IdHTTP1.Response.RawHeaders[i],1,10))='SET-COOKIE' then
    begin
      sCookieTmp:=Trim(Copy(IdHTTP1.Response.RawHeaders[i],12,MAXINT));
      sCookieTmp:=Copy(sCookieTmp,1,Pos(';',sCookieTmp)-1);
      sCookie:=sCookie+sCookieTmp+'; ';
    end;
  end;
  tempstr := Utf8ToAnsi(tempstr);
  RegExpr:=TRegExpr.Create;
  RegExpr.Expression:='name="key" value="([^<]*)">';
  RegExpr.InputString:=tempstr;
  
  if RegExpr.Exec then
  begin
          tempstr:=RegExpr.Match[1];
  Params   :=   TStringList.Create;
  Params.Add('name=myuser');
  Params.Add('psw=mypassowrd');
  Params.Add('key='+tempstr);
  Params.Add('sid=1');
  Params.Add('backurl=http://www.ename.net/');
  Params.Add('domainname=www.ename.com');
  url := 'https://my.ename.cn/cas/./login/prelogin'; //active
  //IdHTTP1.Request.CustomHeaders.Add('Cookie:'+sCookie);
  idhttp1.Request.CustomHeaders.Values['Cookie']:=sCookie;   tempstr:=IdHTTP1.Post(url,Params);
   //返回   对不起,您提交的表单来源错误,请重新登录!
  //tempstr:=httpPost(url,Params);
  tempstr := Utf8ToAnsi(tempstr);
  Memo1.Text:=tempstr;
  end else
  begin
    memo1.Text:='test';
  end;idhttp表单提交易名中国

解决方案 »

  1.   

    你要提交的内容在正常的情况下应该是登录后才能进行了,提交页面其实将你的登录成功信息也发送了。用IDHTTP提交时,没有事先登录,直接给目标地址提交内容,对于目标地址来说,没有收到你的登录信息。你要事先登录,然后获取返回的一个唯一值,叫啥来着忘记了,好久前搞过。
    在提交的时候将这个值也一起提交。
      

  2.   

    1. https页面,要用SSL方式登录
    2. 数据头,重设为与登录时载包一样,内容如下 Accept: application/json, text/javascript, */*; q=0.01
    Content-Type: application/x-www-form-urlencoded
    X-Requested-With: XMLHttpRequest
    Referer: https://my.ename.cn/cas/sso
    Accept-Language: zh-cn
    Accept-Encoding: gzip, deflate
    User-Agent: Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0)
    Host: my.ename.cn
    Content-Length: 113
    Connection: Keep-Alive
    Cache-Control: no-cacheContent-Length. 不用指定,默认Idhttp自动计算
    提交后,取出以上列表值,看是否与登录时一样,不一样的就要重设
    Indy自身Accept-Encoding: gzip, deflate 这个值,要改下源码,,不然会多一个 Identify3.Cookie: PHPSESSID=9o59bf56c4ip94pllk4d67f9t7  这个Cookie不用自已去设..  直接Idhttp.AllowCookie:= true;  让IDHttp去自动管理..   如Idhttp.果想自定义的话,要先指定 Idhttp.AllowCookie:= false; 不然,自定义Cookie无效, 
    另外: Cookie较长时,要改下源码中分段长度, 默认长度72超过72 自定义Cookie值会换行. 若换行,会影响服务器判断4: name=demo.abc%40qq.com&psw=123456&key=7ije32&sid=1&domainname=www.ename.net&backurl=http%3A%2F%2Fwww.ename.net%2FPost信息要进行 httpencode  5: Content-Encoding: gzip
    服务器返回信息进行了 Gzip压缩.. 你懂的..这些都做到了,那么恭喜你,可以正常登录了
      

  3.   

    <form action="XXX.php" method="post" enctype="application/x-www-form-urlencoded"
        id="test">   
    <label for=user_name>用户名</label><input type="text" name="user_name">
    <label for= user_password>密码</label><input type="password" name="user_password">
    <input type="submit" name="submit" value="提交">
    </form>这个 label for 属性,会影响提交吗?提交的时候要设置for属性吗?
      

  4.   

    我是用的SSL方式 有添加:IdSSLIOHandlerSocket1 sslvSSLv3
      

  5.   

    <form action="XXX.php" method="post" enctype="application/x-www-form-urlencoded"
        id="test">   
    <label for=user_name>用户名</label><input type="text" name="user_name">
    <label for= user_password>密码</label><input type="password" name="user_password">
    <input type="submit" name="submit" value="提交">
    </form>这个 label for 属性,会影响提交吗?提交的时候要设置for属性吗?不用管什么Label那些只是页面元素, 影响到提交的,只是Form表单内容,如果页面有JS重置了提交信息,那只看这些HTML就不行了,.. 你直接抓包对比就可以了
      

  6.   

    IDHttp,有没把IOHandle指向这个 SSL控件 ?
      

  7.   

    IDHttp,有没把IOHandle指向这个 SSL控件 ?

    另外, 有没有复制与你使用Indy相对应版本的两个SSL的 DLL文件,到你程序所在目录,或者系统目录
      

  8.   

    IDHttp,有没把IOHandle指向这个 SSL控件 ?

    另外, 有没有复制与你使用Indy相对应版本的两个SSL的 DLL文件,到你程序所在目录,或者系统目录可能登陆啦,谢谢你,再补问一个问题。我结贴。
    POST的时候,如果两个文本框的name相同的情况下,怎么传,像这样两次吗,但是不行。我这样
    Params.Add('ttl=1600');
    Params.Add('ttl=2600');
    是不是有其它方法,登陆可以了,POST一条记录也行,POST两条记录不行!
      

  9.   

    两个相同Name的Input, 如果是在同一个Form下, 那就抓包看取得是哪个值真有这种情况,只能说服务端程序代码作者码代码时可能睡着了...
      

  10.   


    这种情况很正常的呀表单里,如果自动生成控件行
    ,程序开发的时候都用相同的Name,后台当数组取!
      

  11.   


    这种情况很正常的呀表单里,如果自动生成控件行
    ,程序开发的时候都用相同的Name,后台当数组取!
    嗯. 多个Name可以用数据来取值...  学习了..
      

  12.   

    找到了,原来是在IdHTTPHeaderInfo.pas