PHP常見的安全問題彙總

一. XSS(跨站腳本攻擊)php

能夠用於竊取其餘用戶的Cookie信息,要避免此類問題,能夠採用以下解決方案:
  ● 直接過濾全部的JavaScript腳本;
  ● 轉義Html元字符,使用htmlentities、htmlspecialchars等函數;
  ● 系統的擴展函數庫提供了XSS安全過濾的remove_xss方法;
  ● 新版對URL訪問的一些系統變量已經作了XSS處理。html

二:Server相關的配置信息被暴露,未進行模糊處理mysql

1.http {nginx

……省略配置
server_tokens off;   ->便可隱藏版本號
…….省略配置
}
重啓nginx後,咱們返回的Server頭格式爲Server:nginx ,並且nginx本身的404頁面也沒有版本號的信息
2.返回自定義的server  混淆Server信息
我是不太願意告訴別人我是使用什麼Server的,但沒有找到相關文獻去隱藏它,因此咱們能夠混淆她,如把Server返回GFW之類的,嚇唬嚇唬那些腳本小子
 
 大部分狀況下,腳本的小子的掃描工具是掃描咱們response返回的header中的server信息.咱們能夠採用編譯源碼的方法來改變返回的Server,筆者的版本是nginx1.7.0,咱們修改src/http/ngx_http_header_filter_module.c 中的48行
   static char ngx_http_server_string[] = "Server: nginx" CRLF;
   把其中的nginx改成咱們本身想要的文字便可,筆者就改成了GFW. 筆者輸出的Server:GFW.(這個前提是你進行了第一個步句的操做,關閉了版本號)
   
   若是你的版本號是開着的,你又想調戲下腳本小子.好比Server:billgate/1.9.0
  咱們修改src/core/nginx.h 定位到13-14行
   #define NGINX_VERSION      "1.7.0"
   #define NGINX_VER          "nginx/" NGINX_VERSION
   Server返回的就是常量NGINX_VER, 咱們把NGINX_VERSION大小定義爲1.9.0,nginx改成billgate就能達到咱們的目的了sql

三:url_fopen開啓可能致使文件包含漏洞api

php.ini 中的  allow_url_fopen設置爲Off;      allow_url_include設置爲Off安全

四:不安全的函數引用cookie

1.不要使用mysql_escape_string,它已被棄用,請使用mysql_real_escape_string代替它。session

/**xss

     * SQL指令安全過濾

     * @access public

     * @param string $str  SQL字符串

     * @return string

     */

    public function escapeString($str) {

        if($this->_linkID) {

            return mysql_real_escape_string($str,$this->_linkID);

        }else{

            return mysql_escape_string($str);

        }

    }

2.split() 替代方案
* 須要regex 的split, 可用preg_split() 代替
* 不須要regex, 只要要快速分割固定的字串, 可用explode() 代替. (速度會比須要regex 的快不少)

五:開放的重定向,跨站攻擊

1.url白名單,對重定向路徑進行驗證

例:

//白名單配置
'LEGAL_URL' => array(
   'http://localhost/shenzhen',
   'shenzhen',
),

$legalUrls = C('LEGAL_URL');
$isLegal = false;
foreach($legalUrls as $legalUrl){
     if(strstr($tourl,$legalUrl)){
         $isLegal = true; break;
     }

}
if($isLegal){
    if (php_sapi_name() === 'cli') {
           @header('Location: '.$tourl);
} else {
            header('Location: '. $tourl);
}
}

六:SQL注入

1.對參數進行過濾

如:1.$fids = is_array($fids) ? array_unique(array_map( 'intval' , $fids)) : array_unique(array_map( 'intval' , explode(',', $fids)));

       2.$data ['table'] = $data ['table_name']   改成  $data ['table'] = preg_replace("/[^\w|,]/","",t($data ['table_name']));

      3.$map [$idField] = $data ['row_id'];   改成  $map [$idField] = intval($data ['row_id']);

七: 未設置cookie的httponly和secure屬性。存在cookie被竊取和篡改的風險。

在PHP文件添加    ini_set("session.cookie_httponly", 1); //開啓全局的httponly

八:越權操做(添加,修改,刪除)

      可根據需求而定,對當前操做用戶添加權限驗證。

九: 泄露絕對路徑

對絕對路徑進行加密處理

相關文章
相關標籤/搜索