php項目安全問題

常見安全問題:php

         惡意攻擊,暴力破解;Sql注入;Xss攻擊。html

(1)惡意攻擊,暴力破解

Get方式惡意攻擊,(dos),一般硬件的方式來防止,防火牆。mysql

Post方式暴力破解,從程序的角度來防止,最通用的方法就是增長驗證碼。程序員

 

(2)Sql注入

黑客經過在表單中填入特殊的字符或者是 url中增長特殊的字符,而後想數據庫發起請求,拼湊出sql語句,達到攻擊的目的。sql

有兩種形式:Post表單提交;Get的url傳參。數據庫

a.表單提交-萬能密碼   xxx' or '1數組

password = '$password'=>Password = ‘ xxx' or ‘1 ‘安全

如何防範萬能密碼呢?最簡單的方式,就是給密碼加密。加密的方式有不少,好比md5,sha1。  $password=md5($password)。less

或者用addslashes()和mysql_real_escape_string()等轉義函數進行轉義,通常addslashes()和mysql_real_escape_string()更經常使用。xss

萬能用戶名

如何防止萬能用戶名?不要加密,不可取。無論是萬能用戶名 和 萬能密碼, 他們都利用了 一個 特殊字符-------單引號,讓你的單引號失去自己的意義。

單引號轉義,使用addslashes函數。

 

經過上面的分析,咱們得出一個結論:凡是是用戶提交的信息,都是不能相信的,都須要進行處理,其中之一就是轉義。也就意味着在全部的 收集表單信息的地方,都要調用 addslashes函數。有沒有更好的辦法來處理呢?-------批量處理。

能夠自定義有一個函數,用於批量轉義。

要處理的數據的表現形式有如下幾種:(1)單一變量(2)一維數組(3)二維數組(多維)綜合成兩種狀況:單一變量和數組。定義以下:

//批量轉義
function deepslashes($data){
    //判斷$data的表現形式,而且須要處理空的狀況
    if (empty($data)){
        return $data;
    }
    //中高級程序員的寫法
    return is_array($data) ? array_map('deepslashes', $data) : addslashes($data) ;
    /*
    //初級程序員的寫法
    if (is_array($data)){
        //數組,對其進行遍歷
        foreach ($data as $v){
            return deepslashes($v);
        }
    } else {
        //單一變量
        return addslashes($data);
    }
    */
}

遍歷某個數組,而後對數組中的每一個元素,作了一個操做。PHP提供了一個函數 array_map,能夠完成這個功能。

最終的sql語句,delete from cz_category where cat_id = 1,在後面追加一個字符 or 1,

delete from cz_category where cat_id = 1 or 1

災難性的結果就出現了,全刪除了。

因此,在接受get傳參的時候,也須要處理一下,一般就是傳遞id的時候。處理方法很簡單,只須要將參數轉成整型便可。如 1 or 1 -----> 1

有哪些方式:強制轉換,使用函數intval 或者 數據類型的 關鍵字 int; 隱式轉換,經過運算,只須要 +0便可。

(3).Xss攻擊

Xss: cross site script 跨站腳本攻擊

Css 被佔用,表示樣式表

惡意攻擊者往Web頁面裏插入惡意html代碼,當用戶瀏覽該頁之時,嵌入其中Web裏面的html代碼會被執行,從而達到惡意攻擊用戶的特殊目的。

如何防止呢?找出xss攻擊的本質,經過 標籤(一對尖括號)來達到攻擊的目的,因此咱們只須要將尖括號 進行 轉義,這就是php中提到的 實體轉義。

Htmlspecialchars函數 和  htmlentites函數

■'&' (ampersand) becomes '&'

■'"' (double quote) becomes '"' when ENT_NOQUOTES is not set.

■"'" (single quote) becomes ''' only when ENT_QUOTES is set.

■'<' (less than) becomes '<'

■'>' (greater than) becomes '>'

實體,好比咱們寫的    ©

全部有表單輸入的地方,都須要進行實體轉義。定義一個輔助函數完成該功能

//批量實體轉義
function deepspecialchars($data){
    if (empty($data)){
        return $data;
    }
    return is_array($data) ? array_map('deepspecialchars', $data) : htmlspecialchars($data);
}

結論:只要是用戶的輸入,都須要通過 引號轉義 和 實體轉義。因此咱們得進行雙重驗證。

//批量轉義
function deepslashes($data){
    //判斷$data的表現形式,而且須要處理空的狀況
    if (empty($data)){
        return $data;
    }
    //中高級程序員的寫法
    return is_array($data) ? array_map('deepslashes', $data) : addslashes($data) ;
}

//批量實體轉義
function deepspecialchars($data){
    if (empty($data)){
        return $data;
    }
    return is_array($data) ? array_map('deepspecialchars', $data) : htmlspecialchars($data);
}

項目日誌:有的時候,和數據庫相關的一些操做,sql語句並無出錯,可是結果不對。如何排除這個錯誤:須要打印sql語句,而後將sql放到 cmd(phpmyadmin)中執行。

若是每次都要打印,是很麻煩的一件事情。有一個簡單有效的辦法,就是將sql語句以日誌的形式記錄下來,便於查看。

//生成日誌
function query($sql){
//還能夠加一個開關來開啓/關閉 sql日誌
//以追加的方式來保存
    $temp = "[" . date('Y-m-d H:i:s') ."] " . $sql . PHP_EOL;
    file_put_contents("log.txt", $temp,FILE_APPEND);
}

日誌結果以下:

相關文章
相關標籤/搜索