9.影象 10.pdf 11.xml
這三章用到的時候再看
12.安全
1.過濾輸入
所有非程式生成的資料都可能是惡意的,都需要過濾
過濾時要判斷輸入資料大小長度是否合適,是否在規定的有效資料集當中
先使用靜態條件過濾,再使用資料庫過濾
示例://顏色值必須在規定的顏色集當中
if (!in_array($color, $color_set)) //中文名長度必須在3到10之間
$len = mb_strlen($cn_name);if ($len >= 10 || $len <= 3) //英文名只允許字母、空格、單引號、連字元
if (!preg_match(『/[^a-za-z \『\-]/『), $en_name) 『 and password = 『『 ";
這裡的問題是沒有轉義使用者名稱,它的值可以篡改sql查詢的格式,鑑於此漏洞很常見,很多攻擊者會使用如下使用者名稱:
chris『 --
這樣就可以不用密碼就可以用chris訪問賬戶
篡改後的sql查詢是:
select count(*) from users where username = 『chris『 --『 and password = 『***
兩個破折號(--)表示sql注釋,這個查詢等同於:
select * from users where username = 『chris『
(2)sql注入出問題的是plain sql,使用引數繫結param bind sql可以很好解決這個問題
bind param sql防sql注入原理:資料庫伺服器會把完整引數當做sql語句的引數來執行sql語句,引數的任何部分都不會被執行,這樣就不會出現sql注入的問題了
所以,所有根據使用者輸入資料進行sql查詢的地方理論上都應該使用param bind sql
(3)防止針對plain sql的sql注入,可以在拼接引數之前對引數過濾和轉義。示例如下:
if (preg_match(...), $username) $username = mysql_real_escape_string($username);
實際上,為了安全-不只是防止sql注入的目的,所有使用者輸入資料都應該過濾
4.檔名攻擊
可以通過傳入特殊的檔名進行攻擊
(1)使用相對路徑訪問特殊檔案
比如想要訪問使用者資料檔案,檔案放在/usr/local/目錄下,以使用者名稱作檔名,例如:
include("/usr/local/");
如果傳入的$username值為../../etc/passwd作為使用者名稱,就可能輸出/etc/passwd的內容
(2)使用遠端檔案
預設情況下,php可以用開啟本地檔案的函式開啟遠端檔案,fopen、include、require等函式可以通過傳遞url做檔名開啟遠端檔案,例如:
chdir(『/usr/local/『);$fp = fopen($username, 『r『);
如果$username的值為開啟的就是乙個遠端檔案,而不是本地的
如果允許使用者告訴你要include哪個檔案,情況會更糟糕,例如:
$file = $_request[『theme『];include($file);
如果使用者傳遞了作為theme欄位的值,並且variables_order配置包括get或post,php指令碼將會載入遠端**執行
有多種方法可以檢查檔名限制此類攻擊:禁用遠端檔案訪問、用realpath和basename檢查真正的檔名是否和傳入引數一致、配置open_basedir選項限制超出**目錄的檔案系統訪問
例子:$filename = $_post[『username『];$vetted = basename(realpath($filename));if ($filename !== $vetted) is not a good username.");
}include("/usr/local/");
5.會話攻擊
log in
受害者單擊了鏈結以會話識別符號1234繼續訪問,如果受害人進行了登入,攻擊者可以劫持受害者的會話來提公升許可權
還有一些這種攻擊的變體,比如用cookie達到同樣的目的
防護很簡單,當許可權等級改變時,比如使用者登入,用session_generate_id()重新生成會話識別符號:
if (check_auth($_post[『username『], $_post[『password『])) ";$counter++;$filename = "image_";if (is_uploaded_file[$tempname]) ");
}elseerror_log($errorstring, 3, $file);
}set_error_handler(『log_roller『);for ($i = 0; $i < 5000; $i++) {trigger_error(time() . 『:just an error\n『);
php.ini中配置不顯示錯誤,而是把錯誤輸出到日誌檔案中
display_errors=off
log_errors=on
error_log=/tmp/errors.log
(6)效能調優
開始不要太關注優化,先讓**工作起來,然後找到慢的部分去優化。
優化**的目標是縮短**執行時間和記憶體占用,優化的**可讀性可能會差一些。
基準測試benchmark
可以用apache基準測試工具ab來做效能測試
./ab -c 10 -n 1000 http://localhost/info.php//10個併發請求執行1000次
檢視**執行時間
$start = microtime();phpinfo();$end = microtime();echo $end - $start; //執行時間
問題:tcp rpc相對於http rpc的優點是什麼?
mysql安裝簡書
設定mysql客戶端預設字符集 default character set utf8 mysqld 設定3306埠 port 3306 設定mysql的安裝目錄 basedir c web mysql 8.0.11 設定 mysql資料庫的資料的存放目錄,mysql 8 不需要以下配置,系統自己生成...
mysql簡書 mysql使用
mysql對大小寫不敏感 1.使用者管理 使用者的建立和授權 mysql 8.0.11 版本之後建立使用者方法如下 create user laowang localhost identified by 123456 或grant usage on to user01 localhost ident...
mysql授權書 MySQL授權
一 建立新使用者 insert into mysql.user host,user,password values localhost newuser password 123456 如果報錯將my.ini或者my.cnf,查詢 sql mode strict trans tables,no aut...