Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537 Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537
HTTPS介紹:
HTTPS(Secure Hypertext Transfer Protocol)安全超文本傳輸協(xié)議 它是一個安全通信通道,它基于HTTP開發(fā),用于在客戶計算機和服務(wù)器之間交換信息。它使用安全套接字層(SSL)進行信息交換,簡單來說它是HTTP的安全版。 它是由Netscape開發(fā)并內(nèi)置于其瀏覽器中,使用SSL在發(fā)送方把原始數(shù)據(jù)進行加密,然后在接受方進行解密保證數(shù)據(jù)的安全性.然而,加密和解密過程需要耗費系統(tǒng)大量的開銷,嚴重降低機器的性能.
HTTPS實際上就是SSL over HTTP,它使用默認端口443,而不是像HTTP那樣使用端口80來和TCP/IP進行通信。HTTPS協(xié)議使用SSL在發(fā)送方把原始數(shù)據(jù)進行加密,然 后在接受方進行解密,加密和解密需要發(fā)送方和接受方通過交換共知的密鑰來實現(xiàn),因此,所傳送的數(shù)據(jù)不容易被網(wǎng)絡(luò)黑客截獲和解密.然而,加密和解密過程需要耗費系統(tǒng)大量的開銷,嚴重降低機器的性能,相關(guān)測試數(shù)據(jù)表明使用HTTPS協(xié)議傳輸數(shù)據(jù)的工作效率只有使用HTTP協(xié)議傳輸?shù)氖种弧?/p>
如何實現(xiàn)加密:(其實就是sssl的交互過程)
HTTPS其實是有兩部分組成:HTTP + SSL / TLS,也就是在HTTP上又加了一層處理加密信息的模塊。服務(wù)端和客戶端的信息傳輸都會通過TLS進行加密,所以傳輸?shù)臄?shù)據(jù)都是加密后的數(shù)據(jù)。具體是如何進行加密,解密,驗證的
參考:
http://blog.csdn.net/binyao02123202/article/details/8049446
http://www.codeceo.com/article/why-http-better-than-https.html
標(biāo)站點:
aHR0cHMlM0EvL2subS5hdXRvaG9tZS5jb20uY24vZGV0YWlsL3NoYXJlXzAxZG1xeThmYTE2OHZrYWU5aDYwdmcwMDAwLmh0bWw=
該地址經(jīng)過base64加密,可以通過如下地址進行解密:
https://base64.supfree.net
準(zhǔn)備工具:
chome瀏覽器,python3.7語言環(huán)境,pycharm,百度字體編輯器:http://fontstore.baidu.com/static/editor/index.html
破解方法:
1、打開chrome瀏覽器,在瀏覽器地址欄中輸入目標(biāo)地址,打開網(wǎng)頁后,在頁面中點擊鼠標(biāo)右鍵,選擇檢查,可以看到相關(guān)文字已被加密。
文字被加密
2、可以通過復(fù)制,來驗證文字是否被加密。如復(fù)制:
老朋友的推薦
復(fù)制出的文字為:
老朋友?推薦
3、此類現(xiàn)象為文字被CSS樣式加密,破解步驟如下:
1、通過瀏覽器開發(fā)者模式,找到頁面中文字所使用的css樣式 2、通過抓包等方法找到加載的css文件,通過正則表達式取出字體文件URL 3、通過百度字體編輯器解析woff文件:http://fontstore.baidu.com/static/editor/index.html 4、使用fontTools處理字體文件,得出對應(yīng)關(guān)系 5、通過對應(yīng)關(guān)系解析加密字體
4、首先使用python的request模塊請求該頁面,通過正則表達式獲取字體文件URL,請求該URL,獲取到字體文件,寫入到本地。
5、通過百度字體編輯器,解析ttf文件
6、通過百度字體編輯器,可以看到,"的"對應(yīng)的字體編碼為"$EC2A",接下來通過python下的fontTools模塊讀取該TTF文件,并建立文字對應(yīng)關(guān)系,保存為字典。
7、通過for循環(huán)遍歷該文字對應(yīng)關(guān)系字典,對原網(wǎng)頁返回進行替換,即可得到正常數(shù)據(jù)。
老朋友的推薦,去看了一幾個牌子,頭都看暈了,沒有結(jié)果,決定不了買哪個牌子,九了女兒意見,準(zhǔn)備在榮威里面選盤款。性價上最高的就是I5了,看中這款的原因,并不是因為配置高,也不是養(yǎng)力強,而是囊中羞澀,預(yù)算控有那么電啊?,而榮威這個品牌過硬,質(zhì)量可靠,故障率低,朋友買了都說挺一的。暫時沒有,還是覺外有點說不過去??!買車看車子做這個決定,是和女兒共同商量決定的,我看中的是這個牌子的知名度,品質(zhì)這些方面,女兒的話是喜歡這款車型的十觀,女孩子嘛,都是十貌協(xié)會,兩廂車上較炫酷,十形時尚養(yǎng)感,適合年輕妹子。女兒盤看就中意了。
代碼參考:
https://github.com/freedom-wy/js-reverse/tree/master/autohome/koubei
歡迎交流,一起學(xué)習(xí),一起進步。
另外,我在慕課網(wǎng)上主講課程:
《Python爬蟲工程師必學(xué)——App數(shù)據(jù)抓取實戰(zhàn)》,還請各位大神多多支持。課程地址:
理, 參考python Selenium.
Rust 對應(yīng)的支持庫: thirtyfour.
thirtyfour 是一個用于在 Rust 中使用 WebDriver / Selenium 生態(tài)系統(tǒng)自動化 Web 瀏覽器的 crate。它還為 Chrome DevTools 協(xié)議提供了一些支持,Cypress 和 Playwright 等流行框架都使用了該協(xié)議。
它旨在成為一個 "batteries-included "的框架,用于所有與 Web 瀏覽器自動化相關(guān)的事物,尤其是 Web 應(yīng)用程序的自動化測試
本次實驗采用chrome瀏覽器,windows 系統(tǒng)下.
請先下載chrome瀏覽器的webdriver. 注意版本一定要跟當(dāng)前chrome瀏覽器版本一致.
https://chromedriver.chromium.org/downloads
Step 1:
手動啟動 chromedriver.exe 或者自動啟動,代碼如下:
將chromedriver.exe復(fù)制到當(dāng)前項目目錄.
let dir=current_dir().unwrap();
let exe=dir.join("chromedriver.exe");
Command::new(exe)
.spawn()
.expect("啟動[chromedriver.exe]失敗!");
Step2:
連接webseriver. webservier將監(jiān)聽在本機9515端口.
let username="test0000";
let password="test0001";
// caps 支持啟動參數(shù). 具體請參考api.
let mut caps=DesiredCapabilities::chrome();
// 連接到web driver.
let driver=WebDriver::new("http://127.0.0.1:9515", caps).await?;
/// 載入登錄頁面.
driver.goto("https://login.xxxx.xxxx.com/cse/#/login").await?;
/// 找到輸入手機號的地方. xpath, input輸入框,提示符為請輸入手機號.
let elem_phone=driver.find(By::XPath("//input[@placeholder='請輸入手機號']")).await?;
/// 輸入賬號.
elem_phone.send_keys(username).await?;
///找到密碼輸入框. id是login-pwd. 通過F12 查找元素去找規(guī)則.
let elem_password=driver.find(By::Id("login-pwd")).await?
/// 輸入密碼.
elem_password.send_keys(password).await?;
/// 找到登錄按鈕.
let login_btn=driver.find(By::ClassName("ui-login-from__btn")).await?;
// 點擊登錄按鈕.
login_btn.click().await?;
通過查找html元素找到元素的匹配規(guī)則,再做操作.
API 參考文檔:
https://stevepryde.github.io/thirtyfour/introduction.html
固定時間等待.
//等待3秒.
sleep(Duration::from_secs(3)).await;
查詢只到某個元素出現(xiàn),看以下代碼,這個地方會阻塞.
// 等待,只到元素出現(xiàn)或者超時為止.
let login_btn=driver.find(By::ClassName("ui-login-from__btn")).first().await?;
一些對安全性要求比較高的網(wǎng)站比如網(wǎng)銀會對密碼輸入采用專用控件. 甚至對輸入的鍵碼進行了加密,
這種情況下send_keys是不會起作用的,可行的解決方案是采用驅(qū)動級的虛擬鍵盤,模擬鍵盤操作.來實現(xiàn)功能.
本文采用DD虛擬鍵盤來實現(xiàn).
通過rust ffi接口,調(diào)用DD虛擬鍵盤的DLL.
DD虛擬鍵盤項目地址:
https://github.com/ddxoft/master
封裝示例代碼如下.
/// DD 虛擬鍵盤.
fn load_dd_virtual_kb()->Result<Library, Box<dyn std::error::Error>> {
unsafe {
let lib=libloading::Library::new("dd40605x64.dll")?;
return Ok(lib) ;
}
}
fn dd_btn(lib:&Library, btn: i32) -> Result<(), Box<dyn std::error::Error>>{
unsafe {
let func: libloading::Symbol<unsafe extern fn(i32)>=lib.get(b"DD_btn")?;
func(btn);
Ok(())
}
}
// 注意,rust 字符串與c str的內(nèi)存布局和結(jié)束符是不同的.
fn dd_press_key(lib:&Library, key:&str) -> Result<(), Box<dyn std::error::Error>> {
unsafe {
let v=CString::new(key).unwrap();
let func: libloading::Symbol<unsafe extern fn(*const c_char)>=lib.get(b"DD_str")?;
// info!("Press Key:{}", key);
let c_pr: *const c_char=v.as_ptr();
func(c_pr);
Ok(())
}
}
// 慢慢按 1秒1個
async fn dd_press_key_slow(lib:&Library, keys:&str) -> Result<(), Box<dyn std::error::Error>> {
for c in keys.chars() {
let r=dd_press_key(&lib, format!("{}", c).as_str())?;
sleep(Duration::from_millis(1000)).await;
}
Ok(())
}
則上面輸入密碼框的做法是.
*請認真填寫需求信息,我們會在24小時內(nèi)與您取得聯(lián)系。