咱們公司最近手機端H5 常常受到商戶和用戶的投訴,說有廣告而且致使不能正常進行操做,咱們商戶本身固然不會加廣告了,可是商戶和用戶可無論這些了,就認爲是咱們的問題javascript
目前咱們用的不少瀏覽器,都提供插件功能,在Chrome瀏覽器體系下有個 廣了結結者插件:能夠用來屏蔽網頁中的廣告部分。受到這個插件的影響,我先探索下 廣告劫持是怎麼作的?我就想到經過獲取網頁html代碼過來分析,以下JS代碼php
setTimeout(function(){ $.ajax({ url:"/error/ad_log", type:'post', data:{ 'content': $("html").html(), 'url':window.location.href }, success:function(){ } }); },3000);
在後端我分析html內容發現以下截圖幾個內容,經過截圖發現頁面多了一些JS文件css
<script type="text/javascript" id="1qa2ws" charset="utf-8" src="http://wap.zjtoolbarc60.10086.cn:8080/www/default/base.js"></script>
經過上圖咱們就分析出了,通常劫持是經過在頁面加入引入一個JS文件,而後這個JS文件會執行各類邏輯,根據新引入的JS域名搜索,你就會發現不少東西了,
html
知道了病狀不表明就必定能夠解決,例如咱們公司的就很奇葩,由於廣告的插入致使JS所有出錯用戶沒法進行操做(太可*,插入廣告就算了,還致使別人沒法正常運營)。經過搜索我發現了能夠經過CSP解決這個問題java
CSP 全稱爲 Content Security Policy,即內容安全策略。主要以白名單的形式配置可信任的內容來源,在網頁中,可以使白名單中的內容正常執行(包含 JS,CSS,Image 等等),而非白名單的內容沒法正常執行,從而減小跨站腳本攻擊(XSS),固然,也可以減小運營商劫持的內容注入攻擊。git
在 HTML 的 Head 中添加以下 Meta 標籤,將在符合 CSP 標準的瀏覽器中使非同源的 script 不被加載執行。不支持 CSP 的瀏覽器將自動會忽略 CSP 的信息,不會有什麼影響。具體兼容性可在本文末尾參考資料中找到github
<meta http-equiv="Content-Security-Policy" content="script-src 'self'">
Content-Security-Policy: script-src 'unsafe-inline' 'unsafe-eval' 'self' *.54php.cn *.yunetidc.com *.baidu.com *.cnzz.com *.duoshuo.com *.jiathis.com;report-uri /error/csp
指令 | 取值示例 | 說明 |
---|---|---|
default-src | 'self' cdn.example.com | 定義針對全部類型(js/image/css/web font/ajax/iframe/多媒體等)資源的默認加載策略,某類型資源若是沒有單獨定義策略,就使用默認。 |
script-src | 'self' js.example.comweb *.54php.cn ajax *://*.54php.cn後端 https://*.54php.cn |
定義針對JavaScript的加載策略 |
object-src | 'self' | 針對,, 等標籤的加載策略 |
style-src | 'self' css.example.com | 定義針對樣式的加載策略 |
img-src | 'self' image.example.com | 定義針對圖片的加載策略 |
media-src | 'media.example.com' | 針對或者引入的html多媒體等標籤的加載策略 |
frame-src | 'self' | 針對iframe的加載策略 |
connect-src | 'self' | 針對Ajax、WebSocket等請求的加載策略。不容許的狀況下,瀏覽器會模擬一個狀態爲400的響應 |
font-src | font.qq.com | 針對Web Font的加載策略 |
sandbox | allow-forms allow-scripts | 對請求的資源啓用sandbox |
report-uri | /some-report-uri | 告訴瀏覽器若是請求的資源不被策略容許時,往哪一個地址提交日誌信息。不阻止任何內容,能夠改用Content-Security-Policy-Report-Only頭 |
base-uri | 'self' | 限制當前頁面的url(CSP2) |
child-src | 'self' | 限制子窗口的源(iframe、彈窗等),取代frame-src(CSP2) |
form-action | 'self' | 限制表單可以提交到的源(CSP2) |
frame-ancestors | 'none' | 限制了當前頁面能夠被哪些頁面以iframe,frame,object等方式加載(CSP2) |
plugin-types | application/pdf | 限制插件的類型(CSP2) |
因爲採用白名單方式,因此這個名單要更具業務可能會有變化,因此的謹慎使用,若是配置不當致使頁面沒法加載就麻煩啦
數據以下:廣告蛋糕太大了,好多人都想分點
164 119.4.249.166:8080 225 www.tjqonline.cn 250 221.179.140.145:9090 364 220.196.52.141:30000 544 101.251.211.235 545 jdwx01.b0.upaiyun.com 1587 wap.zjtoolbarc60.10086.cn:8080