http://blog.csdn.net/sinat_31659933/article/details/49756333
PHP 使用curl向一個https的url做請求,打印結果 ,總是為 false
解決辦法:
很明顯,驗證證書的時候出現了問題。
使用curl如果想發起的https請求正常的話有2種做法: 方法一、設定為不驗證證書和host。 在執行curl_exec()之前。設置option $ch = curl_init(); ###################################################### #我的代碼是加上了下面兩句,作用是不驗證證書和host # # curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE); # curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE); # ##################################################### #我的代碼如下: $url = 'https://192.168.74.47/index.php/Home/index/denyin.html'; $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_HEADER, false); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE); $res = curl_exec($ch); $rescode = curl_getinfo($ch, CURLINFO_HTTP_CODE); curl_close($ch) ; var_dump($res); #結果如下: string '{"username":"wuhui","password":"123456"}' (length=40) 方法二、設定一個正確的證書。 本地ssl判別證書太舊,導致鏈接報錯ssl證書不正確。 我們需要下載新的ssl 本地判別文件 http://curl.haxx.se/ca/cacert.pem 放到 程序文件目錄 curl 增加下面的配置 curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,true); ; curl_setopt($ch,CURLOPT_CAINFO,dirname(__FILE__).'/cacert.pem'); 大功告成
症狀:php curl調用https出錯
排查方法:在命令行中使用curl調用試試。
原因:服務器所在機房無法驗證SSL證書。
解決辦法:跳過SSL證書檢查。
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); 症狀:php curl調用curl_exec返回bool(false),命令行curl調用正常。 排查方法: var_dump(curl_error($ch)); 返回: string(23) "Empty reply from server" 再排查: curl_setopt($ch, CURLOPT_HEADER, true); curl_setopt($ch, CURLOPT_RETURNTRANSFER, false); 返回: HTTP/1.1 100 Continue Connection: close 原因:php curl接收到HTTP 100就結束了,應該繼續接收HTTP 200 解決方案: curl_setopt($ch, CURLOPT_HTTPHEADER, array('Expect:')); PHP and cURL: Disabling 100-continue header Published June 15th, 2006 I've been using cURL (through PHP) to build a sort of proxy for a project I'm working on. I need to parse the returned headers (to recover the HTTP status), so had included a very simple script to do so. It had worked fine in the past, but for some reason barfed in this case. A closer look at what was being returned revealed that for some reason, Apache was prepending the ‘normal' headers with an extra response header: HTTP/1.1 100 Continue HTTP/1.1 200 OK Date: Fri, 09 Jun 2006 15:23:42 GMT Server: Apache ...A bit of Googling revealed that this was to do with a header that cURL sends by default: Expect: 100-continue …which in turns tells Apache to send the extra header. I poked around a fair bit but couldn't quite find a workable solution short of manually removing the header in PHP, which seemed a bit clumsy. Finally, on a hunch I tried this: curl_setopt( $curl_handle, CURLOPT_HTTPHEADER, array( 'Expect:' ) ); …which basically overrides the original ‘Expect:' header with an empty one. Hope this helps someone.
php的curl獲取https加密協議請求返回json數據進行信息獲取
<?php header("Content-type:text/html; charset=utf-8"); function getToken($url){ $ch = curl_init(); curl_setopt($ch, CURLOPT_URL,$url); curl_setopt($ch, CURLOPT_RETURNTRANSFER,1); //相當關鍵,這句話是讓curl_exec($ch)返回的結果可以進行賦值給其他的變量進行,json的數據操作,如果沒有這句話,則curl返回的數據不可以進行人為的去操作(如json_decode等格式操作) curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); return curl_exec($ch); //$row=curl_getinfo($ch, CURLINFO_HTTP_CODE); } $row=getToken("https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=wxXXXXX&secret=1fd56a90sadfasdfxxfsdfsf"); $obj=json_decode($row); echo $obj->access_token;
curl偽造IP和來源
本文實例講述了php使用CURL偽造IP和來源的方法。分享給大家供大家參考。具體分析如下:
偽造IP來源對於php來說是很簡單的一件事情,我們只要利用了php的curl即可實現偽造IP來源的功能,IP地址你可以隨便寫.
index.php實例代碼如下:
代碼如下:
$ch = curl_init(); curl_setopt($ch, CURLOPT_URL, "http://localhost/curl.php"); curl_setopt($ch, CURLOPT_HTTPHEADER, array('X-FORWARDED-FOR:8.8.8.8', 'CLIENT-IP:8.8.8.8'));//IP curl_setopt($ch, CURLOPT_REFERER, "http://www.jb51.net/ "); //來路 curl_setopt($ch, CURLOPT_HEADER, 1); $out = curl_exec($ch); curl_close($ch); curl.php代碼如下: 代碼如下: function getClientIp() { if (!emptyempty($_SERVER["HTTP_CLIENT_IP"])) $ip = $_SERVER["HTTP_CLIENT_IP"]; else if (!emptyempty($_SERVER["HTTP_X_FORWARDED_FOR"])) $ip = $_SERVER["HTTP_X_FORWARDED_FOR"]; else if (!emptyempty($_SERVER["REMOTE_ADDR"])) $ip = $_SERVER["REMOTE_ADDR"]; else $ip = "err"; return $ip; } echo "IP: " . getClientIp() . ""; echo "referer: " . $_SERVER["HTTP_REFERER"]; 用index.php 請求 curl.php,輸出結果: IP:8.8.8.8 referer:http://www.jb51.net 偽造成功,這是不是給采集的朋友提供了很好的換IP的方案,當然防被刷的朋友也要注意了. 補充: PHP中的CURL函數庫(Client URL Library Function)如下: curl_close — 關閉一個curl會話 curl_copy_handle — 拷貝一個curl連接資源的所有內容和參數 curl_errno — 返回一個包含當前會話錯誤信息的數字編號 curl_error — 返回一個包含當前會話錯誤信息的字符串 curl_exec — 執行一個curl會話 curl_getinfo — 獲取一個curl連接資源句柄的信息 curl_init — 初始化一個curl會話 curl_multi_add_handle — 向curl批處理會話中添加單獨的curl句柄資源 curl_multi_close — 關閉一個批處理句柄資源 curl_multi_exec — 解析一個curl批處理句柄 curl_multi_getcontent — 返回獲取的輸出的文本流 curl_multi_info_read — 獲取當前解析的curl的相關傳輸信息 curl_multi_init — 初始化一個curl批處理句柄資源 curl_multi_remove_handle — 移除curl批處理句柄資源中的某個句柄資源 curl_multi_select — Get all the sockets associated with the cURL extension, which can then be "selected" curl_setopt_array — 以數組的形式為一個curl設置會話參數 curl_setopt — 為一個curl設置會話參數 curl_version — 獲取curl相關的版本信息 curl_init()函數的作用初始化一個curl會話,curl_init()函數唯一的一個參數是可選的,表示一個url地址. curl_exec()函數的作用是執行一個curl會話,唯一的參數是curl_init()函數返回的句柄. curl_close()函數的作用是關閉一個curl會話,唯一的參數是curl_init()函數返回的句