2014-12-07 52 views
0

我想用用戶名和密碼登錄https網站,轉到該網站的一個網址,然後下載該網頁的網址(也許解析該網頁的內容頁)。我只想使用核心Java apis而不是htmlunit,jsoup等。我得到了下面的代碼來學習如何做到這一點,但它並沒有告訴我如何登錄到網站。請告訴我如何登錄,維護會話,然後關閉連接。登錄https網站並使用唯一的核心Java API下載頁面

來源 - http://www.mkyong.com/java/java-https-client-httpsurlconnection-example/

import java.net.MalformedURLException; 
import java.net.URL; 
import java.security.cert.Certificate; 
import java.io.*; 

import javax.net.ssl.HttpsURLConnection; 
import javax.net.ssl.SSLPeerUnverifiedException; 

public class HttpsClient{ 

    public static void main(String[] args) 
    { 
     new HttpsClient().testIt(); 
    } 

    private void testIt(){ 

     String https_url = "https://www.google.com/"; 
     URL url; 
     try { 

     url = new URL(https_url); 
     HttpsURLConnection con = (HttpsURLConnection)url.openConnection(); 

     //dumpl all cert info 
     print_https_cert(con); 

     //dump all the content 
     print_content(con); 

     } catch (MalformedURLException e) { 
     e.printStackTrace(); 
     } catch (IOException e) { 
     e.printStackTrace(); 
     } 

    } 

    private void print_https_cert(HttpsURLConnection con){ 

    if(con!=null){ 

     try { 

    System.out.println("Response Code : " + con.getResponseCode()); 
    System.out.println("Cipher Suite : " + con.getCipherSuite()); 
    System.out.println("\n"); 

    Certificate[] certs = con.getServerCertificates(); 
    for(Certificate cert : certs){ 
     System.out.println("Cert Type : " + cert.getType()); 
     System.out.println("Cert Hash Code : " + cert.hashCode()); 
     System.out.println("Cert Public Key Algorithm : " 
            + cert.getPublicKey().getAlgorithm()); 
     System.out.println("Cert Public Key Format : " 
            + cert.getPublicKey().getFormat()); 
     System.out.println("\n"); 
    } 

    } catch (SSLPeerUnverifiedException e) { 
     e.printStackTrace(); 
    } catch (IOException e){ 
     e.printStackTrace(); 
    } 

    } 

    } 

    private void print_content(HttpsURLConnection con){ 
    if(con!=null){ 

    try { 

     System.out.println("****** Content of the URL ********");    
     BufferedReader br = 
     new BufferedReader(
      new InputStreamReader(con.getInputStream())); 

     String input; 

     while ((input = br.readLine()) != null){ 
      System.out.println(input); 
     } 
     br.close(); 

    } catch (IOException e) { 
     e.printStackTrace(); 
    } 

     } 

    } 

} 

回答

1

每個網站管理登錄不同。您需要搜尋網站,瞭解會話的維護方式,並以服務器無法辨別它不是瀏覽器的方式來模擬功能。

通常,網絡服務器會在cookie中存儲祕密散列。這裏是過程

  1. 使用HttpsURLConnection發送表單的登錄名和密碼。
  2. 服務器響應一個頭部中的哈希,它希望存儲在Cookie中。通常在名稱中有會話。
  3. 發送請求返回與哈希在頭中的正確值

以上可以做到只使用URL和HttpsURLConnection的所有,但你需要模仿瀏覽器究竟欺騙服務器。

對於偵察,我會建議使用像fiddler這樣的工具。它捕獲所有來自Web服務器的通信並返回,以便您可以在http級別準確查看發生了什麼以模仿您的Java代碼。

Here is an overview of fiddler。我從來沒有看過日誌。 Fiddler有一個甜美的界面。視頻真的很無聊,但它給出了界面的概述。你想看看原始文本視圖,並模仿它。

對於您的其他問題,owasp是最佳實踐的重要資源。事實上,存在許多不安全和糟糕的代碼,那些代碼是你永遠不會期望的。我看到一個服務器把布爾值放在腳本標籤內部,作爲一個javascript變量存儲。您只需仔細觀察服務器在登錄後如何更改響應。對於遵循最佳實踐的熱門網站,他們將使用上述方法。

+0

謝謝。我不知道如何使用小提琴手,但我會學習。順便說一句,有沒有包含所有可能的登錄方法的教程? – stack1 2014-12-07 06:36:31

+0

任何提示什麼在小提琴手「日誌」尋找? – stack1 2014-12-07 06:37:14

+0

我還沒有嘗試過這個答案,但我仍然選擇了它,因爲它給了我一些有用的信息。 – stack1 2014-12-25 21:57:23