mysql動物書 PHP動物書總結09 13

2021-10-18 22:05:12 字數 2896 閱讀 8354

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...