php安全之我見 1.把握整站的結(jié)構(gòu),,避免泄露站點(diǎn)敏感目錄 問題:老網(wǎng)站一般在跟目錄下放上index.php,、register.php、login.php,訪問注冊(cè)頁(yè)面跳轉(zhuǎn)到http://localhost/register.php,不易擴(kuò)展和維護(hù) 解決: 如果url為http://localhost/act=register這種,通過變量來跳轉(zhuǎn)到相應(yīng)頁(yè)面便于管理,dvwa靶機(jī)環(huán)境用的就是種搭建的思想 優(yōu)點(diǎn):1.不會(huì)暴露網(wǎng)站后臺(tái)絕對(duì)路徑http://localhost/act=admin.php推測(cè)不出網(wǎng)站的后臺(tái)目錄 ???? 2.易維護(hù),不需修改太多代碼,http://localhost/act=admin.php想修改后臺(tái)地址,只需修改swtich的代碼和后臺(tái)文件名 ???? 3.結(jié)構(gòu)嚴(yán)謹(jǐn),有層次感 ???? 4.統(tǒng)一管理身份認(rèn)證,??稍谠谌肟谔庍M(jìn)行身份認(rèn)證,如游客不可訪問網(wǎng)站,只有登錄會(huì)員才有權(quán)限瀏覽,可在入口頁(yè)面管理 ???? 5.通過絕對(duì)路徑訪問頁(yè)面報(bào)錯(cuò), http://localhost/register.php報(bào)錯(cuò) 在頁(yè)面添加<?php if(!defined('WWW_ROOT')) {header("HTTP/1.1 404 Not Found"); exit;} ?>實(shí)現(xiàn) ? 2.使用預(yù)編譯語句,避免sql注入 2.1.數(shù)據(jù)與代碼未區(qū)分 一條sql語句select * from admin where username='admin' password='xxxxx',admin和xxxx是數(shù)據(jù),如未做處理,用戶可以輸入admin=' or 1=1 #,這條語句變成select * from admin where username='' or 1=1 #' password='xxxxx' ,#將后面的代碼注釋掉,username=''為假,1=1為真,所以最終結(jié)果為真,將所有數(shù)據(jù)都查詢出來 2.2 預(yù)編譯 后端SQL語句:select * from admin where username='?' password='?',將這條sql語句編譯成stmt對(duì)象中,方法stmt->bind_param將用戶輸入的數(shù)據(jù)綁定到?的位置,這樣通過類來操作,所以sql語句的執(zhí)行都要進(jìn)行預(yù)編譯,。 Mysqli的預(yù)處理 1.創(chuàng)建連接 $conn = new mysqli($servername, $username, $password, $dbname); 2.預(yù)處理,也就是封裝成stmt類 $stmt = $conn->prepare("INSERT INTO MyGuests (firstname, lastname, email) VALUES (?, ?, ?)"); 3.綁定參數(shù) $stmt->bind_param("sss", $firstname, $lastname, $email); 4.設(shè)置參數(shù)值 $firstname=’firstname’ 5.執(zhí)行 $stmt->execute(); 不過現(xiàn)在php常用pdo來進(jìn)行sql操作 1.pdo實(shí)例化 $conn = new PDO("mysql:host=$servername;dbname=$dbname", $username, $password); 2.預(yù)處理 $stmt = $conn->prepare("INSERT INTO MyGuests (firstname, lastname, email) VALUES (:firstname, :lastname, :email)"); 3.綁定參數(shù) $stmt->bindParam(':firstname', $firstname); $stmt->bindParam(':lastname', $lastname); ?$stmt->bindParam(':email', $email); 4.賦值及執(zhí)行 $firstname = "John"; $lastname = "Doe"; $email = "[email protected]"; $stmt->execute(); ? 3預(yù)防XSS代碼,,如果不需要使用cookie就不使用 不幸被xss注入,頁(yè)面不使用cookie,可降低危害 ? 4. 限制用戶權(quán)限,預(yù)防CSRF 4.1舉一個(gè)例子,給某篇文章點(diǎn)贊,一開始設(shè)計(jì)的是get請(qǐng)求的方式,如A用戶點(diǎn)贊某篇文章的url請(qǐng)求是 http://localhost/?act=support&articleid=12,A用戶可以將這個(gè)請(qǐng)求發(fā)送給B用戶,B用戶點(diǎn)擊此鏈接也發(fā)起了一個(gè)點(diǎn)贊的請(qǐng)求 4.2post請(qǐng)求,。Get請(qǐng)求太容易利用,,如是設(shè)計(jì)成post來發(fā)起這個(gè)點(diǎn)贊的請(qǐng)求,如以下代碼: <form action="http://localhost/?act=support" method="POST"> ? <input type="hidden" value="12" name="articleid"> ? <input type="submit" value="贊"> </form> 第一個(gè)input中出現(xiàn)了文章的id,可以構(gòu)造form表格,或ajax,或利用burpsuite構(gòu)造攻擊頁(yè)面,發(fā)送給B,B點(diǎn)擊發(fā)起了點(diǎn)贊的post請(qǐng)求 4.3驗(yàn)證碼來限制。這樣會(huì)降低用戶體驗(yàn)感,現(xiàn)實(shí)中也未見點(diǎn)個(gè)贊還需要輸入驗(yàn)證碼的情形,。 4.4增加token驗(yàn)證,。客戶端每次訪問http://localhost/?act=support&articleid=12頁(yè)面時(shí),服務(wù)器都會(huì)隨機(jī)生成一個(gè)token,并發(fā)送給客戶端,客戶端點(diǎn)贊時(shí)發(fā)送這個(gè)參數(shù)和服務(wù)端比較,如果一樣點(diǎn)贊成功,這里如果頁(yè)面存在xss的漏洞,可以通過js獲取到token值,成功發(fā)起攻擊,這種方式是目前常用且有效的手段 4.5 referer驗(yàn)證,。訪問http://localhost/?act=support&articleid=12點(diǎn)贊時(shí),驗(yàn)證請(qǐng)求包中的rerferer值,來驗(yàn)證其頁(yè)面來源,理想情況下,當(dāng)A用戶將攻擊頁(yè)面發(fā)給B,B點(diǎn)擊,referer來源肯定不一致導(dǎo)致點(diǎn)贊失效,但是攻擊者可以修改攻擊頁(yè)面的網(wǎng)站名,文件名,目錄名為點(diǎn)贊域名以混過rerferer檢測(cè) ? 5嚴(yán)格控制上傳文件類型 5.1前端驗(yàn)證不可靠的 5.2mime驗(yàn)證不可靠的 5.3白名單驗(yàn)證,就是取文件名, 如array('jpg','gif','png','bmp'),文件名為數(shù)組中的元素才可上傳,但是要注意解析漏洞 5.4 重命名,現(xiàn)在一般命名規(guī)則為日期時(shí)間 隨機(jī)數(shù) 白名單后綴對(duì)上傳的文件進(jìn)行重命名,這樣就算被上傳webshell,也因?yàn)楣粽邿o法猜測(cè)出文件名而導(dǎo)致無法訪問webshell 5.5禁止php代碼的執(zhí)行,可以參考文章webshell禁止你執(zhí)行 ? 6.加密混淆javascript代碼,提高攻擊門檻 很多xss漏洞都是在本地閱讀網(wǎng)頁(yè)源碼發(fā)現(xiàn)的,加密javascript代碼提高閱讀門檻 ? 7. 使用更高級(jí)的hash算法保存數(shù)據(jù)庫(kù)中重要信息 目前一般破解hash的手段 7.1彩虹表,??梢匀ス倬W(wǎng)下載,幾百g,經(jīng)常那這個(gè)去破解系統(tǒng)的sam文件 7.2 md5網(wǎng)站,百度一下就有,解密簡(jiǎn)單的 ? 8.驗(yàn)證碼安全 驗(yàn)證驗(yàn)證碼是否安全可以通過一下幾個(gè)方式: 8.1 驗(yàn)證碼是否前端生成,可抓包繞過 8.2 單個(gè)驗(yàn)證碼是否有有效期,單個(gè)驗(yàn)證碼可重復(fù)使用 8.3 驗(yàn)證碼內(nèi)容輸出到客戶端,攻擊者可通過js代碼獲取到 8.4 驗(yàn)證碼太弱 驗(yàn)證碼太簡(jiǎn)單,導(dǎo)致開源的tessertact OCR就可以識(shí)別,。這里有一個(gè)最新機(jī)器識(shí)別繞過12306 火車票驗(yàn)證碼的實(shí)例 參考鏈接:https://www./PENETRATION/php-secure.html 來源:https://www./content-1-607301.html |
|