PHP+MySQL+Dreamweaver整合教學(PHPMaker運用設計網站教學):快速設計網站與網頁
總教頭特別企畫【專業整合課程】比傳統的學習的還要快速與實用!


感謝您造訪 PHP程式設計+MySQL資料庫+Dreamweaver整合教學(PHPMaker運用設計網站教學)密訓基地。 你可進入教學詳細內容介紹頁面,詳細瞭解PHP程式設計+MySQL資料庫(PHPMaker運用設計網站教學)及相關技術維護影片教學(完整配套措施),馬上可以設計架站程式與PHP網頁,快速建立MySQL資料庫、自動生成PHP網頁。可對資料庫進行瀏覽、修改、查詢、加入和刪除(整合成我們需要的網站)。

要在網路上經營網站賺大錢,不能只會下載現有的程式來架站(自己設計才能完全符合專業的特殊需求),你不用死背PHP語法,更可以完全不用花錢用購買資料庫(PHPMySQL完全免費!)你可以透過技術學習,讓PHP程式網頁+網路資料庫+Dreamweaver整合教學→讓你快速成為:【動態網站程式設計專家→你能因此賺大錢】!

 PHP程式設計+MySQL資料庫+Dreamweaver整合教學(PHPMaker運用設計網站教學):

http://por.tw/php/new-E_learning/index.php


PHP程式設計+MySQL資料庫+Dreamweaver整合教學(PHPMaker運用教學)密訓基地  總教頭  敬上

瀏覽模式: 普通 | 列表
PHP程式設計問題諮詢:
為什麼我升級PHP後,原來的程式出現滿螢幕的 Notice: Undefined variable:


---------------------------------------------------------
PHP程式設計問題回覆:
 Notice: Undefined variable:
這是警告的意思,由於變數未定義引起的.
打開php.ini,找到最下面的error_reporting,修改為error_reporting = E_ALL & ~E_NOTICE

對於Parse error錯誤
error_reporting(0)無法關閉.
如果你想關閉任何錯誤提示,打開php.ini,找到display_errors,設置為display_errors = Off.以後任何錯誤都不會提示.

問題:
請問為什麼我向另一網頁傳送變數時,只得到前半部分,以空格開頭的則全部丟失?


<?php
$Var="hello php";//修改為$Var="   hello php";試試得到什麼結果
$post= "receive.php?Name=".$Var;
header("location:$post");
?>

receive.php的內容:


<?PHP
Echo "<pre>";
Echo  $_GET["Name"];
Echo "</pre>";
?>


回覆:
正確的方法是:


<?php
$Var="hello php";
$post= "receive.php?Name=".urlencode($Var);
header("location:$post");
?>

在接收頁面你不需要使用Urldecode(),變數會自動編碼.

網站發生警語:atal error: Allowed memory size of 16777216 bytes exhausted(記憶體不夠用)之處理方法

網站架站或網站升級後,網站發生類似警語:atal error: Allowed memory size of XXXXXXXX bytes exhausted
不管是管理介面(Dashboard),或者登入出問題,看來幾乎都是記憶體不夠用。


例如其發生的警語:
Fatal error: Allowed memory size of 16777216 bytes exhausted (tried to allocate 4023 bytes)

這是什麼意思呢?又該如何解決?
答案是:記憶體的需求是更大了,這邊提供幾個解決的方法。

當出現以下的類似情況,要來調整PHP的記憶體,來執行更多的程式
1.找到php.ini的路徑(/etc/php5/apache2/php.ini)
2.搜尋:memory_limit 字串
3.找到:memory_limit = 16M      ; Maximum amount of memory a script may consume (16MB)

A.如果有權限修改php.ini,那麼請將memory_limit = 32M的32提高,看是要64還是96或者128。
    
B.如果沒有權限修改php.ini,可以在.htaccess裡面加上php_value memory_limit 32M,或者更高的數字。

備註:php.ini修改後apache要重新啟動才會生效!

語法如下:
service apache2 restart


-------------------------------------------------------------

解決PHP時間函數(Date),針對時差部份

解決PHP時間函數(Date),針對時差部份

PHPDate()出現錯誤對於新手來說是比較頭疼的一件事情。
我們給出了具體的解決方法,希望對大家有所說明。

我們在運用PHPDate()這個函數取得時間資料的時候,經常會遇到不準確等一系列問題。
下面我們將為大家具體講解PHPDate()出現錯誤的關聯解決辦法。

取得系統時間時,發現取得的時間與系統的時間不符。
今天用echo date("Y-m-dH:i:s")取得系統時間時,發現取得的時間與系統的時間不符。

PHP是外國人開發的,所以經常有很多東西不太好用。
研究了一番發現,PHP預設設定的時間是以格林威治時區為標準的,表現是和台灣時間差8個小時,因此我們需要將其+8個小時,原理是我們正好位於時區的東8區,所以我們必須把PHP的時區設定改為台北時間。

寫php data這個函數時時間都會有誤差,解決的方法有三個:

 方法有三:( 以GMT+8台北為例 )
一、修改php.ini:
開啟PHP.ini檔案,一般在PHP的安裝根目錄下
找到其中的:date.timezone
刪掉date.timezone前面的分號,並改成:date.timezone=Asia/Taipei
存檔,並重新啟動Apahce服務(有時用Apache的restart功能會有問題,建議先stop然後再start)
重新檢驗一下echodate("Y-m-dH:i:s")。
是不是時間還原標準了

二、在date()前面增加:
date_default_timezone_set('時區');
例如:
date_default_timezone_set('Asia/Taipei');
echo date("Y-m-d H:i:s");
?>
時區列表:http://www.php.net/manual/en/timezones.php
三、直接打上:
例如:
<?php echo date("Y-m-d H:i:s",mktime (date(H)+8, date(i), date(s), date(m), date(d), date(Y)))?>
   
參考資料:http://www.domain.cn/blog/index.php/16064/action_viewspace_itemid_19492.htm

至於更多的data函數運用請參考http://linux.tnc.edu.tw/techdoc/banic/dateandtime/date.html


date

(PHP3 , PHP4)

date ---  將本地的時間/日期格式化

語法 : string date (string format [, int timestamp])

說明 : 

使用給予的timestamp按照格式化字串傳回一格式化字串,如果沒有給予timestamp則使用本地的時間。

以下是格式化字串中認定的字元

  • a - "am" 或 "pm"

  • A - "AM" 或 "PM"

  • B - 網際網路時間樣本

  • d - 幾日,例如" 01" 到 " 31"

  • D - 幾日,以3個英文字表示例如:" Fri "

  • F - 幾月,以英文全名表示例如:" January "

  • g - 小時,12小時制不足2位數不補0例如:" 1" 到 " 12 "

  • G - 小時,24小時制不足2位數不補0例如:" 0 " 到 " 23 "

  • h - 小時12小時制例如:" 01" 到 " 12 "

  • H - 小時,24小時制例如:" 00 "  " 23 "

  • i - 幾分,例如:" 00 " 到 " 59 "

  • I (大寫的 i) - "1" if Daylight Savings Time, "0" otherwise.

  • j - 幾日,不足2位數不補0例如:" 1"  " 31"

  • l (小寫的 'L') - 幾日,以英文全名表示,例如:"Friday"

  • L - 布林值,判斷是否為閏年,例如:" 0"  " 1"

  • m - 幾月,例如:" 01"  " 12"

  • M - 幾月,以3個英文字表示例如:"Jan"

  • n - 幾月,不足2位數不補0例如:" 1" 到 "12"

  • s - 幾秒,例如:" 01"  " 59"

  • S - 以英文後2個字表示,例如:"th","nd"

  • t - 當月的天數,例如:" 28" 到 " 31"

  • T - 這個機器的時間區域設定,例如 "MDT"

  • U - 總秒數

  • w - 以數字表示星期幾,例如" 0" 到 " 6"

  • Y - 幾年,以4位數表示例如:" 1999"

  • y - 幾年,以2位數表示例如:"99"

  • z - 一年中的第幾天,例如:" 0" 到 " 365"

  • Z - 在短時間內時間區域補償(timezone offset) ,例如"-43200" to "43200"

在格式化字串中未被認出的字元將會被列出來,當使用gmdate( )時"Z"格式將總是傳回"0"

Example :

   print (date ("l dS of F Y h:i:s A")); 

   print ("July 1, 2000 is on a " . date ("l", mktime(0,0,0,7,1,2000)));

?>

它可能會和date( )與mktime( )一起使用,來找出是將來或是過去的日期

Example :

   $tomorrow  = mktime (0,0,0,date("m")  ,date("d")+1,date("Y"));

   $lastmonth = mktime (0,0,0,date("m")-1,date("d"),  date("Y"));

   $nextyear  = mktime (0,0,0,date("m"),  date("d"),  date("Y")+1);

?>

將日期格式化成其它的語言(languages),你應該使用setlocal( )和strftime( )函式

你有沒有想要將Mysql資料庫中字符替換?

如何使用SQL語法,將MySQL資料表中的替換字串?

你有這樣的苦惱問題嗎?
當以SQL為資料庫的網站內有大量的文字要修改替換時,最陽春的方法就是一筆一筆的修改(那不是要出人命?)
可是如果需修改的數量龐大,那麼可能就會修改到暈倒了(至少會累倒進醫院吊點滴...)
最快的方法就是利用SQL語法替換字串:


你可以用以下的方法(快速的把字串刪除或換掉!)


phpMyAdmin 替換資料字串(使用phpMyAdmin進入資料庫執行SQL語法)
基本的語法範例如下:
UPDATE `資料表名稱` SET `資料表欄位` = REPLACE(`資料表欄位`,'要替換的文字','替換後的文字') WHERE `資料表欄位` LIKE '%要替換的文字%'

例如:要把logContent欄位中的『</div>』字串刪除!
UPDATE `f2cont_logs` SET `logContent` = REPLACE(`logContent`,'</div>','') WHERE `logContent` LIKE '%</div>%'
--------------------------------------------------------

又例如:要將網址「http://visdacom.com」換成「http://por.tw」!

 UPDATE `f2cont_logs` SET `logContent` = REPLACE(`logContent`,'http://visdacom.com','http://por.tw') WHERE `logContent` LIKE '%http://visdacom.com%'
--------------------------------------------------------
注意:要練習之前請先備份好資料庫不然把資料庫弄壞啦(又沒有備份檔案可以還原時)
我看你會笑不出來,懊惱不已捶胸頓足!

PHP【函式簡介】Require及Require_once( )

PHP【函式簡介】Require及Require_once( )
    require 的使用方法如 require("header.inc"); 。
這個語法通常放在 PHP 程式的最前面,PHP 程式在執行前,就會先讀入 require 所指定引入的檔案,使它變成 PHP 程式網頁的一部份。
常用的函式可以寫成一個函式庫檔案,然後用這個方法將它引入網頁中。

require_once 的作用和 require 是幾乎相同的,唯一的差別在於 require_once 會先檢查要引入的檔案是不是已經在該程式中的其他地方被引入過了。
如果有的話,就不會再次重複引入該檔案。
這項功能有時候是很重要的,比方說要引入的檔案裡面宣告了一些我們自行定義的函數,那麼如果在同一個程式重複引入這個檔案,在第二次引入的時候便會發生錯誤訊息,因為 PHP 不允許相同名稱的函數被重複宣告。

如何達成:隱藏apache和php的版本訊息?(配置方法)

隱藏apache和php的版本訊息可以盡量減少敏感訊息洩露的方法,並不會使你的伺服器真的更安全,如果你現在使用的版本比較舊,請務必盡快將系統升級,降低被蠕蟲攻擊的風險。

隱藏apache和php的版本訊息,web server避免一些不必要的麻煩,可以把apache和php的版本訊息不顯示


隱藏 Apache 版本訊息

/etc/apache2/apache2.conf 或 /etc/httpd/conf/httpd.conf

ServerTokens ProductOnly
ServerSignature Off

重啟 apache
現在 http 頭裡面只看到:
Server: Apache

隱藏 PHP 版本
php.ini

expose_php On
改成
expose_php Off

重啟apache後,php版本在http頭中隱藏了。

詳解 :

為了防止某些別有用心的傢伙窺視我們的伺服器,應該做些什麼.
我們來看一下關聯的2個參數,分別為ServerTokens和ServerSignature,通過控制這2個閥門應該就能起到一些作用,比如我們可以在配置檔案中這麼寫:
ServerTokens Prod
ServerSignature Off

ServerTokens
用於控制伺服器是否相應來自使用者端的請求,向使用者端輸出伺服器系統類型或內建模組等重要的系統訊息。 在主配置檔案中提供全局控制預設閥值為"Full"(ServerTokens Full),所以,如果你的Linux發行版本沒有變更過這個閥值的話,所有與你的系統有關的敏感訊息都會向全世界公開。比如RHEL會將該 閥值變更為"ServerTokens OS",而Debian依然使用預設的"Full"閥值
以apache-2.0.55為例,閥值可以設定為以下某項(後面為相對應的Banner Header):
Prod >>> Server: Apache
Major >>> Server: Apache/2
Minor >>> Server: Apache/2.0
Minimal >>> Server: Apache/2.0.55
OS >>> Server: Apache/2.0.55 (Debian)
Full (or not specified) default >>> Server: Apache/2.0.55 (Debian) PHP/5.1.2-1+b1 mod_ssl/2.0.55 OpenSSL/0.9.8b

ServerSignature
控制由系統生成的頁面(錯誤訊息,mod_proxy ftp directory listing等等)的頁腳中如何顯示訊息。

可在全局設定檔案中控制,或是通過.htaccess檔案控制
預設為"off"(ServerSignature Off),有些Linux發行版本可能會開啟這個閥門,比如Debian在預設的虛擬主電腦上預設將這個閥門設定為開放
全局閥門的閥值會被虛擬主電腦或目錄單位的配置檔案中的閥值所覆蓋,所以,必須確保這樣的事情不應該發生
可用的閥值為下面所示:
Off (default): 不輸出任何頁腳訊息 (如同Apache1.2以及更舊版本,用於迷惑)
On:輸出一行關於版本號以及處於運行中的虛擬主電腦的ServerName (2.0.44之後的版本,由ServerTokens負責是否輸出版本號)
EMail: 建立一個傳輸到給ServerAdmin的"mailto"

注意:上述關於如何設定2個閥門從而盡量減少敏感訊息洩露的方法,並不會使你的伺服器真的更安全,如果你現在使用的版本比較舊,請務必盡快將系統升級,降低被蠕蟲攻擊的風險。

[MySQL改善] -- 如何使用SQL Profiler 效能分析器

[MySQL改善] -- 如何使用SQL Profiler 效能分析器

mysql 的 sql 效能分析器主要用途是顯示 sql 執行的整個過程中各項資源的使用情況。分析器可以更好的展示出不良 SQL 的效能問題所在。
下面我們舉例介紹一下 MySQL SQL Profiler 的使用方法:

    * 首先,開啟 MySQL SQL Profiler


mysql> SELECT @@profiling;
+-------------+
| @@profiling |
+-------------+
| 0 |
+-------------+
1 row in set (0.00 sec)
mysql> SET profiling = 1;
Query OK, 0 rows affected (0.00 sec)
mysql> SELECT @@profiling;
+-------------+
| @@profiling |
+-------------+
| 1 |
+-------------+
1 row in set (0.00 sec)
預設情況下 profiling 的值為 0 表示 MySQL SQL Profiler 處於 OFF 狀態,開啟 SQL 效能分析器後 profiling 的值為 1.


    * 通過 sql 效能分析器,我們來對照一下 下列語句前後 2 次執行過程的差異,對我們瞭解 sql 的詳細執行過程是非常有說明的。


mysql> create table t_engines select * from t_engines1;
Query OK, 57344 rows affected (0.10 sec)
Records: 57344 Duplicates: 0 Warnings: 0
mysql> select count(*) from t_engines;
+----------+
| count(*) |
+----------+
| 57344 |
+----------+
1 row in set (0.00 sec)
mysql> select count(*) from t_engines;
+----------+
| count(*) |
+----------+
| 57344 |
+----------+
1 row in set (0.00 sec)
mysql> SHOW PROFILES;
+----------+------------+-------------------------------------------------+
| Query_ID | Duration | Query |
+----------+------------+-------------------------------------------------+
| 26 | 0.10213775 | create table t_engines select * from t_engines1 |
| 27 | 0.00032775 | select count(*) from t_engines |
| 28 | 0.00003850 | select count(*) from t_engines |
+----------+------------+-------------------------------------------------+
15 rows in set (0.01 sec)
mysql> SHOW PROFILE FOR QUERY 27;
+--------------------------------+------------+
| Status | Duration |
+--------------------------------+------------+
| (initialization) | 0.00000425 |
| checking query cache for query | 0.00004050 |
| checking permissions | 0.00001050 |
| Opening tables | 0.00018250 |
| System lock | 0.00000450 |
| Table lock | 0.00001775 |
| init | 0.00001075 |
| optimizing | 0.00000550 |
| executing | 0.00002775 |
| end | 0.00000450 |
| query end | 0.00000325 |
| storing result in query cache | 0.00000400 |
| freeing items | 0.00000400 |
| closing tables | 0.00000500 |
| logging slow query | 0.00000300 |
+--------------------------------+------------+
15 rows in set (0.00 sec)
mysql> SHOW PROFILE FOR QUERY 28;
+-------------------------------------+------------+
| Status | Duration |
+-------------------------------------+------------+
| (initialization) | 0.00000350 |
| checking query cache for query | 0.00000750 |
| checking privileges on cached query | 0.00000500 |
| checking permissions | 0.00000525 |
| sending cached result to client | 0.00001275 |
| logging slow query | 0.00000450 |
+-------------------------------------+------------+
6 rows in set (0.00 sec)
mysql> SELECT sum( FORMAT(DURATION, 6)) AS DURATION FROM INFORMATION_SCHEMA.PROFILING WHERE QUERY_ID =27 ORDER BY SEQ;
+----------+
| DURATION |
+----------+
| 0.000326 |
+----------+
1 row in set (0.00 sec)
mysql> SELECT sum( FORMAT(DURATION, 6)) AS DURATION FROM INFORMATION_SCHEMA.PROFILING WHERE QUERY_ID =28 ORDER BY SEQ;
+----------+
| DURATION |
+----------+
| 0.000039 |
+----------+
1 row in set (0.00 sec)
mysql>
從上面的例子中我們可以清晰的看出 2 次執行 count 語句的差別, SHOW PROFILE FOR QUERY 27 展現的是第一次 count 統計的執行過程,包括了 Opening tables 、 Table lock 等操作 。而 SHOW PROFILE FOR QUERY 28 展示了第二次 count 統計的執行過程 , 第二次 count 直接從查詢快取中返回 count 統計結果,通過對照 2 次統計的總執行時間發現,快取讀的速度接近物理讀的 10 倍。通過使用 SQL 效能分析器可以說明我們對一些比較難以確定效能問題的 SQL 進行診斷,找出問題根源。
標籤: mysql

伺服器配置:Squid配置詳解

伺服器配置:Squid配置詳解
 
基本配置
安裝完成後,接下來要對Squid的運行進行配置(不是前面安裝時的配置)。所有項目都在squid.conf中完成。Squid自帶的squid.conf內含非常詳盡的說明,相當於一篇使用者手冊,對配置有任何疑問都可以參照解決。

在這個例子中,代理伺服器同時也是通訊閘,內定網路介面eth0的IP位址為192.168.0.1,外部網路接eth1的IP位址為202.103.x.x。下面是一個基本的代理所需要配置選項:

http_port 192.168.0.1:3128

預設埠是3128,當然也可以是任何其它埠,只要不與其它服務發生衝突即可。為了安全起見,在前面加上IP位址,Squid就不會監聽外部的網路介面。 下面的配置選項是伺服器管理者的電子信件,當錯誤發生時,該位址會顯示在錯誤頁面上,便於使用者聯繫:

cache_mgr start@por.com

以下這些參數告訴Squid快取的檔案系統、位置和快取策略:

cache_dir ufs /var/squid cache_mem 32MB cache_swap_low 90 cache_swap_high 95

在這裡,Squid會將/var/squid目錄作為儲存快取資料的目錄,每次處理的快取大小是32兆位元組,當快取空間使用達到95%時,新的內容將 取代舊的而不直接新增到目錄中,直到空間又下降到90%才停止這一活動。

如果不想Squid快取任何檔案,如某些存儲空間有限的專有系統,可以使用 null檔案系統(這樣不需要那些快取策略):

cache_dir null /tmp

下面的幾個關於快取的策略配置中,較主要的是第一行,即使用者的訪問記錄,可以通過分析它來瞭解所有使用者訪問的詳盡位址:

cache_access_log /var/squid/access.log cache_log /var/squid/cache.log cache_store_log /var/squid/store.log

下面這行配置是在較新版本中出現的參數,告訴Squid在錯誤頁面中顯示的伺服器名稱:

visible_hostname No1.proxy

以下配置告訴Squid如何處理使用者,對每個請求的IP位址作為單獨位址處理:

client_netmask 255.255.255.255

如果是普通代理伺服器,以上的配置已經足夠。但是很多Squid都被用來做透明代理。

所謂透明代理,就是用戶端不知道有代理伺服器的存在,當然也不需要進行任何與代理有關的設定,從而大大方便了系統管理員。關聯的選項有以下幾個:

httpd_accel_host virtual httpd_accel_port 80 httpd_accel_with_proxy on httpd_accel_user_host_header on

在Linux上,可以用iptables/ipchains直接將對Web埠80的請求直接轉信到Squid埠3128,由Squid接手,而使用者瀏覽器仍然認為它訪問的是對方的80埠。例如以下這條指令:

iptables -t nat -A PREROUTING -s 192.168.0.200/32 -p tcp --dport 80 -j REDIRECT 3128

page
    就是將192.168.0.200的所有針對80埠的訪問重導至3128埠。

所有設定完成後,關鍵且重要的任務是訪問控制。Squid支援的管理模式很多,使用起來也非常簡單(這也是有人寧願使用不做任何快取的Squid,也 不願意單獨使用iptables的原因)。

Squid可以通過IP位址、主電腦名、MAC位址、使用者/密碼認證等識別使用者,也可以通過功能變數名、功能變數副檔名、檔案類 型、IP位址、埠、URL符合等控制使用者的訪問,還可以使用時間區間對使用者進行管理,所以訪問控制是Squid配置中的重點。

Squid用ACL (Access Control List,訪問控制清單)對訪問類型進行劃分,用http_access deny 或allow進行控制。根據需求首先定義兩組使用者advance和normal,還有代表所有未指明的使用者組all及不容許上網的baduser,配置代 碼如下:

acl advance 192.168.0.2-192.168.0.10/32 acl normal src 192.168.0.11-192.168.0.200/32 acl baduser src 192.168.0.100/32 acl baddst dst www.soocol.com acl all src 0.0.0.0/0 http_access deny baduser http_access allow advance http_access allow normal

可以看出,ACL的基本格式如下: acl 清單名稱 控制模式 控制目的 比如acl all src 0.0.0.0/0,其名稱是all,控制模式是src源IP位址,控制目的是0.0.0.0/0的IP位址,即所有未定義的使用者。出於安全考慮,總是在最後禁止這個清單。 下面這個清單代表進階使用者,內含IP位址從192.168.0.2到192.168.0.10的所有電腦:

acl advance 192.168.0.2-192.168.0.20/32

下面這個baduser清單只包括一台電腦,其IP位址是192.168.0.100:

acl baduser 192.168.0.100/32

ACL寫完後,接下來要對它們分別進行管理,代碼如下:

http_access deny baduser http_access allow advance http_access allow normal

上面幾行代碼告訴Squid不容許baduser組訪問Internet,但advance、normal組容許(此時還沒有指定詳細的權限)。由 於 Squid是按照順序讀取規則,會首先禁止baduser,然後容許normal。如果將兩條規則順序顛倒,由於baduser在normal範圍中, Squid先容許了所有的normal,那麼再禁止baduser就不會起作用。

特別要注意的是,Squid將使用allow-deny-allow-deny……這樣的順序套用規則。例如,當一個使用者訪問代理伺服器時, Squid會順序測試Squid中定義的所有規則清單,當所有規則都不符合時,Squid會使用與最後一條相反的規則。

就像上面這個例子,假設有一個使用者 的IP位址是192.168.0.201,他試圖通過這台代理伺服器訪問Internet,會發生什麼情況呢?我們會發現,他能夠標準訪問,因為 Squid找遍所有訪問清單也沒有和192.168.0.201有關的定義,便開始應用規則,而最後一條是deny,那麼Squid預設的下一筆處理規則 是allow,所以192.168.0.201反而能夠訪問Internet了,這顯然不是我們希望的。所以在所有squid.conf中,最後一條規則 永遠是http_access deny all,而all就是前面定義的「src 0.0.0.0」。

進階控制

前面說過,Squid的控制功能非常強大,只要理解Squid的行為模式,基本上就能夠滿足所有的控制要求。下面就一步一步來瞭解Squid是如何進行控制管理的。

通過IP位址來識別使用者很不可靠,比IP位址更好的是網路卡的MAC物理位址。要在Squid中使用MAC位址識別,必須在編譯時加上「--enable-arp-acl」選項,然後可以通過以下的語句來識別使用者:

acl advance arp 00:01:02:1f:2c:3e 00:01:02:3c:1a:8b ...

它直接使用使用者的MAC位址,而MAC位址一般是不易修改的,即使有普通使用者將自己的IP位址改為進階使用者也無法通過,所以這種模式比IP位址可靠得多。

假如不想讓使用者訪問某個網站應該怎麼做呢?可以分為兩種情況:一種是不容許訪問某個站台的某個主電腦,比如ok的主電腦是ok.sina.com.cn,而其它的新浪資源卻是容許訪問的,那麼ACL可以這樣寫:

acl sinapage dstdomain ok.sina.com.cn ... ... http_access deny ok ... ...

page
    另一種情況是整個網站都不許訪問,那麼只需要寫出這個網站共有的功能變數名即可,配置如下:

acl qq dstdomain .tcccent.com.cn

注意tcccent前面的「.」,正是它指出以此功能變數名結尾的所有主電腦都不可訪問,否則就只有tcccent.com.cn這一台主電腦不能訪問。

如果想禁止對某個IP位址的訪問,如202.118.2.182,可以用dst來控制,代碼如下:

acl badaddr dst 202.118.2.182

當然,這個dst也可以是功能變數名,由Squid查詢DNS伺服器將其轉換為IP。

還有一種比較廣泛的控制是檔案類型。如果不希望普通使用者通過代理伺服器下載MP3、AVI等檔案,完全可以對他們進行限制,代碼如下:

acl mmxfile urlpath_regex .mp3$ .avi$ .exe$ http_access deny mmxfile

看到regex,很多讀者應該心領神會,因為這條語句使用了標準的規則表達式(又叫正則表達式)。它將符合所有以.mp3、.avi等結尾的URL請求,還可以用-i參數忽略大小寫,例如以下代碼:

acl mmxfile urlpath_regex -i .mp3$

這樣,無論是.mp3還是.MP3都會被拒絕。當然,-i參數適用於任何可能需要區分大小寫的地方,如前面的功能變數名控制。

如果想讓普通使用者只在上班時間可以上網,而且是每週的工作日,用Squid應當如何處理呢?看看下面的ACL定義:

acl worktime time MTWHF 8:30-12:00 14:00-18:00 http_access deny !worktime

首先定義容許上網的時間是每週工作日(星期一至星期五)的上午和下午的固定時段,然後用http_access 定義所有不在這個時間段內的請求都是不容許的。

或是為了保證進階使用者的頻寬,希望每個使用者的並發連線不能太多,以免影響他人,也可以通過Squid控制,代碼如下:

acl conncount maxconn 3 http_access deny conncount normal http_access allow normal

這樣,普通使用者在某個固定時刻只能同時發起三個連線,從第四個開始,連線將被拒絕。

總之,Squid的ACL配置非常靈活、強大,更多的控制模式可以參考squid.conf.default。

認證

使用者/密碼認證為Squid管理提供了更多便利,最常用的認證模式是NCSA。從Squid 2.5版本開始,NCSA認證包括在了basic中,而非以前單獨的認證模組。下面來看看實現認證的具體操作。

首先在編譯時配置選項應內含以下配置:

--enable-auth="basic" --enable-basic-auth-helpers="NCSA"

page
    「make install」以後,需要將「helpers/basic_auth/NCSA/ncsa_auth」複製到使用者可執行目錄中,如/usr/bin(如 果在該目錄中找不到這個執行檔案,在編譯時請使用make all而不是make,或是直接在該目錄中執行make),然後需要借助Apache的密碼管理程式htpasswd來生成使用者名/密碼對應的檔案,就像 下面這行代碼:

htpasswd -c /var/squid/etc/password guest

在輸入兩遍guest使用者的密碼後,一個guest使用者就生成了。如果以後需要加入使用者,把上面的指令去掉-c參數再運行即可。

Squid 2.5在認證處理上有了較大的改變,這裡就只討論2.5版本的處理方法,2.4及以下版本請參考squid.conf.default。在2.5版的squid.conf中,內含以下幾個關聯選項:

該選項指出了認證模式(basic)、需要的程式(ncsa_auth)和對應的密碼檔案(password)

auth_param basic program /usr/bin/ncsa_auth /var/squid/etc/password

指定認證程式的程式數

auth_param basic children 5

瀏覽器顯示輸入使用者/密碼對話框時的領功能變數內容

auth_param basic realm My Proxy Caching Domain

基本的認證有效時間

auth_param basic credentialsttl 2 hours

普通使用者需要通過認證才能訪問Internet

acl normal proxy_auth REQUIRED http_access allow normal

通過以上的配置即可完成認證工作。有的讀者可能要問:認證只針對普通使用者,而進階使用者是直接上網的,該怎麼處理呢?其實,這兩種使用者是可以共存的。

如 前所述,Squid是順序處理http_access的,所以在http_access處理過程中,如果先處理normal使用者,那麼現用的使用者無論是否屬 於進階使用者,都會被要求進行認證;相反如果先處理進階使用者,剩下的就只有需要認證的普通使用者了。例如以下配置代碼:

... http_access allow normal (需要認證) http_access allow advance (不需要認證) ...

不管是否為noauth使用者,都要求進行使用者名/密碼驗證。正確的方法是將二者位置交換,代碼如下:

... http_access allow advance http_access allow normal ...

這時,進階使用者不會受到任何影響。

總結

下面把整個squid.conf總結一下:

伺服器配置

http_port 192.168.0.1:3128 cache_mgr start@por.com cache_dir null /tmp cache_access_log /var/squid/access.log cache_log /var/squid/cache.log cache_store_log /var/squid/store.log visible_hostname No1.proxy client_mask 255.255.255.255 httpd_accel_host virtual httpd_accel_port 80 httpd_accel_with_proxy on httpd_accel_user_host_header on

使用者分類

acl advance arp 00:01:02:1f:2c:3e 00:01:02:3c:1a:8b ... acl normal proxy_auth REQUIED acl all src 0.0.0.0

行為分類

acl mmxfile urlpath_regex .mp3$ .avi$ .exe$ acl conncount maxconn 3 acl worktime time MTWHF 8:30-12:00 14:00-18:00 acl sinapage dstdomain ok.sina.com.cn acl qq dstdomain .tcccent.com.cn

處理

http_access allow advance http_access deny conncount normal http_access deny !worktime http_access deny mmxfile http_access deny sinapage http_access deny qq http_access allow normal

配置後的狀況是,advance組可以不受任何限制地訪問Internet,而normal組則只能在工作時間上網,而且不能下載多媒體檔案,不能訪問某些特定的站台,而且傳送請求不能超過3個。

通過本文的介紹,它可以瞭解Squid的基本能力。當然,它的能力遠不止此,可以建立強大的代理伺服器陣列,可以說明本地的Web伺服器提高效能,可以提高本地網路的安全性等。要想發揮它的功效,還需要進一步控制。

PHP網站如何防止CC攻擊呢?

PHP網站如何防止CC攻擊呢?

所謂的CC攻擊就是對方利用程式或一些代理對您的網站進行不間斷的訪問,造成您的網站處理不了而處於當機狀態。
這種時候您的統計系統(可能是量子、百度等)當然也是統計不到的。
不過我們可以借助於一些防攻擊的軟體來實現,不過效果有時並不明顯。
下面我提供一段PHP的代碼,可以起到一定的防CC效果。

主要功能:在3秒內連續重整頁面5次以上將指向本機 http://127.0.0.1

 attachments/201112/2027852462.png

本PHP程式設計+MySQL資料庫+Dreamweaver整合教學(PHPMaker運用設計網站教學)密訓基地立志於收集各類PHP程式設計、MySQL資料庫及網頁設計技術教學資訊,便於本人和廣大網友及網友查詢檢索,無論公司或個人認為本站存在侵權內容均可與本站聯繫,任何此類反饋資訊一經查明屬實後,將立即移除!