1. 程式人生 > >利用圖片傳輸資料的另類思路

利用圖片傳輸資料的另類思路

提醒:本文最後更新於 1037 天前,文中所描述的資訊可能已發生改變,請謹慎使用。

本部落格之前的《畫素化你的程式碼》文章中,我介紹了一種將文字生成圖片的方法,還提供了一個 Encode/Decode 工具。在那篇文章中,我寫到「這又是一個除了好玩並沒什麼卵用的東西」,確實如此。不過,我今天想到一個用圖片傳遞資料的另類應用場景,分享給大家。

在 Android 系統中,很多 App 為了在網頁裡實現一些客戶端的功能,往往會在客戶端開啟一個本地 HTTP 服務。通過在網頁中呼叫這個服務的不同介面,可以輕鬆實現原本無法實現的功能。本文不討論這種做法本身,只說存在的問題:隨著越來越多 Web 產品升級到 HTTPS,通過 JSONP 或 XHR2 與 HTTP 服務互動就行不通了。

現代瀏覽器(Chrome、Firefox、Safari、Microsoft Edge),基本上都遵守了 W3C 的 Mixed Content 規範,將 Mixed Content 分為 Optionally-blockableBlockable 兩類:

Optionally-blockable 類 Mixed Content 包含那些危險較小,即使被中間人篡改也無大礙的資源。現代瀏覽器預設會載入這類資源,同時會在控制檯列印警告資訊。這類資源包括:

  • 通過 <img> 標籤載入的圖片(包括 SVG 圖片);
  • 通過 <video> / <audio><source>
    標籤載入的視訊或音訊;
  • 預讀的(Prefetched)資源;

除此之外所有的 Mixed Content 都是 Blockable,瀏覽器必須禁止載入這類資源。所以現代瀏覽器中,對於 HTTPS 頁面中的 JavaScript、CSS 等 HTTP 資源,一律不載入,直接在控制檯列印錯誤資訊。

Android 各版本的 Chrome,Android 5+ 的 Webview 都遵守了 Mixed Content 規範。也就是說除非將本地 HTTP 服務升級為 HTTPS,否則在 HTTPS 網頁中通過 JSONP 或 XHR2 呼叫本地服務,預設都會被阻止。就像這樣:

https web with local http url

而且,這個問題解決起來並不容易:

  • 本地 HTTP 服務目的是為了在不可控瀏覽器中實現一些特定功能(可控瀏覽器直接注入 JS 介面即可),也就意味著無法通過修改瀏覽器安全設定繞過這個問題;
  • 本地 HTTP 服務使用的是本地 IP(如 127.0.0.1),無法通過 CA 申請合法證書;
  • 如果自己簽發證書,需要 root 許可權修改系統受信任證書列表,否則不被信任照樣會被攔截;
  • 使用解析到本地 IP 的公開域名,可以解決證書合法性問題,但這麼做需要把證書私鑰內建在客戶端,風險很大;
  • 這個問題也無法通過服務端代理中轉來解決;

那麼,有沒有其它資料互動方案可以繞過 Mixed Content 限制呢?顯然,圖片類 HTTP 資源屬於 Optionally-blockable 類 Mixed Content,現代瀏覽器預設不阻止他們載入,只會在控制檯列印警告,位址列不顯示小綠鎖而已,可以好好利用。

所以,網頁端單向通知 App,不需要拿返回值時,直接把本地介面請求改用 Image 傳送即可。

如果需要返回值,那就可以用我之前的方案將文字編為圖片,成功載入後解碼圖片即可還原內容。這裡要注意一點:給圖片響應配置 CORS 頭之後(並且在請求圖片時加上 img.crossOrigin = '*'),才能在 Canvas 中讀到它的畫素點資料。

原理差不多就是這些,下面是一個例子(使用閱讀器的同學請點到原文檢視):

這個例子演示瞭如何通過圖片在 HTTPS 網站中獲取 HTTP 介面資料,用到了 Canvas。實際上,如果返回值可列舉,連 Canvas 也可以省了 —— 介面直接返回寬 1px,高 npx 的圖片,JS 獲取圖片高度即可知道返回值。

--EOF--

提醒:本文最後更新於 1037 天前,文中所描述的資訊可能已發生改變,請謹慎使用。

相關推薦

利用圖片傳輸資料思路

提醒:本文最後更新於 1037 天前,文中所描述的資訊可能已發生改變,請謹慎使用。 本部落格之前的《畫素化你的程式碼》文章中,我介紹了一種將文字生成圖片的方法,還提供了一個 Encode/Decode 工具。在那篇文章中,我寫到「這又是一個除了好玩並沒什麼卵用的東西」,確實如此。不過,我今天想到一個

解決 "Script Error" 的思路

本文由小芭樂發表 前端的同學如果用 window.onerror 事件做過監控,應該知道,跨域的指令碼會給出 "Script Error." 提示,拿不到具體的錯誤資訊和堆疊資訊。 這裡讀者可以跟我一起做一個實驗,來深入瞭解這個事情。先做一下實驗準備: app.js 建立一個 Node AP

【CSS】純CSS思路代替display、visibility解決子選單延遲消失

  在設計子選單時候,需要實現當滑鼠移動到選單時候,子選單顯示,否則子選單都處於隱藏狀態。實現這個功能使用js的話很簡單實現,但是我想用純CSS,使用純CSS的話,就會遇到滑鼠移開選單後,子選單就馬上消失了(display:noe或者visibility:hidden),就滑

利用tar或dd在不同操作系統間傳輸文件的方法

數據恢復 數據遷移 遷移方法 在不同操作系統之間進行文件傳送的方式有很多種。如果網絡可通,可以使用FTP、SFTP、NFS、SAMBA(CIFS)、HTTP等方式進行傳輸;如果網絡不通,則可以使用兩個操作系統之間共同支持的文件系統進行傳輸,比如軟盤、光盤或最常用的FAT文件系統等;還可以使用兩個操

e-Learning Class(極域電子教室客戶端)的破解思路

宣告一下:本文僅用作技術研究 小小的娛樂一下 學校有一個機房用的極域電子教室 就是這種   版本不太清楚  估計有點老 記得剛開學時試過好像是登錄檔可以直接看到退出密碼 HKEY_LOCAL_MACHINE\SOFTWARE\TopDomain\

利用基本資料封裝(如:Integer,Float)等實現資料型別轉換

/** * 利用基本資料封裝類進行資料型別轉換 * @author dyh * */ public class TypeConversion { public static void main(String[] args) { //字串轉換為各常用基本資料型別 String str

Android破解學習之路(十三)—— 的破解VIP思路

前言 一般按照以往,我們想要獲得某個軟體的VIP,一般是通過修改支付寶的支付流程,原本購買失敗的,我們修改程式碼,從而使得失敗變成了成功,不花費金錢 另類思路 有些軟體將判斷使用者是否為VIP的程式碼寫在了本地,這樣我們就可以修改這個程式碼獲得VIP,注意是有些軟體,並不是所有 判斷VIP也是一個簡單

爬蟲:從PDF檔案中爬取表格資料

簡介   本文將展示一個稍微不一樣點的爬蟲。   以往我們的爬蟲都是從網路上爬取資料,因為網頁一般用HTML,CSS,JavaScript程式碼寫成,因此,有大量成熟的技術來爬取網頁中的各種資料。這次,我們需要爬取的文件為PDF檔案。本文將展示如何利用Python的camelot模組

利用ZeroMQ傳輸圖片

待傳輸的資料 cv::Mat mat 訂閱端(sub) import cv2 import zmq sub_port = 6666 context = zmq.Context() #connect to socket we subscrib socket_sub = context.s

flash利用crossdomain.xml跨域傳輸資料

使用crossdomain.xml讓Flash可以跨域傳輸資料 本文來自http://www.mzwu.com/article.asp?id=975 本文來自https://www.cnblogs.com/jiuyi/p/6068190.html 一、概述 位於www.mzwu

利用反射機制建立工具資料進行加密和解密

對資料庫的資料進行加密,包括使用者資料、專案資料、聊天資料等,需要在插入表的的時候進行加密,查詢的時候進行解密。利用java的反射機制,建立以下工具類,對資料進行加解密。 public class CryptoUtil { /** * 加密、解密方法 * @param ob

一種的讀取 json 資料方式

ValueError: Expecting property name enclosed in double quotes: line 1 column 2(char 1) 在做 scrapy 爬蟲時,獲取的資料存入 json 時有些資料格式不對,導致各種問題

python---將一個資料夾下的圖片移到一個資料

import os, sys from PIL import Image """ 將filePath檔案下的圖片儲存在newFilePath資料夾下的相應子資料夾中 pic 是字典,存放每個圖片要移到的子資料夾名 """ def moveImg(filePath, new

的連結串列資料結構以及演算法

一般情況下,我們使用連結串列無非就是在連結串列結點中儲存該連結串列中下一個元素的指標.如果為了刪除方便,可能需要儲存前一個元素的指標,也就是雙向連結串列,這樣在刪除一個結點的時候就可以很快的定位到前面和後面的結點,並且改變它們相應的指向.在這些操作裡面,指向連結串列元素的指標無疑是最關鍵的資料.考慮這

利用fiddler 截獲微信傳輸資料 (方便抓取公眾號資訊)

前言:本文章是搭配《批量獲取微信公眾號》一文,介於群裡朋友很熱情,我就趁著上班測完bug 來撰寫該文章,那麼讀完本文,你會學習到什麼呢? 什麼是fiddler,他和其他抓包軟體有什麼區別,如何使用fiddler進行抓包如何利用fiddler抓取https 的流量,如何安裝

linux中編寫指令碼實現將某資料夾下半小時之內的圖片複製到一個資料夾下(簡單)實現

1.首先在根目錄下我建立一個叫sh的資料夾 命令:    mkdir sh  2.進入sh資料夾中  命令:    cd sh 3.我們首先建立一個名叫test.sh的指令碼  命令: touch test.sh   並且對這個指令碼進行許可權賦予   命令:     

關於二維情況下切蛋糕問題的思路

這個情況下,我們不再考慮切幾刀,而是圓周上有n個點,每一刀的刀痕都必須通過圓周上這n個點中的兩個點的情況。求最大分割數。 這個問題有一個非常有趣又詭異的答案 當只有1個點的時候,最多隻能有11個區域 當有2個點的時候,最多可以分成22個區域 當有3個

利用伺服器返回header來傳輸資料

提醒:本文最後更新於 3750 天前,文中所描述的資訊可能已發生改變,請謹慎使用。 在Ajax程式設計時,經常需要從服務端獲取資料。通常情況下,我們是直接把要傳輸的資料放在response正文中,再用responseText或者responseXML來得到內容。最近偶然發現,有時候也可以把資料放在h

Outlook小技巧 批量處理圖片大小

轉換為成體積較小的jpg格式圖片   如果你的照片是TIFF、RAW 等非jpg 格式,那麼想把它們批量轉換成體積較小的jpg格式該如何操作呢?   (1)通過單擊“開始”,然後雙擊“計算機”來開啟 Windows 資源管理器(或者Windows 鍵+E)。   註釋 在

TF之CNN:利用sklearn(自帶手寫圖片識別資料集)使用dropout解決學習中overfitting的問題+Tensorboard顯示變化曲線

import tensorflow as tf from sklearn.datasets import load_digits #from sklearn.cross_validation import train_test_split from sklearn.model_selection import