測試的同窗忽然跟我說要在Nodejs上調起Jenkins(https://jenkins.io/)構建,我首先想到就是調用Jenkins的API,可是具體怎麼作呢?程序員
經過fiddler(http://www.telerik.com/fiddler)找到點擊構建時候調用的API:json
找到了相似 POST: http://jenkins_url/view//job/... 結構API
I get you! 講道理經過直接post到上述接口就能夠了,固然要複製cookie以繞開登陸。說幹就幹,在ARC(Advanced REST client)添加URL,拷貝cookie進去,點擊發送,發現如下錯誤:api
Error 403 No valid crumb was included in the request
這個明顯就是CSRF校驗擋住了個人路。雖然我總喜歡在本身的項目加CSRF校驗,可是無比討厭別人的站點也加,這個明顯就是不讓我作壞事嘛。可是簡單的CSRF就能阻止程序員搞事情麼?開玩笑!
根據CSRF的原理,要破也是很簡單的嘛。首先咱們能夠向服務器請求一次拿到一個token值,而後再發第二次請求時帶上token就能夠了。
先去Google搜一下"jenkins CSRF",找到這樣一篇文章,https://wiki.jenkins.io/displ...安全
jenkins官方wiki就提供了完整方法。服務器
CSRF Protection
If your Jenkins uses the "Prevent Cross Site Request Forgery exploits" security option (which it should), when you make a POST request, you have to send a CSRF protection token as an HTTP request header.cookie
For curl/wget you can obtain the header needed in the request from the URL JENKINS_URL/crumbIssuer/api/xml (or .../api/json). Something like this:curl
wget -q --auth-no-challenge --user USERNAME --password PASSWORD --output-document - \ 'JENKINS_URL/crumbIssuer/api/xml?xpath=concat(//crumbRequestField,":",//crumb)'
還好我略懂英文。文章已經很清楚地指出能夠經過GET JENKINS_URL/crumbIssuer/api/xml的方式拿到一個crumbRequestField和crumb,而後在下一次請求帶上就能夠了。post
上面的代碼轉換成常規http請求就是:測試
get: http://USERNAME:PASSWORD@JENKINS_URL/crumbIssuer/api/xml
我查了一下文檔,發現其實也能夠用jsonui
get: http://USERNAME:PASSWORD@JENKINS_URL/crumbIssuer/api/json
注意: 必定不能忘了加USERNAME:PASSWORD哦
那些喜歡用curl的同窗能夠用如下的語句:
curl -X GET http:/JENKINS_URL/crumbIssuer/api/json --user USERNAME:PASSWORD
返回的結果結構以下:
{"_class":"hudson.security.csrf.DefaultCrumbIssuer","crumb":"******","crumbRequestField":"Jenkins-Crumb"}
拿到crumb以後放到請求頭就能夠了,例如我用curl能夠這樣寫:
curl -X POST JENKINS_URL/job/JOB_NAME/build \ --user USER:PASSWORD \ --header "Jenkins-Crumb:***"
執行一下,發現jenkins能夠自動構建了,打完收工。
有安全潔癖的同窗看到USERNAME:PASSWORD就很不爽,其實能夠用token代替password, 即USERNAME:TOKEN
在用戶設置中能夠看到本身的Token