溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

PHP代碼審核的示例分析

發(fā)布時(shí)間:2021-10-13 09:28:16 來(lái)源:億速云 閱讀:133 作者:小新 欄目:開(kāi)發(fā)技術(shù)

小編給大家分享一下PHP代碼審核的示例分析,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!

概述
代碼審核,是對(duì)應(yīng)用程序源代碼進(jìn)行系統(tǒng)性檢查的工作。它的目的是為了找到并且修復(fù)應(yīng)用程序在開(kāi)發(fā)階段存在的一些漏洞或者程序邏輯錯(cuò)誤,避免程序漏洞被非法利用給企業(yè)帶來(lái)不必要的風(fēng)險(xiǎn)
代碼審核不是簡(jiǎn)單的檢查代碼,審核代碼的原因是確保代碼能安全的做到對(duì)信息和資源進(jìn)行足夠的保護(hù),所以熟悉整個(gè)應(yīng)用程序的業(yè)務(wù)流程對(duì)于控制潛在的風(fēng)險(xiǎn)是非常重要的。
審核人員可以使用類似下面的問(wèn)題對(duì)開(kāi)發(fā)者進(jìn)行訪談,來(lái)收集應(yīng)用程序信息。

應(yīng)用程序中包含什么類型的敏感信息,應(yīng)用程序怎么保護(hù)這些信息的?
應(yīng)用程序是對(duì)內(nèi)提供服務(wù),還是對(duì)外?哪些人會(huì)使用,他們都是可信用戶么?
應(yīng)用程序部署在哪里?
應(yīng)用程序?qū)τ谄髽I(yè)的重要性?

最好的方式是做一個(gè) checklist,讓開(kāi)發(fā)人員填寫。Checklist 能比較直觀的反映應(yīng)用程序的信息和開(kāi)發(fā)人員所做的編碼安全,它應(yīng)該涵蓋可能存在嚴(yán)重漏洞的模塊,例如:數(shù)據(jù)驗(yàn)證、身份認(rèn)證、會(huì)話管理、授權(quán)、加密、錯(cuò)誤處理、日志、安全配置、網(wǎng)絡(luò)架構(gòu)。

輸入驗(yàn)證和輸出顯示
大多數(shù)漏洞的形成原因主要都是未對(duì)輸入數(shù)據(jù)進(jìn)行安全驗(yàn)證或?qū)敵鰯?shù)據(jù)未經(jīng)過(guò)安全處理,比較嚴(yán)格的數(shù)據(jù)驗(yàn)證方式為:對(duì)數(shù)據(jù)進(jìn)行精確匹配
接受白名單的數(shù)據(jù)
拒絕黑名單的數(shù)據(jù)
對(duì)匹配黑名單的數(shù)據(jù)進(jìn)行編碼

在 PHP 中可由用戶輸入的變量列表如下:
$_SERVER
$_GET
$_POST
$_COOKIE
$_REQUEST
$_FILES
$_ENV
$_HTTP_COOKIE_VARS
$_HTTP_ENV_VARS
$_HTTP_GET_VARS
$_HTTP_POST_FILES
$_HTTP_POST_VARS
$_HTTP_SERVER_VARS
我們應(yīng)該對(duì)這些輸入變量進(jìn)行檢查

命令注入
安全威脅
命令注入攻擊是通過(guò)把HTML代碼輸入一個(gè)輸入機(jī)制(例如缺乏有效驗(yàn)證限制的表格域)來(lái)改變網(wǎng)頁(yè)的動(dòng)態(tài)生成的內(nèi)容,而這樣就可能會(huì)導(dǎo)致惡意命令掌控用戶的電腦和他們的網(wǎng)絡(luò)。PHP執(zhí)行系統(tǒng)命令可以使用以下幾個(gè)函數(shù):system、exec、passthru、``、shell_exec、popen、proc_open、pcntl_exec,我們通過(guò)在全部程序文件中搜索這些函數(shù),確定函數(shù)的參數(shù)是否會(huì)因?yàn)橥獠刻峤欢淖?檢查這些參數(shù)是否有經(jīng)過(guò)安全處理。
代碼示例
例1:

復(fù)制代碼 代碼如下:


//ex1.php
<?php
$dir = $_GET["dir"];
if (isset($dir))
{
echo "<pre>";
system("ls -al".$dir);
echo "</pre>";
}
?>


我們提交

復(fù)制代碼 代碼如下:


http:// localhost/ex1.php?dir=| cat /etc/passwd


提交以后,命令變成了

復(fù)制代碼 代碼如下:


system("ls -al | cat /etc/passwd");

PHP代碼審核的示例分析

防范方法
1、盡量不要執(zhí)行外部命令
2、使用自定義函數(shù)或函數(shù)庫(kù)來(lái)替代外部命令的功能
3、使用escapeshellarg函數(shù)來(lái)處理命令參數(shù)
4、使用safe_mode_exec_dir指定可執(zhí)行文件的路徑
esacpeshellarg函數(shù)會(huì)將任何引起參數(shù)或命令結(jié)束的字符轉(zhuǎn)義,單引號(hào)“'”,替換成“\'”,雙引號(hào)“"”,替換成“\"”,分號(hào)“;”替換成“\;”,  用safe_mode_exec_dir指定可執(zhí)行文件的路徑,可以把會(huì)使用的命令提前放入此路徑內(nèi)。

復(fù)制代碼 代碼如下:


safe_mode = On
safe_mode_exec_di r= /usr/local/php/bin/


跨站腳本威脅(Cross Site Scripting)
安全威脅
Cross Site Script(XSS),跨站腳本威脅。攻擊者利用應(yīng)用程序的動(dòng)態(tài)展示數(shù)據(jù)功能,在 html 頁(yè)面里嵌入惡意代碼。當(dāng)用戶瀏覽該頁(yè)之時(shí),這些嵌入在 html 中的惡意代碼會(huì)被
執(zhí)行,用戶瀏覽器被攻擊者控制,從而達(dá)到攻擊者的特殊目的。輸出函數(shù)經(jīng)常使用:echo、print、printf、vprintf、<%=$test%>

跨站腳本攻擊有以下三種攻擊形式:
(1)  反射型跨站腳本攻擊
攻擊者會(huì)通過(guò)社會(huì)工程學(xué)手段,發(fā)送一個(gè) URL 連接給用戶打開(kāi),在用戶打開(kāi)頁(yè)面的同時(shí),瀏覽器會(huì)執(zhí)行頁(yè)面中嵌入的惡意腳本。
(2)  存儲(chǔ)型跨站腳本攻擊
攻擊者利用 web 應(yīng)用程序提供的錄入或修改數(shù)據(jù)功能,將數(shù)據(jù)存儲(chǔ)到服務(wù)器或用戶cookie 中,當(dāng)其他用戶瀏覽展示該數(shù)據(jù)的頁(yè)面時(shí),瀏覽器會(huì)執(zhí)行頁(yè)面中嵌入的惡意腳本。所有瀏覽者都會(huì)受到攻擊。
(3)  DOM 跨站攻擊

由于 html 頁(yè)面中,定義了一段 JS,根據(jù)用戶的輸入,顯示一段 html 代碼,攻擊者可以在輸入時(shí),插入一段惡意腳本,最終展示時(shí),會(huì)執(zhí)行惡意腳本。DOM 跨站和以上兩個(gè)跨站攻擊的差別是,DOM 跨站是純頁(yè)面腳本的輸出,只有規(guī)范使用 JAVASCRIPT,才可以防御。

惡意攻擊者可以利用跨站腳本攻擊做到:
(1) 盜取用戶 cookie,偽造用戶身份登錄。
(2) 讓瀏覽者被迫執(zhí)行某頁(yè)面操作,以用戶身份向服務(wù)器發(fā)起請(qǐng)求,達(dá)到攻擊目的。
(3) 結(jié)合瀏覽器漏洞,下載病毒木馬到瀏覽者的計(jì)算機(jī)上執(zhí)行。
(4) 衍生 URL 跳轉(zhuǎn)漏洞。
(5) 讓官方網(wǎng)站出現(xiàn)釣魚(yú)頁(yè)面。
(6) 蠕蟲(chóng)攻擊
代碼示例
直接在 html 頁(yè)面展示“用戶可控?cái)?shù)據(jù)”,將直接導(dǎo)致跨站腳本威脅。

復(fù)制代碼 代碼如下:


<?
echo    “<span>$newsname</span>”;
echo    “<a  href=“$gifurl”>$gifname</a>”;
echo    “<input  type=text  name=user  value=\”$username\”>”;
echo “<span  style=‘$stylelayout'>”.  htmlentities($context).”</span>”;
?>


這幾種顯示方式,都可能導(dǎo)致用戶瀏覽器把“用戶可控?cái)?shù)據(jù)”當(dāng)成 JS/VBS 腳本執(zhí)行,或頁(yè)面元素被“用戶可控?cái)?shù)據(jù)”插入的頁(yè)面 HTML 代碼控制,從而造成攻擊。
解決方案
a) 在 HTML 中顯示“用戶可控?cái)?shù)據(jù)”前,應(yīng)該進(jìn)行 htmlescape 轉(zhuǎn)義。

復(fù)制代碼 代碼如下:


htmlspecialchars($outputString,ENT_QUOTES);


進(jìn)行 html 轉(zhuǎn)義應(yīng)該按照以下列表進(jìn)行轉(zhuǎn)義:

復(fù)制代碼 代碼如下:


   & --> &amp;
   < --> &lt;
   > --> &gt;
   " --> &quot;
   ' --> &#39;


b) 在 javascript 中輸出的“用戶可控?cái)?shù)據(jù)”,需要做 javascript escape 轉(zhuǎn)義。
需要轉(zhuǎn)義的字符包括:

復(fù)制代碼 代碼如下:


    / --> \/ 
    ' --> \' 
    " --> \" 
    \ --> \\ 


c) 對(duì)輸出到富文本中的“用戶可控?cái)?shù)據(jù)”,做富文本安全過(guò)濾(允許用戶輸出 HTML 的情況),防止富文本編輯器中存在腳本性的 script 代碼。
SQL 注入(SQL Injection)

安全威脅
當(dāng)應(yīng)用程序?qū)⒂脩糨斎氲膬?nèi)容,拼接到 SQL 語(yǔ)句中,一起提交給數(shù)據(jù)庫(kù)執(zhí)行時(shí),就會(huì)產(chǎn)生 SQL 注入威脅。由于用戶的輸入,也是 SQL 語(yǔ)句的一部分,所以攻擊者可以利用這部分可以控制的內(nèi)容,注入自己定義的語(yǔ)句,改變 SQL 語(yǔ)句執(zhí)行邏輯,讓數(shù)據(jù)庫(kù)執(zhí)行任意自己需要的指令。通過(guò)控制部分 SQL 語(yǔ)句,攻擊者可以查詢數(shù)據(jù)庫(kù)中任何自己需要的數(shù)據(jù),利用數(shù)據(jù)庫(kù)的一些特性,可以直接獲取數(shù)據(jù)庫(kù)服務(wù)器的系統(tǒng)權(quán)限。本來(lái) SQL 注入攻擊需要攻擊者對(duì) SQL 語(yǔ)句非常了解,所以對(duì)攻擊者的技術(shù)有一定要求。但是幾年前,已經(jīng)出現(xiàn)了大量 SQL 注入利用工具,可以讓任何攻擊者,只要點(diǎn)幾下鼠標(biāo),就能達(dá)到攻擊效果,這使得 SQL 注入的威脅,極大增加。

SQL注入攻擊的一般步驟:
1、攻擊者訪問(wèn)有SQL注入漏洞的站點(diǎn),尋找注入點(diǎn)
2、攻擊者構(gòu)造注入語(yǔ)句,注入語(yǔ)句和程序中的SQL語(yǔ)句結(jié)合生成新的sql語(yǔ)句
3、新的sql語(yǔ)句被提交到數(shù)據(jù)庫(kù)中執(zhí)行 處理
4、數(shù)據(jù)庫(kù)執(zhí)行了新的SQL語(yǔ)句,引發(fā)SQL注入攻擊
PHP代碼審核的示例分析


代碼示例
對(duì)于輸入檢查不充分,導(dǎo)致 SQL 語(yǔ)句將用戶提交的非法數(shù)據(jù)當(dāng)作語(yǔ)句的一部分來(lái)執(zhí)行。
示例:

復(fù)制代碼 代碼如下:


<?
$id=$_GET['id'];
$name=$_GET['name'];
$sql="select * from news where `id`=$id and `username`='$name' ";
?>


解決方案
a)安全配置與編碼方式,PHP 配置選項(xiàng)在 php.ini 文件中指定。下列配置方式能夠加強(qiáng)php 的安全性,使應(yīng)用程序避免受到 sql injection 的攻擊。
 1) safe_mode=onPHP,將通過(guò)文件函數(shù)或其目錄檢查當(dāng)前腳本的擁有者是否和將被操作的文件的擁有者相匹配 ,當(dāng)前腳本擁有者和文件操作擁有者不匹配則為違法操作
 2) magic_quotes_gpc=on / off,如果該選項(xiàng)被激活,那么請(qǐng)求參數(shù)中包含的任何單引號(hào)、雙引號(hào)、反斜線和空字符都會(huì)用一個(gè)反斜線自動(dòng)轉(zhuǎn)義。
 3) magic_quotes_sybase=on/off,如果改選項(xiàng)被禁用,那么 PHP 就會(huì)用一個(gè)單引號(hào)轉(zhuǎn)義所有的單引號(hào)。
驗(yàn)證數(shù)字型的變量
$id=(int)$id;
注:PHP6 已經(jīng)刪除 magic quotes 選項(xiàng)

b)使用預(yù)處理執(zhí)行 SQL 語(yǔ)句,對(duì)所有傳入 SQL 語(yǔ)句中的變量,做綁定。這樣,用戶拼接進(jìn)來(lái)的變量,無(wú)論內(nèi)容是什么,都會(huì)被當(dāng)做替代符號(hào)“?”所替代的值,數(shù)據(jù)庫(kù)也不會(huì)
把惡意用戶拼接進(jìn)來(lái)的數(shù)據(jù),當(dāng)做部分 SQL 語(yǔ)句去解析。示例:

復(fù)制代碼 代碼如下:


$stmt = mysqli_stmt_init($link);
if (mysqli_stmt_prepare($stmt, 'SELECT District FROM City WHERE Name=?'))
{
/* bind parameters for markers */
mysqli_stmt_bind_param($stmt, "s", $city);
/* execute query */
mysqli_stmt_execute($stmt);
/* bind result variables */
mysqli_stmt_bind_result($stmt, $district);
/* fetch value */
mysqli_stmt_fetch($stmt);
mysqli_stmt_close($stmt);
}
/* close connection */
mysqli_close($link);


文件上傳威脅(File Upload)
安全威脅
PHP 文件上傳漏洞主要在于驗(yàn)證文件類型的時(shí)候沒(méi)處理好文件變量所帶來(lái)的攻擊,導(dǎo)致程序判斷邏輯被繞過(guò),攻擊者上傳腳本文件被服務(wù)器解析,從而獲取 SHELL 或者上傳時(shí)
文件被任意拷貝,甚至上傳腳本木馬到 web 服務(wù)器上,直接控制 web 服務(wù)器。
代碼示例
處理用戶上傳文件請(qǐng)求的代碼,這段代碼沒(méi)有過(guò)濾文件擴(kuò)展名。

復(fù)制代碼 代碼如下:


    <? 
    // oldUpload.php 
    if(isset($upload)  &&  $myfile  !=  "none“  &&  check($myfile_name))  { 
    copy($myfile, "/var/www/upload/".$myfile_name); 
    echo "文件".$file_name."上傳成功!點(diǎn)擊<a href=\"$PHP_SELF\">繼續(xù)上傳</a>"; 
    exit; 
    } 
    //checkUpload.php 
    $DeniedExtensions=array('html','htm','php','php2','php3','php4','php5','ph 
    tml','pwml','inc','asp','aspx','ascx','jsp','cfm','cfc','pl','bat','exe',' 
    com','dll','vbs','js','reg','cgi','htaccess','asis') ; 
    if($checkUpload($_FILE[‘myfile'][name],  $DeniedExtensions)){copy($_FILE[‘myfile'][tmp_name],'upload/'.$_FILE[‘myfile'][name]); 
    } 
    ?> 
    <title>文件上傳</title> 
    <meta http-equiv="Content-Type" content="text/html; charset=gb2312"> 
    </head> 
    <body bgcolor="#FFFFFF"> 
    <form enctype="multipart/form-data" method="post"> 
    上傳文件: 
    <input  type="file"    name=“myfile"  size="30"> 
    <input type="submit" name="upload" value="上傳"> 
    </form> 
    </body> 
    </html> 


解決方案
處理用戶上傳文件,要做以下檢查:
(1) 檢測(cè)文件后綴名是否符合白名單規(guī)范。
(2) 將文件按照隨機(jī)文件名的形式,保存在服務(wù)器上。
(3) 上傳目錄腳本文件不可執(zhí)行
(4) 注意%00 截?cái)?br/>(5) 對(duì)于 jpg 文件,需要讀取文件內(nèi)容,然后生成一個(gè)新的 jpg 文件進(jìn)行保存
Cross-Site Request Forgery (CSRF)

安全威脅
Cross-Site Request Forgery(CSRF),偽造跨站請(qǐng)求。攻擊者在用戶瀏覽網(wǎng)頁(yè)時(shí),利用頁(yè)面元素(例如 img 的 src),強(qiáng)迫受害者的瀏覽器向Web 應(yīng)用程序發(fā)送一個(gè)改變用戶信息的請(qǐng)求。由于發(fā)生 CSRF 攻擊后,攻擊者是強(qiáng)迫用戶向服務(wù)器發(fā)送請(qǐng)求,所以會(huì)造成用戶信息被迫修改,更嚴(yán)重者引發(fā)蠕蟲(chóng)攻擊。
CSRF 攻擊可以從站外和站內(nèi)發(fā)起。從站內(nèi)發(fā)起 CSRF 攻擊,需要利用網(wǎng)站本身的業(yè)務(wù),比如“自定義頭像”功能,惡意用戶指定自己的頭像 URL 是一個(gè)修改用戶信息的鏈接,當(dāng)其他已登錄用戶瀏覽惡意用戶頭像時(shí),會(huì)自動(dòng)向這個(gè)鏈接發(fā)送修改信息請(qǐng)求。

從站外發(fā)送請(qǐng)求,則需要惡意用戶在自己的服務(wù)器上,放一個(gè)自動(dòng)提交修改個(gè)人信息的htm 頁(yè)面,并把頁(yè)面地址發(fā)給受害者用戶,受害者用戶打開(kāi)時(shí),會(huì)發(fā)起一個(gè)請(qǐng)求。

如果惡意用戶能夠知道網(wǎng)站管理后臺(tái)某項(xiàng)功能的 URL,就可以直接攻擊管理員,強(qiáng)迫管理員執(zhí)行惡意用戶定義的操作。
代碼示例
 一個(gè)沒(méi)有 CSRF 安全防御的代碼如下:

復(fù)制代碼 代碼如下:


<?
$user=checkSQL($user);
$pass=checkSQL($pass);
$sql=“update  UserTB set  password=$user  Where  user=$pass”;
mysqli_stmt_execute($sql);
?>


代碼中接收用戶提交的參數(shù)“user,pass”,之后修改了該用戶的數(shù)據(jù),一旦接收到一個(gè)用戶發(fā)來(lái)的請(qǐng)求,就執(zhí)行修改操作。
  提交表單代碼:

復(fù)制代碼 代碼如下:


<form action="http://localhost/servlet/modify" method="POST">
<input name="email">
<input name="tel">
</form>


當(dāng)用戶點(diǎn)提交時(shí),就會(huì)觸發(fā)修改操作。
攻擊實(shí)例
如果“代碼示例”中的代碼,是 xxx.com 上的一個(gè) web 應(yīng)用,那么惡意用戶為了攻擊 xxx.com 的登錄用戶,可以構(gòu)造 2 個(gè) HTML 頁(yè)面。
(1) 頁(yè)面 a.htm 中,iframe 一下 b.htm,把寬和高都設(shè)為 0。

復(fù)制代碼 代碼如下:


<iframe src="b.htm" width="0" height="0"></frame>


這是為了當(dāng)攻擊發(fā)生時(shí),受害用戶看不到提交成功結(jié)果頁(yè)面。
(2) 頁(yè)面 b.htm 中,有一個(gè)表單,和一段腳本,腳本的作用是,當(dāng)頁(yè)面加載時(shí),自動(dòng)提交這個(gè)表單。

復(fù)制代碼 代碼如下:


<form id="modify" action="http://xxx.com/servlet/modify" method="POST">
<input name="email">
<input name="tel">
</form>
<script>
document.getElementById("modify").submit();
</script>


(3) 攻擊者只要把頁(yè)面 a.htm 放在自己的 web 服務(wù)器上,并發(fā)送給登錄用戶即可。用戶打開(kāi) a.htm 后,會(huì)自動(dòng)提交表單,發(fā)送給 xxx.com 下的那個(gè)存在 CSRF 漏洞的web 應(yīng)用,所以用戶的信息,就被迫修改了。

解決方案
CSRF 防御的原理是,在用戶登錄的時(shí)候,生成一個(gè)隨機(jī)的 token,將它存儲(chǔ)在 cookie中(默認(rèn)情況,也可以放在 session 中),在生成表單時(shí),生成一個(gè)隱藏域,隱藏域的值就等
于 token 的值。如果用戶提交這個(gè)表單,就可以在接收用戶請(qǐng)求的 web 應(yīng)用中,判斷隱藏域的 TOKEN 值是否和用戶 COOKIE 中的 TOKEN 值一致,如果不一致或沒(méi)有這個(gè)值,就判
斷為 CSRF 攻擊。攻擊者無(wú)法預(yù)測(cè)每一個(gè)用戶登錄時(shí)生成的那個(gè)隨機(jī) TOKEN 值,所以無(wú)法偽造這個(gè)參數(shù)。

常見(jiàn)問(wèn)題
(1) 為什么不直接驗(yàn)證 referer?
因?yàn)檫€有站內(nèi)發(fā)出的 csrf,并且 referer 是可以被篡改的,是不可靠的數(shù)據(jù)
(2) 如果先發(fā)生 xss 攻擊,攻擊者可以拿到用戶頁(yè)面的 token 怎么辦?
無(wú)解,請(qǐng)先做好 xss 防范。
文件包含
PHP 可 能 出 現(xiàn)文 件 包 含 的 函 數(shù): include、 include_once 、 require、 require_once 、show_source、highlight_file、readfile、file_get_contents、fopen、file
防范方法:
對(duì)輸入數(shù)據(jù)進(jìn)行精確匹配,比如根據(jù)變量的值確定語(yǔ)言 en.php、cn.php,那么這兩個(gè)文件放在同一個(gè)目錄下'language/'.$_POST[‘lang'].'.php',
那么檢查提交的數(shù)據(jù)是否是 en 或者 cn 是最嚴(yán)格的,檢查是否只包含字母也不錯(cuò),通過(guò)過(guò)濾參數(shù)中的/、..等字符。
HTTP 響應(yīng)拆分
PHP 中可導(dǎo)致 HTTP 響應(yīng)拆分的情況為:使用 header 函數(shù)和使用$_SERVER 變量。注意PHP 的高版本會(huì)禁止 HTTP 表頭中出現(xiàn)換行字符,這類可以直接跳過(guò)本測(cè)試。
防范方法:
精確匹配輸入數(shù)據(jù)
檢測(cè)輸入輸入中如果有\(zhòng)r 或\n,直接拒絕
變量覆蓋
PHP 變量覆蓋會(huì)出現(xiàn)在下面幾種情況:
遍歷初始化變量
例:

復(fù)制代碼 代碼如下:


foreach($_GET as $key => $value)
$$key = $value;


函數(shù)覆蓋變量:parse_str、mb_parse_str、import_request_variables,Register_globals=ON 時(shí),GET 方式提交變量會(huì)直接覆蓋
防范方法:
設(shè)置 Register_globals=OFF
不要使用這些函數(shù)來(lái)獲取變量
動(dòng)態(tài)函數(shù)
當(dāng)使用動(dòng)態(tài)函數(shù)時(shí),如果用戶對(duì)變量可控,則可導(dǎo)致攻擊者執(zhí)行任意函數(shù)。
例:

復(fù)制代碼 代碼如下:


<?php
$myfunc=$_GET['myfunc'];
$myfunc();
?>


防御方法:
      不要這樣使用函數(shù)
會(huì)話安全
HTTPOnly 設(shè)置
session.cookie_httponly = ON 時(shí),客戶端腳本(JavaScript 等)無(wú)法訪問(wèn)該 cookie,打開(kāi)該指令可以有效預(yù)防通過(guò) XSS 攻擊劫持會(huì)話 ID
domain 設(shè)置
檢查 session.cookie_domain 是否只包含本域,如果是父域,則其他子域能夠獲取本域的cookies
path 設(shè)置
檢查 session.cookie_path,如果網(wǎng)站本身應(yīng)用在/app,則 path 必須設(shè)置為/app/,才能保證安全
cookies 持續(xù)時(shí)間
檢查 session.cookie_lifetime,如果時(shí)間設(shè)置過(guò)程過(guò)長(zhǎng),即使用戶關(guān)閉瀏覽器,攻擊者也會(huì)危害到帳戶安全
secure 設(shè)置
如果使用 HTTPS,那么應(yīng)該設(shè)置 session.cookie_secure=ON,確保使用 HTTPS 來(lái)傳輸cookies
session 固定
如果當(dāng)權(quán)限級(jí)別改變時(shí)(例如核實(shí)用戶名和密碼后,普通用戶提升到管理員),我們就應(yīng)該修改即將重新生成的會(huì)話 ID ,否則程序會(huì)面臨會(huì)話固定攻擊的風(fēng)險(xiǎn)。

加密
明文存儲(chǔ)密碼
采用明文的形式存儲(chǔ)密碼會(huì)嚴(yán)重威脅到用戶、應(yīng)用程序、系統(tǒng)安全。
密碼弱加密
使用容易破解的加密算法,MD5加密已經(jīng)部分可以利用 md5破解網(wǎng)站來(lái)破解
代碼如下:


md5(md5($password).$salt)


密碼存儲(chǔ)在攻擊者能訪問(wèn)到的文件
例如:保存密碼在 txt 、ini、conf、inc、xml 等文件中,或者直接寫在 HTML 注釋中

認(rèn)證和授權(quán)
用戶認(rèn)證
檢查代碼進(jìn)行用戶認(rèn)證的位置,是否能夠繞過(guò)認(rèn)證,例如:登錄代碼可能存在表單注入。
檢查登錄代碼有無(wú)使用驗(yàn)證碼等,防止暴力破解的手段
函數(shù)或文件的未認(rèn)證調(diào)用

一些管理頁(yè)面是禁止普通用戶訪問(wèn)的,有時(shí)開(kāi)發(fā)者會(huì)忘記對(duì)這些文件進(jìn)行權(quán)限驗(yàn)證,導(dǎo)致漏洞發(fā)生
某些頁(yè)面使用參數(shù)調(diào)用功能,沒(méi)有經(jīng)過(guò)權(quán)限驗(yàn)證,比如 index.php?action=upload
密碼硬編碼

有的程序會(huì)把數(shù)據(jù)庫(kù)鏈接賬號(hào)和密碼,直接寫到數(shù)據(jù)庫(kù)鏈接函數(shù)中。
隨機(jī)函數(shù)
rand() VS mt_rand()
rand()最大隨機(jī)數(shù)是 32767,當(dāng)使用 rand 處理 session 時(shí),攻擊者很容易破解出session,建議使用mt_rand()。
代碼示例

復(fù)制代碼 代碼如下:


<?php
//on windows
print mt_getrandmax(); //2147483647
print getrandmax();// 32767
?>


可以看出 rand()最大的隨機(jī)數(shù)是 32767,這個(gè)很容易被我們暴力破解。

復(fù)制代碼 代碼如下:


<?php
$a= md5(rand());
for($i=0;$i<=32767;$i++){
if(md5($i) ==$a ) {
print $i."-->ok!!<br>";exit;
}else { print $i."<br>";}
}
?>


當(dāng)我們的程序使用 rand 處理 session 時(shí),攻擊者很容易暴力破解出你的 session,但是對(duì)于 mt_rand 是很難單純的暴力的。

以上是“PHP代碼審核的示例分析”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對(duì)大家有所幫助,如果還想學(xué)習(xí)更多知識(shí),歡迎關(guān)注億速云行業(yè)資訊頻道!

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

php
AI