1. 緊急求助,關於php中curl的
cURL可以使用URL的語法模擬瀏覽器來傳輸數據,
因為它是模擬瀏覽器,因此它同樣支持多種協議,
FTP, FTPS, HTTP, HTTPS, GOPHER, TELNET, DICT, FILE 以及 LDAP等協議都可以很好的支持,包括一些:
HTTPS認證,HTTP POST方法,HTTP PUT方法,FTP上傳,keyberos認證,HTTP上傳,代理伺服器,cookies,用戶名/密碼認證,
下載文件斷點續傳,上傳文件斷點續傳,http代理伺服器管道,甚至它還支持IPv6,scoket5代理伺服器,通過http代理伺服器上傳文件
到FTP伺服器等等。
這就是我們為什麼要使用cURL的原因!
使用cURL完成簡單的請求主要分為以下四步:
1.初始化,創建一個新cURL資源
2.設置URL和相應的選項
3.抓取URL並把它傳遞給瀏覽器
4.關閉cURL資源,並且釋放系統資源
我們來採集一個頁面,通常情況下,我們會使用file_get_contents()函數來獲取:
像這樣:
<?php
$str = file_get_contents('http://bbs.lampbrother.net');
//或者是:
$str = file("http://bbs.lampbrother.net");
//或者是:
readfile("http://bbs.lampbrother.net");
?>
這樣我們會發現,我們沒有辦法有效地進行錯誤處理,更重要的是我們沒有辦法完成一些高難度的任務:
如:處理cookies,驗證,表單提交,文件上傳等等。
好,現在我們來用代碼完成上述cURL的四步:
<?php
//1.初始化,創建一個新cURL資源
$ch = curl_init();
//2.設置URL和相應的選項
curl_setopt($ch, CURLOPT_URL, "http://www.lampbrother.net/");
curl_setopt($ch, CURLOPT_HEADER, 0);
//3.抓取URL並把它傳遞給瀏覽器
curl_exec($ch);
//4.關閉cURL資源,並且釋放系統資源
curl_close($ch);
?>
上述四步中,其中第二步最為關鍵,可以設置一些高級選項:
例如上例中的CURLOPT_URL和CURLOPT_HEADER,分別代表「需要獲取的URL地址」和「啟用時會將頭文件的信息作為數據流輸出」,這些只是冰山一角,我們還可以設置很多選項:
選項 可選value值 備注
CURLOPT_AUTOREFERER 當根據Location:重定向時,自動設置header中的Referer:信息。
CURLOPT_BINARYTRANSFER 在啟用CURLOPT_RETURNTRANSFER的時候,返回原生的(Raw)輸出。
CURLOPT_COOKIESESSION 啟用時curl會僅僅傳遞一個session cookie,忽略其他的cookie,默認狀況下cURL會將所有的cookie返回給服務端。session cookie是指那些用來判斷伺服器端的session是否有效而存在的cookie。
CURLOPT_CRLF 啟用時將Unix的換行符轉換成回車換行符。
CURLOPT_DNS_USE_GLOBAL_CACHE 啟用時會啟用一個全局的DNS緩存,此項為線程安全的,並且默認啟用。
CURLOPT_FAILONERROR 顯示HTTP狀態碼,默認行為是忽略編號小於等於400的HTTP信息。
CURLOPT_FILETIME 啟用時會嘗試修改遠程文檔中的信息。結果信息會通過curl_getinfo()函數的CURLINFO_FILETIME選項返回。 curl_getinfo().
CURLOPT_FOLLOWLOCATION 啟用時會將伺服器伺服器返回的"Location: "放在header中遞歸的返回給伺服器,使用CURLOPT_MAXREDIRS可以限定遞歸返回的數量。
CURLOPT_FORBID_REUSE 在完成交互以後強迫斷開連接,不能重用。
CURLOPT_FRESH_CONNECT 強制獲取一個新的連接,替代緩存中的連接。
CURLOPT_FTP_USE_EPRT 啟用時當FTP下載時,使用EPRT (或 LPRT)命令。設置為FALSE時禁用EPRT和LPRT,使用PORT命令 only.
CURLOPT_FTP_USE_EPSV 啟用時,在FTP傳輸過程中回復到PASV模式前首先嘗試EPSV命令。設置為FALSE時禁用EPSV命令。
CURLOPT_FTPAPPEND 啟用時追加寫入文件而不是覆蓋它。
CURLOPT_FTPASCII CURLOPT_TRANSFERTEXT的別名。
CURLOPT_FTPLISTONLY 啟用時只列出FTP目錄的名字。
CURLOPT_HEADER 啟用時會將頭文件的信息作為數據流輸出。
CURLINFO_HEADER_OUT 啟用時追蹤句柄的請求字元串。 從 PHP 5.1.3 開始可用。CURLINFO_前綴是故意的(intentional)。
CURLOPT_HTTPGET 啟用時會設置HTTP的method為GET,因為GET是默認是,所以只在被修改的情況下使用。
CURLOPT_HTTPPROXYTUNNEL 啟用時會通過HTTP代理來傳輸。
CURLOPT_MUTE 啟用時將cURL函數中所有修改過的參數恢復默認值。
CURLOPT_NETRC 在連接建立以後,訪問~/.netrc文件獲取用戶名和密碼信息連接遠程站點。
CURLOPT_NOBODY 啟用時將不對HTML中的BODY部分進行輸出。
CURLOPT_NOPROGRESS
啟用時關閉curl傳輸的進度條,此項的默認設置為啟用。
Note:
PHP自動地設置這個選項為TRUE,這個選項僅僅應當在以調試為目的時被改變。
CURLOPT_NOSIGNAL 啟用時忽略所有的curl傳遞給php進行的信號。在SAPI多線程傳輸時此項被默認啟用。 cURL 7.10時被加入。
CURLOPT_POST 啟用時會發送一個常規的POST請求,類型為:application/x-www-form-urlencoded,就像表單提交的一樣。
CURLOPT_PUT 啟用時允許HTTP發送文件,必須同時設置CURLOPT_INFILE和CURLOPT_INFILESIZE。
CURLOPT_RETURNTRANSFER 將curl_exec()獲取的信息以文件流的形式返回,而不是直接輸出。
CURLOPT_SSL_VERIFYPEER 禁用後cURL將終止從服務端進行驗證。使用CURLOPT_CAINFO選項設置證書使用CURLOPT_CAPATH選項設置證書目錄 如果CURLOPT_SSL_VERIFYPEER(默認值為2)被啟用,CURLOPT_SSL_VERIFYHOST需要被設置成TRUE否則設置為FALSE。 自cURL 7.10開始默認為TRUE。從cURL 7.10開始默認綁定安裝。
CURLOPT_TRANSFERTEXT 啟用後對FTP傳輸使用ASCII模式。對於LDAP,它檢索純文本信息而非HTML。在Windows系統上,系統不會把STDOUT設置成binary模式。
CURLOPT_UNRESTRICTED_AUTH 在使用CURLOPT_FOLLOWLOCATION產生的header中的多個locations中持續追加用戶名和密碼信息,即使域名已發生改變。
CURLOPT_UPLOAD 啟用後允許文件上傳。
CURLOPT_VERBOSE 啟用時會匯報所有的信息,存放在STDERR或指定的CURLOPT_STDERR中。
對於下面的這些option的可選參數,value應該被設置一個integer類型的值:
選項 可選value值 備注
CURLOPT_BUFFERSIZE 每次獲取的數據中讀入緩存的大小,但是不保證這個值每次都會被填滿。 在cURL 7.10中被加入。
CURLOPT_CLOSEPOLICY 不是CURLCLOSEPOLICY_LEAST_RECENTLY_USED就是CURLCLOSEPOLICY_OLDEST,還存在另外三個CURLCLOSEPOLICY_,但是cURL暫時還不支持。
CURLOPT_CONNECTTIMEOUT 在發起連接前等待的時間,如果設置為0,則無限等待。
CURLOPT_CONNECTTIMEOUT_MS 嘗試連接等待的時間,以毫秒為單位。如果設置為0,則無限等待。 在cURL 7.16.2中被加入。從PHP 5.2.3開始可用。
CURLOPT_DNS_CACHE_TIMEOUT 設置在內存中保存DNS信息的時間,默認為120秒。
CURLOPT_FTPSSLAUTH FTP驗證方式:CURLFTPAUTH_SSL (首先嘗試SSL),CURLFTPAUTH_TLS (首先嘗試TLS)或CURLFTPAUTH_DEFAULT (讓cURL自動決定)。 在cURL 7.12.2中被加入。
CURLOPT_HTTP_VERSION CURL_HTTP_VERSION_NONE (默認值,讓cURL自己判斷使用哪個版本),CURL_HTTP_VERSION_1_0 (強制使用 HTTP/1.0)或CURL_HTTP_VERSION_1_1 (強制使用 HTTP/1.1)。
CURLOPT_HTTPAUTH
使用的HTTP驗證方法,可選的值有:CURLAUTH_BASIC、CURLAUTH_DIGEST、CURLAUTH_GSSNEGOTIATE、CURLAUTH_NTLM、CURLAUTH_ANY和CURLAUTH_ANYSAFE。 可以使用|位域(或)操作符分隔多個值,cURL讓伺服器選擇一個支持最好的值。
CURLAUTH_ANY等價於CURLAUTH_BASIC | CURLAUTH_DIGEST | CURLAUTH_GSSNEGOTIATE | CURLAUTH_NTLM. CURLAUTH_ANYSAFE等價於CURLAUTH_DIGEST | CURLAUTH_GSSNEGOTIATE | CURLAUTH_NTLM.
CURLOPT_INFILESIZE 設定上傳文件的大小限制,位元組(byte)為單位。
CURLOPT_LOW_SPEED_LIMIT 當傳輸速度小於CURLOPT_LOW_SPEED_LIMIT時(bytes/sec),PHP會根據CURLOPT_LOW_SPEED_TIME來判斷是否因太慢而取消傳輸。
CURLOPT_LOW_SPEED_TIME 當傳輸速度小於CURLOPT_LOW_SPEED_LIMIT時(bytes/sec),PHP會根據CURLOPT_LOW_SPEED_TIME來判斷是否因太慢而取消傳輸。
CURLOPT_MAXCONNECTS 允許的最大連接數量,超過是會通過CURLOPT_CLOSEPOLICY決定應該停止哪些連接。
CURLOPT_MAXREDIRS 指定最多的HTTP重定向的數量,這個選項是和CURLOPT_FOLLOWLOCATION一起使用的。
CURLOPT_PORT 用來指定連接埠。(可選項)
CURLOPT_PROTOCOLS
CURLPROTO_*的位域指。如果被啟用,位域值會限定libcurl在傳輸過程中有哪些可使用的協議。這將允許你在編譯libcurl時支持眾多協議,但是限制只是用它們中被允許使用的一個子集。默認libcurl將會使用全部它支持的協議。參見CURLOPT_REDIR_PROTOCOLS. 可用的協議選項為:CURLPROTO_HTTP、CURLPROTO_HTTPS、CURLPROTO_FTP、CURLPROTO_FTPS、CURLPROTO_SCP、CURLPROTO_SFTP、CURLPROTO_TELNET、CURLPROTO_LDAP、CURLPROTO_LDAPS、CURLPROTO_DICT、CURLPROTO_FILE、CURLPROTO_TFTP、CURLPROTO_ALL 在cURL 7.19.4中被加入。
CURLOPT_PROXYAUTH HTTP代理連接的驗證方式。使用在CURLOPT_HTTPAUTH中的位域標志來設置相應選項。對於代理驗證只有CURLAUTH_BASIC和CURLAUTH_NTLM當前被支持。 在cURL 7.10.7中被加入。
CURLOPT_PROXYPORT 代理伺服器的埠。埠也可以在CURLOPT_PROXY中進行設置。
CURLOPT_PROXYTYPE 不是CURLPROXY_HTTP (默認值) 就是CURLPROXY_SOCKS5。 在cURL 7.10中被加入。
CURLOPT_REDIR_PROTOCOLS CURLPROTO_*中的位域值。如果被啟用,位域值將會限制傳輸線程在CURLOPT_FOLLOWLOCATION開啟時跟隨某個重定向時可使用的協議。這將使你對重定向時限制傳輸線程使用被允許的協議子集默認libcurl將會允許除FILE和SCP之外的全部協議。這個和7.19.4預發布版本種無條件地跟隨所有支持的協議有一些不同。關於協議常量,請參照CURLOPT_PROTOCOLS。 在cURL 7.19.4中被加入。
CURLOPT_RESUME_FROM 在恢復傳輸時傳遞一個位元組偏移量(用來斷點續傳)。
CURLOPT_SSL_VERIFYHOST 1 檢查伺服器SSL證書中是否存在一個公用名(common name)。譯者註:公用名(Common Name)一般來講就是填寫你將要申請SSL證書的域名 (domain)或子域名(sub domain)。2 檢查公用名是否存在,並且是否與提供的主機名匹配。
CURLOPT_SSLVERSION 使用的SSL版本(2 或 3)。默認情況下PHP會自己檢測這個值,盡管有些情況下需要手動地進行設置。
CURLOPT_TIMECONDITION 如果在CURLOPT_TIMEVALUE指定的某個時間以後被編輯過,則使用CURL_TIMECOND_IFMODSINCE返回頁面,如果沒有被修改過,並且CURLOPT_HEADER為true,則返回一個"304 Not Modified"的header, CURLOPT_HEADER為false,則使用CURL_TIMECOND_IFUNMODSINCE,默認值為CURL_TIMECOND_IFUNMODSINCE。
CURLOPT_TIMEOUT 設置cURL允許執行的最長秒數。
CURLOPT_TIMEOUT_MS 設置cURL允許執行的最長毫秒數。 在cURL 7.16.2中被加入。從PHP 5.2.3起可使用。
CURLOPT_TIMEVALUE 設置一個CURLOPT_TIMECONDITION使用的時間戳,在默認狀態下使用的是CURL_TIMECOND_IFMODSINCE。
對於下面的這些option的可選參數,value應該被設置一個string類型的值:
選項 可選value值 備注
CURLOPT_CAINFO 一個保存著1個或多個用來讓服務端驗證的證書的文件名。這個參數僅僅在和CURLOPT_SSL_VERIFYPEER一起使用時才有意義。 .
CURLOPT_CAPATH 一個保存著多個CA證書的目錄。這個選項是和CURLOPT_SSL_VERIFYPEER一起使用的。
CURLOPT_COOKIE 設定HTTP請求中"Cookie: "部分的內容。多個cookie用分號分隔,分號後帶一個空格(例如, "fruit=apple; colour=red")。
CURLOPT_COOKIEFILE 包含cookie數據的文件名,cookie文件的格式可以是Netscape格式,或者只是純HTTP頭部信息存入文件。
CURLOPT_COOKIEJAR 連接結束後保存cookie信息的文件。
CURLOPT_CUSTOMREQUEST
使用一個自定義的請求信息來代替"GET"或"HEAD"作為HTTP請求。這對於執行"DELETE" 或者其他更隱蔽的HTTP請求。有效值如"GET","POST","CONNECT"等等。也就是說,不要在這里輸入整個HTTP請求。例如輸入"GET /index.html HTTP/1.0 "是不正確的。
Note: 在確定伺服器支持這個自定義請求的方法前不要使用。
CURLOPT_EGDSOCKET 類似CURLOPT_RANDOM_FILE,除了一個Entropy Gathering Daemon套接字。
CURLOPT_ENCODING HTTP請求頭中"Accept-Encoding: "的值。支持的編碼有"identity","deflate"和"gzip"。如果為空字元串"",請求頭會發送所有支持的編碼類型。 在cURL 7.10中被加入。
CURLOPT_FTPPORT 這個值將被用來獲取供FTP"POST"指令所需要的IP地址。"POST"指令告訴遠程伺服器連接到我們指定的IP地址。這個字元串可以是純文本的IP地址、主機名、一個網路介面名(UNIX下)或者只是一個'-'來使用默認的IP地址。
CURLOPT_INTERFACE 網路發送介面名,可以是一個介面名、IP地址或者是一個主機名。
CURLOPT_KRB4LEVEL KRB4 (Kerberos 4) 安全級別。下面的任何值都是有效的(從低到高的順序):"clear"、"safe"、"confidential"、"private".。如果字元串和這些都不匹配,將使用"private"。這個選項設置為NULL時將禁用KRB4 安全認證。目前KRB4 安全認證只能用於FTP傳輸。
CURLOPT_POSTFIELDS 全部數據使用HTTP協議中的"POST"操作來發送。要發送文件,在文件名前面加上@前綴並使用完整路徑。這個參數可以通過urlencoded後的字元串類似'para1=val1¶2=val2&...'或使用一個以欄位名為鍵值,欄位數據為值的數組。如果value是一個數組,Content-Type頭將會被設置成multipart/form-data。
CURLOPT_PROXY HTTP代理通道。
CURLOPT_PROXYUSERPWD 一個用來連接到代理的"[username]:[password]"格式的字元串。
CURLOPT_RANDOM_FILE 一個被用來生成SSL隨機數種子的文件名。
CURLOPT_RANGE 以"X-Y"的形式,其中X和Y都是可選項獲取數據的范圍,以位元組計。HTTP傳輸線程也支持幾個這樣的重復項中間用逗號分隔如"X-Y,N-M"。
CURLOPT_REFERER 在HTTP請求頭中"Referer: "的內容。
CURLOPT_SSL_CIPHER_LIST 一個SSL的加密演算法列表。例如RC4-SHA和TLSv1都是可用的加密列表。
CURLOPT_SSLCERT 一個包含PEM格式證書的文件名。
CURLOPT_SSLCERTPASSWD 使用CURLOPT_SSLCERT證書需要的密碼。
CURLOPT_SSLCERTTYPE 證書的類型。支持的格式有"PEM" (默認值), "DER"和"ENG"。 在cURL 7.9.3中被加入。
CURLOPT_SSLENGINE 用來在CURLOPT_SSLKEY中指定的SSL私鑰的加密引擎變數。
CURLOPT_SSLENGINE_DEFAULT 用來做非對稱加密操作的變數。
CURLOPT_SSLKEY 包含SSL私鑰的文件名。
CURLOPT_SSLKEYPASSWD
在CURLOPT_SSLKEY中指定了的SSL私鑰的密碼。
Note: 由於這個選項包含了敏感的密碼信息,記得保證這個PHP腳本的安全。
CURLOPT_SSLKEYTYPE CURLOPT_SSLKEY中規定的私鑰的加密類型,支持的密鑰類型為"PEM"(默認值)、"DER"和"ENG"。
CURLOPT_URL 需要獲取的URL地址,也可以在curl_init()函數中設置。
CURLOPT_USERAGENT 在HTTP請求中包含一個"User-Agent: "頭的字元串。
CURLOPT_USERPWD 傳遞一個連接中需要的用戶名和密碼,格式為:"[username]:[password]"。
對於下面的這些option的可選參數,value應該被設置一個數組:
對於下面的這些option的可選參數,value應該被設置一個流資源 (例如使用fopen()):
對於下面的這些option的可選參數,value應該被設置為一個回調函數名:
選項 可選value值
CURLOPT_HEADERFUNCTION 設置一個回調函數,這個函數有兩個參數,第一個是cURL的資源句柄,第二個是輸出的header數據。header數據的輸出必須依賴這個函數,返回已寫入的數據大小。
CURLOPT_PASSWDFUNCTION 設置一個回調函數,有三個參數,第一個是cURL的資源句柄,第二個是一個密碼提示符,第三個參數是密碼長度允許的最大值。返回密碼的值。
CURLOPT_PROGRESSFUNCTION 設置一個回調函數,有三個參數,第一個是cURL的資源句柄,第二個是一個文件描述符資源,第三個是長度。返回包含的數據。
CURLOPT_READFUNCTION 擁有兩個參數的回調函數,第一個是參數是會話句柄,第二是HTTP響應頭信息的字元串。使用此函數,將自行處理返回的數據。返回值為數據大小,以位元組計。返回0代表EOF信號。
CURLOPT_WRITEFUNCTION 擁有兩個參數的回調函數,第一個是參數是會話句柄,第二是HTTP響應頭信息的字元串。使用此回調函數,將自行處理響應頭信息。響應頭信息是整個字元串。設置返回值為精確的已寫入字元串長度。發生錯誤時傳輸線程終止。
看到了吧,只要在第二個函數之內設置這些選項就可以完成相應的功能,cURL的功能是灰常強大滴,大家可以嘗試一下哦!
例如,我們只想把獲取到的內容輸入到文件,而不是直接輸出給瀏覽器,我們就可以使用CURLOPT_RETURNTRANSFER選項!
這樣在curl執行的時候,就會把頁面的內容輸出到文件當中,我們就可以完成採集等功能
2. 求php語言編寫的留言板源碼!!!!!!!!!
這是一個簡單的留言本,目前還沒有後台管理程序。如果哪位高手能補上,那就太好了。
演示在http://www.ideawu.net/person/liuyan
留言保存在message.txt文件中,留言的格式為:date<$>ip<$>name<$>content
"<$>"為分隔符號
注意:源碼文件和message.txt文件必須以gbk格式保存。如果你不知道如何保存文件為gbk格式,請咨詢你的文本編輯器軟體提供商。
/****************************************
* 本代碼可以用作任何用途,但是與作者無關。
* 也就是,你使用本代碼獲取收益或者因此受
* 到損害,後果與作者無關。
****************************************/
file: index.php
代碼:
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gbk">
<title>留言板</title>
<link rel="stylesheet" href="../msg.css" type="text/css">
</head>
<body>
<br><B><FONT COLOR="#0000FF">圖片留言板</FONT></B>
<center>
<table width="800" border="1" bordercolor="#88CCEE" cellspacing="0" cellpadding="4" style="border-collapse:collapse; word-break:break-all">
<tr><td style="border-right-style: none">
<form method="post" action="savemsg.php" style="font-size: 13px">
姓名:<br><input type="text" name="guest_name" maxlength=32 size=32><br>
留言:(字數:<font color="#0000FF"><span id=sNum>0</span></font>/256)<br>
<textarea class="textForm" name="guest_msg" cols="64" rows="8" onkeyup="sNum.innerHTML=this.value.length"></textarea><br>
<input class="button" type="submit" name="submit" value="發表留言">
<input class="button" type="reset" value="重置" name="reset">
</form>
</td></tr>
</table>
<?php
include("showmsg.php");
if(!empty($_GET['p'])){
$num=$_GET['p'];
showpage($num);
}else showpage(1);
?>
</center>
</body>
</html>
file: showmsg.php
代碼:
<?php
function showpage($p)
{ ?>
<table width="800" border="0" bordercolor="#88CCEE" cellspacing="0" cellpadding="4" style="border-collapse:collapse; word-break:break-all;font-size:12px;">
<tr><td>
<p style="line-height: 100%; margin-top: 1; margin-bottom: 1" align="left">
<?php
$perPage=7; //每頁顯示留言數目
$num=$p;
if($num<1) $num=1;
$prev=$num-1;
$next=$num+1;
$page=$num-1; //當前頁碼
$fname="message.txt"; //存儲留言的文件
$all_msg=file($fname); //將留言讀入數組
$line_count=count($all_msg);
$page_count=ceil($line_count/$perPage);
if($prev>0)
echo "<a href=index.php?p=$prev>上一頁</a>";
else
echo "上一頁";
if($line_count>($next-1)*$perPage)
echo "<a href=index.php?p=$next>下一頁</a>";
else
echo "下一頁";
echo "當前第 ".$num." 頁,共有".$page_count."頁,".$line_count."條留言。";
?>
</p></td></tr>
</table>
<table width="800" border="1" bordercolor="#88CCEE" cellpadding="3" cellspacing="0" style="border-collapse:collapse; font-size:12px; word-break:normal; table-layout:fixed;">
<tr height="18" bgcolor="#5FBEF8"><td width="20%">
<b>留言時間/留言者</b></td><td width="86%"><b>留言內容</b>
</td></tr>
<?php
//顯示留言
$bg1="#FBF9F9"; $bg2="#E9EFF4";$bg=$bg2;
for($n=$line_count-1-$page*$perPage;$line_count-1-$page*$perPage-$n<$perPage;$n--){
$bg=($bg==$bg1)? $bg2:$bg1; //變換背景顏色
if(!empty($all_msg[$n])){
list($date,$ip,$name,$msg)=explode("<$>",$all_msg[$n],4); //獲取留言內容
echo "<tr bgcolor=$bg>";
echo "<td width=14%>".$date."<br><b>".$name."</b></td>";
echo "<td width=86%>".$msg."</td>";
echo "</tr>";
}
}
?>
</table>
<table width="800" border="0" bordercolor="#88CCEE" cellspacing="0" cellpadding="4" style="border-collapse:collapse; word-break:break-all;font-size:12px">
<tr><td>
<p style="line-height: 100%; margin-top: 2; margin-bottom: 2" align="left">
<?php
if($prev>0)
echo "<a href=index.php?p=$prev>上一頁</a>";
else
echo "上一頁";
if($line_count>($next-1)*$perPage)
echo "<a href=index.php?p=$next>下一頁</a>";
else
echo "下一頁";
echo "當前第 ".$num." 頁,共有".$page_count."頁,".$line_count."條留言。";
?>
</p></td></tr>
</table>
<?php } ?>
file: savemsg.php
代碼:
<?php
$MSG_MAX_LEN=512; //留言最大長度
if (getenv("HTTP_CLIENT_IP"))
$ip= getenv("HTTP_CLIENT_IP");
elseif (getenv("HTTP_X_FORWARDED_FOR"))
$ip= getenv("HTTP_X_FORWARDED_FOR");
else
$ip= getenv("REMOTE_ADDR");
//獲取IP地址結束
$date=date("Y年m月d日 H:i:s",time());
if(empty($_POST['guest_name']))
die("請填你的名字。<a href=index.php>Refresh</a>");
if(empty($_POST['guest_msg']))
die("請填寫留言內容再提交。<a href=index.php>Refresh</a>");
$guest_name=strip_tags($_POST['guest_name']);
$guest_msg=substr($_POST['guest_msg'],0,$MSG_MAX_LEN);
//write message to file
//make the message be a line when stored
$guest_msg = str_replace( "\r\n", "\n", $guest_msg);
$guest_msg = str_replace( "\r", "\n", $guest_msg);
$guest_msg = str_replace(" "," ",$guest_msg);
$guest_msg = str_replace(">",">",$guest_msg);
$guest_msg = str_replace("<","<",$guest_msg);
$guest_msg = str_replace("\'","'",$guest_msg);
$guest_msg = nl2br($guest_msg);
//保存留言,以追加的形式
$fname="message.txt";
$fp=fopen($fname,"a+");
fwrite($fp,$date."<$>".$ip."<$>".$guest_name."<$>".$guest_msg."\n");
fclose($fp);
echo "<meta http-equiv='refresh' content='0;url=index.php'>";
?>
用於顯示效果的樣式表文件
file: msg.css
代碼:
A:link {
color: #0033FF;
text-decoration: none;
}
A:visited {
color: #0033FF;
text-decoration: none;
}
A:hover {
color: #30A300;
text-decoration: underline;
}
A:active {
color: #0036A9;
text-decoration: none;
}
BODY{
font-family: Verdana,Arial,Helvetica,sans-serif;
font-size: 12px;
background: #FBF9F9;
}
TABLE{
font-family: Verdana,Arial,Helvetica,sans-serif;
font-size: 12px;
border-collapse: collapse;
table-layout: fixed;
margin: 0px;
}
3. php防止sql注入漏洞有哪些函數
一個是沒有對輸入的數據進行過濾(過濾輸入),還有一個是沒有對發送到資料庫的數據進行轉義(轉義輸出)。這兩個重要的步驟缺一不可,需要同時加以特別關注以減少程序錯誤。
對於攻擊者來說,進行SQL注入攻擊需要思考和試驗,對資料庫方案進行有根有據的推理非常有必要(當然假設攻擊者看不到你的源程序和資料庫方案),考慮以下簡單的登錄表單:
<form action="/login.php" method="POST">
<p>Username: <input type="text" name="username" /></p>
<p>Password: <input type="password" name="password" /></p>
<p><input type="submit" value="Log In" /></p>
</form>
作為一個攻擊者,會從推測驗證用戶名和密碼的查詢語句開始。通過查看源文件,就能開始猜測站長的習慣。
比如命名習慣。通常會假設表單中的欄位名為與數據表中的欄位名相同。當然,確保它們不同未必是一個可靠的安全措施。
第一次猜測,一般會使用下面例子中的查詢:
<?php
$password_hash = md5($_POST['password']);
$sql = "SELECT count(*)
FROM users
WHERE username = '{$_POST['username']}'
AND password = '$password_hash'";
?>
當然,攻擊者未必在第一次就能猜中,常常還需要做一些試驗。有一個比較好的試驗方式是把單引號作為用戶名錄入,原因是這樣可能會暴露一些重要信息。有很多開發人員在Mysql語句執行出錯時會調用函數mysql_error()來報告錯誤。見下面的例子:
<?php
mysql_query($sql) or exit(mysql_error());
?>
關於SQL注入,不得不說的是現在大多虛擬主機都會把magic_quotes_gpc選項打開,在這種情況下所有的客戶端GET和POST的數據都會自動進行addslashes處理,所以此時對字元串值的SQL注入是不可行的,但要防止對數字值的SQL注入,如用intval()等函數進行處理。
4. 怎樣架構linux+php+Apache+mysql環境
由於php是一個zip文件(非install版),安裝較為簡單
解壓就行.把解壓的 php-5.2.1-Win32 重命名為 php5.並復制到C盤目錄下.即安裝路徑為 c:\php
1 找到php目錄下的 php.ini.recommended (或者php.ini-dist)文件,重命名為 php.ini
並復制到系統盤的windows目錄下(以c:\windows為例).
2 再把php目錄下的php5ts.dll,libmysql.dll復制到目錄 c:\windows\system32下.
3 把php\ext目錄下的php_gd2.dll,php_mysql.dll,php_mbstring.dll文件復制到c:\windows\system32下
注意:不要把 php_mysql.dll 和 php_mssql.dll 混淆
如果沒有載入 php_gd2.dll php將不能處理圖像.沒有載入php_mysql.dll php將不支持mysql函數庫
php_mbstring.dll在後面使用phpmyadmin時支持寬字元
配置php並關聯MySQL
1 設置擴展路徑
查找 extension_dir 有這么一行
extension_dir = "./"
將此行改成
extension_dir = "C:\php\ext"
其中C:\php是你安裝php的路徑.路徑不正確將無法載入dll
(注意:有些php版本是 ;extension_dir = "./" 要把前面的分號去掉)
2 分別查找
;extension=php_mbstring.dll
;extension=php_gd2.dll
;extension=php_mysql.dll
把上面3項前面的分號去掉,這樣apache啟動時就可以載入這些dll了
注意不要把 ;extension=php_mysql.dl 和 ;extension=php_mssql.dl 混淆
當然前面我們也把這些dll復制到system32下了.(大家在安裝的過程中都注意到如何把一些dll載入入來了.
以後要載入一些dll,比如說php_mysqli.dll,也就懂得怎麼載入了)
3 設置會話保存路徑
查找session.save_path 有這么一行
; session.save_path = "N;/path"
在此行後加入一行(注意是加入一行,不是加到後面)
session.save_path = "C:\WINDOWS\Temp"
保存到你的臨時目錄下,這里完全可以保存到windows臨時目錄Temp下
4 是否顯示錯誤 display_errors
出於安全性考慮,display_errors 有些版本也默認為 Off.
就是說在調試時,如果php代碼有誤,就只出現一個空白頁.而不會顯示出錯原因和出錯行數.
這樣調試起來將非常不便,建議根據自己需要修改
查找
display_errors = Off (注意不是 ; - display_errors = Off [Security])
改成
display_errors = On
5 php5時差問題
<?php echo date("Y-m-d H:i:s");?>時間相差八小時
為什麼呢?PHP5系列版本新增了時區設置,默認為格林威治時間,與中國所在的東8區正好相差8個小時
查找date.timezone有這么一行
;date.timezone =
將;去掉,改成、
date.timezone = PRC
其中PRC:People's Republic of China 中華人民共和國,
PHP的文件上傳問題
文件上傳成敗關鍵的幾點php.ini配置
文件上傳的程序沒有錯,但php的配置很可能導致文件不能上傳成功.
一般的文件上傳,除非文件很小.就像一個5M的文件,很可能要超過一分鍾才能上傳完.
但在php中,默認的該頁最久執行時間為 30 秒.就是說超過30秒,該腳本就停止執行.
這就導致出現 無法打開網頁的情況.這時我們可以修改 max_execution_time
在php.ini里查找
max_execution_time
默認是30秒.改為
max_execution_time = 0
0表示沒有限制
另一種方法是可以在php程序中加入
set_time_limit();
來設定頁面最久執行時間.
set_time_limit(0);//0表示沒有限制
修改 post_max_size 設定 POST 數據所允許的最大大小。此設定也影響到文件上傳。
php默認的post_max_size 為2M.如果 POST 數據尺寸大於 post_max_size $_POST 和 $_FILES superglobals 便會為空.
查找 post_max_size .改為
post_max_size = 150M
很多人都會改了第二步.但上傳文件時最大仍然為 8M.
為什麼呢.我們還要改一個參數upload_max_filesize 表示所上傳的文件的最大大小。
查找upload_max_filesize,默認為8M改為
upload_max_filesize = 100M
另外要說明的是,post_max_size 大於 upload_max_filesize 為佳.
active perl 需要安裝到c:/perl
ZendOptimizer 安裝時把 apache 伺服器關掉,在過程中要指定 apache 和 php 的安裝路徑
在Win2K環境下安裝Apache PHP
軟體需求:
Windows 2000 Professional ; Apache 1.3.19 (apache_1.3.19-win32-src-r2.msi) ; PHP 4.0.5 (php-4.0.5-Win32.zip) ; MySQL 3.23.38 (mysql-3.23.38-win.zip)
安裝過程
將 Apache 1.3.19 安裝到 C:\Web\apache\ 目錄下。
將 PHP 4.0.5 解壓到 C:\Web\php\ 目錄下。
將 MySQL 3.23.38 安裝到 C:\Web\mysql\ 目錄下。
將 C:\web\php\php4ts.dll 文件拷貝到 C:\WINNT\system32\ 目錄下。
將 C:\web\php\php.exel 文件拷貝到 C:\WINNT\ 目錄下。
將 C:\web\php\php.ini-dist 文件拷貝到 C:\WINNT\ 目錄下,並將php.ini-dist 更名為 php.ini。
運行 C:\Web\apache\Apache\Apache.exe -i –n
運行 C:\Web\mysql\bin\mysqld-nt.exe --install
編輯 C:\WINNT\php.ini
找到 「extension_dir = ./ 」 欄位,將其改為 extension_dir = "C:\myphp\php\extensions"。
運行 C:\Web\apache\Apache\Apache.exe -i –n
編輯 C:\Web\apache\Apache\conf\httpd.conf
找到「 #BindAddress*」 欄位
將其改為 BindAddress 127.0.0.1 。(如果主機有固定IP地址,此處改為主機IP地址。如 BindAddress 211.101.152.106),找到 「ServerName」 欄位,將其改為 ServerName localhost。(如主機有固定主機名,此處改為主機的主機名。如ServerName bn001 )。
找到「 ScriptAlias /cgi-bin/ "C:/Web/apache/Apache/cgi-bin/" 」 欄位,在其下面加入 ScriptAlias /php/ "C:/Web/php/" 。找到 「# And for PHP 4.x, use: 」 欄位,在其後面加入:
AddType application/x-httpd-php .php3
AddType application/x-httpd-php .php4
AddType application/x-httpd-php .php
AddType application/x-httpd-php .phtml
Action Application/x-httpd-php "c:/Web/php/php.exe"
找到「 #LoadMole usertrack_mole moles/mod_usertrack.so」 欄位,LoadMole php4_mole c:/web/php/sapi/php4apache.dll
UNIX下的PHP環境配置
所需軟體
php-3.0.14-win32.zip;php-3.0.14-win32.zip;mysql-shareware-3.22.32-win.zip
所有軟體均安裝在/export/home/guoj/下,也可在其他目錄。
安裝mysql
gzip -dc mysql-3.22.30.tar.gz | tar xvf-
cd mysql-3.22.30
./configure -prefix= /export/home/guoj/mysql
Make
make install
scripts/mysql_install_db
cd../mysql/bin
bin/safe_mysqld & 安裝php apache
gzip -dc apache_1.3.11.tar.gz | tar xvf-
gzip -dc php-3.0.11.tar.gz | tar xvf-
cd apache_1.3.11
./configure -prefix= /export/home/guoj/www
cd ../php-3.0.11
./configure -with-apache= /export/home/guoj/apache_1.3.11
-with-mysql= /export/home/guoj/mysql -enable-track-vars
Make
make install
cd ../apache_1.3.11
./configure --prefix= /export/home/guoj/www
--activate-mole=src/moles/php3/libphp3.aP
Make
make install
cd ../php-3.0.11
cd ../php3.ini-dist php3.ini
vi php3.ini修改php3.ini
doc_root=/export/home/guoj/www/htdocs/
extension_dir=/export/home/guoj/php-3.0.11/
extension=php3_mysql.dllcp php3.ini/usr/local/lib/php3.inivi ../www/conf/httpd.conf
加上以下幾句:
AddType application/x-httpd-php3 .php3
<Directory "/export/home/guoj/php-3.0.11/">
Options FollowSymLinks
AllowOverride None
</Directory>../www/bin/apachectl start
5. PHP如何開啟curl
開啟php curl函數庫的步驟
1).去掉windows/php.ini 文件里;extension=php_curl.dll前面的; /*用 echo phpinfo();查看php.ini的路徑*/
2).把php5/libeay32.dll,ssleay32.dll復制到系統目錄windows/下
3).重啟apache
配置php支持curl
curl是一個利用URL語法在命令行方式下工作的文件傳輸工具。它支持很多協議:FTP, FTPS, HTTP, HTTPS, GOPHER, TELNET, DICT, FILE 以及 LDAP。curl同樣支持HTTPS認證,HTTP POST方法, HTTP PUT方法, FTP上傳, kerberos認證, HTTP上傳, 代理伺服器, cookies, 用戶名/密碼認證, 下載文件斷點續傳, 上載文件斷點續傳, http代理伺服器管道( proxy tunneling), 甚至它還支持IPv6, socks5代理伺服器, 通過http代理伺服器上傳文件到FTP伺服器等等,功能十分強大。Windows操作系統下的網路螞蟻,網際快車(FlashGet)的功能它都可以做到。准確的說,curl支持文件的上傳和下載,所以是一個綜合傳輸工具,但是按照傳統,用戶習慣稱curl為下載工具。
配置方法:
1、拷貝PHP目錄中的libeay32.dll 和 ssleay32.dll 兩個文件到 system32 目錄。
2、修改php.ini:配置好 extension_dir ,去掉 extension = php_curl.dll 前面的分號。
---------------------------
php下擴展php_curl.dll的安裝
---------------------------
已經內置有php_curl.dll,在ext目錄下,此DLL用於支持SSL和zlib.
在php.ini中找到有extension=php_curl.dll, 去掉前面的注釋.
設置extension_dir=c:phpext, 刷新PHP頁面時報錯, 說找不到模塊php_curl.dll.
拷貝php_curl.dll 到windowssystem32,還是同樣的錯.
在網上找了一下,需要將:
libeay32.dll, ssleay32.dll, php5ts.dll, php_curl.dll
都拷貝到system32目錄下,重啟IIS即可.
6. phpcms後台登陸驗證碼顯示異常
V9的驗證碼在生成後,會把驗證碼的數字存入Session當中。
V9在默認的情況下,Session是存放在資料庫當中的。其在資料庫中的表現如下:
您可以在訪問後台登陸頁後,查看一下資料庫中Session這個表,如果表中沒有類型的數據code|s:4:"***"; 那說明Session沒有成功的寫入到資料庫中。這會使你的登陸失敗。