日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > php >内容正文

php

how to write a php framework,怎么一步步编写简单的PHP的Framework(十四)

發布時間:2023/12/19 php 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 how to write a php framework,怎么一步步编写简单的PHP的Framework(十四) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

今天我說一下怎么在框架中over掉這些安全問題。

首先是SQL注入,這個如果你使用的是PDO,我覺得應該沒什么問題,如果你使用的還是mysql_*等API,那么你可以在框架中實現bindParameter或者在插入數據庫之前進行字符串轉義。

前兩天把上一篇文章寫完之后,Vian在后面留言說到過SQL注入的一個解決方案,就是在在插入DB之前進行'''.addslashes($id).''',它的意思就是首先進行addslashes操作,之后再強制單引號包裹,這樣它就是一個不折不扣的字符串了,所以就注入不了,我覺得這個方法不錯,贊一個!!

由于SQL注入需要聯系到模型,XSS需要聯系到視圖,這兩塊兒我都沒有開始講,所以我再后面再講怎么在框架中解決,當然,如果我寫到后面忘記了,你也可以提醒我一下。

上一次我講CSRF的時候,并沒有給出一個解決方案,今天我就給出這個解決方案。實際上解決的方法很簡單,就是給它產生一個隨機數,然后后端判定傳遞過來的數和正確的數是否吻合, 如果不吻合,就不執行相應的代碼了,這個隨機數我們稱為token。

為了簡單,我們就將產生token和得到token的函數都寫在控制器中,即Controller.php。

首先是生成隨機數,最簡單的方式是使用mt_rand()直接產生一個整數,但在這兒我使用之前我在initphp這個框架中看到的解決csrf的方法,在這兒,也謝謝initphp作者的思路:

initphp的代碼是:

private function set_token() {

if (!$_COOKIE['init_token']) {

$str = substr(md5(time(). $this->get_useragent()), 5, 8);

setcookie("init_token", $str, NULL, '/');

$_COOKIE['init_token'] = $str;

}

} ? ? ? ?為了簡單,我這兒就不使用userAgent了,initphp是將當前時間戳和userAgent拼接成字符串之后再md5加密,取出第5到8位,我這邊的思路是將當前時間戳進行md5加密,然后從第0位開始取,取得的字符串長度是隨機產生的:

$token = substr(md5(time()),0,mt_rand(10,15)); ? ? ? 為了防止隨機數太大或太小,我設置mt_rand的取值范圍為10到15,也就是說產生的token的位數為10到15位。

生成token之后其他的事情就好辦了,當然,首先,也是設置token,我們沒有必要每次用戶請求的時候都產生一個隨機數,所以我們將它存放在COOKIE中,框架載入的時候會判定是否有token,如果沒有則動態生成一個,當然,生成的token會在一段時間之后過期失效,我這兒設置的時間為7天。

private function _setToken() {

if(empty($_COOKIE['_csrfToken'])) {

$token = substr(md5(time()),0,mt_rand(10,15));

$this->_token = $token;

setcookie('_csrfToken',$token,time() + 3600 * 24 * 7);

} else {

$this->_token = $_COOKIE['_csrfToken'];

}

}

由于生成token的過程是框架自動完成的,所以沒有必要讓用戶看到此過程,所以將這個函數設為私有,然后在Controller類的構造函數中調用即可。

剛才是生成token,那么怎么得到token呢,實際上得到token的方法就非常簡單了,就是一個簡單的getter:

protected function _getToken() {

return $this->_token;

} ? ? ? 現在我再演示一下在用戶編寫的控制器的判定過程:

假設用戶請求的URL是:http://localhost/index.php?c=Index&a=test&token=rwerdfdsfsdfs

那么這個控制器的類的代碼如下:

class IndexController extends Controller {

public function test() {

$token = empty($_GET['token']) ? '' : $_GET['token'];

if($token === $this->_getToken()) {

//判定為正常

} else {

$this->_redirect(array(

//跳轉到某一個控制器的某一個Action

));

}

}

} ? ? ? ? 可能有人會問URl上面的token值是怎么設置然后傳遞過來的呢?

我們可以想一下,假設上一個頁面是Index控制器的test2這個Action,那么我們可以在test2這個Action中首先使用$this->_getToken得到token值,然后在將數據傳遞到視圖,視圖中使用了之后,用戶點擊這個鏈接就可以將這個token值傳遞過來了。

我現在提一個問題,假設用戶訪問A頁面的時候得到token,這個token還有兩秒就過期了,這個用戶三秒之后點擊這個含有token的鏈接到達B頁面,B頁面由于COOKIE中的token已經失效,所以重新產生一個token,然后再和傳遞的這個token比較,自然不匹配,然后就跳轉了,這還不是有問題的呢,那么怎么解決呢?

由于還有一點時間,所以我提一下上傳文件漏洞吧,用戶上傳一個比如test.php頁面,如果用戶沒有做文件類型的判定,用戶上傳這個php文件之后,按照鏈接訪問這個頁面,有可能這個頁面中有一些破壞性的代碼,整個網站就危險了。

可能你已經在程序中判定了,只允許后綴為jpg,png,gif這三種類型,那么我可以將這個jsp頁面后綴改成如jpg,上傳成功之后,如果網站存在某種漏洞能夠讓它修改文件后綴,那么你的網站又危險了!!

還假設你的網站不允許修改文件后綴名,但是它在上傳的圖片后面加上一段JS腳本或者在上傳的文件名上面寫一些腳本,這些都可能很危險!!

所以,做好一個WEB應用不是想象中那么容易的,剛才說的是安全這一塊兒的內容,實際上當訪問量大了之后,之前你覺得完全不是問題的問題可能就變成了一個大的問題,除了這兩個,還有其他N個問題,所以,保持低調,繼續學習,繼續提高。。。。

上面一段話僅以自勉,其他人可以忽略。

大四了,還有一個月就要離開天貓回學校做畢設了,我很想在畢業之前給我的網站做一個大幅度的修改,但是我現在不知道到底要做什么,不過肯定這個網站是針對程序員的,希望大家提一點意見,我的個人網站http://www.qingyueit.com(比較挫,好久都沒有更新文章了,甚至連界面也是直接用了別人的主題)。

本次代碼點此下載

總結

以上是生活随笔為你收集整理的how to write a php framework,怎么一步步编写简单的PHP的Framework(十四)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。