Ⅰ 如何評價thinkphp5.0
ThinkPHP5 重新顛覆了之前的版本。
1.支持 Composer,PHPunit(中大型項目必備的依賴管理和測試框架)
2.使用同 yii2 一樣的類惰性載入(性能暴升)
3.大量參考了 Laravel 風格,還保證了以往 ThinkPHP 簡單易學(優雅並且易學)
4.引入了 php5.4 特性 Traits 拓展(多重繼承,以前的關聯模型,視圖模型混合一起用)
5.終於遵循 PSR 規范了!終於遵循 PSR 規范了!終於遵循 PSR 規范了!
符合PSR-4的自動載入規范(專門寫給CI黨:PSR-4 是命名空間的自動載入規范哦)
6.以前單字母全局函數改成了別名函數(M,D,S,C等,除了易學好用還不會污染全局)
7.兼容 php 7,局部兼容 hhvm
Ⅱ thinkphp怎麼做才是安全的sql防注入
注入的產生一般都是對用戶輸入的參數未做任何處理直接對條件和語句進行拼裝.
代碼舉例:
//不安全的寫法舉例1
$_GET['id']=8;//希望得到的是正整數
$data=M('Member')->where('id='.$_GET['id'])->find();
$_GET['id']='8 or status=1';//隱患:構造畸形查詢條件進行注入;
//安全的替換寫法
$data=M('Member')->where(array('id'=>$_GET['id']))->find();//使用數組方式將自動使用框架自帶的欄位類型檢測防止注入
$data=M('Member')->where(array('id'=>(int)$_GET['id']))->find();//類型約束
$data=M('Member')->where('id='.intval($_GET['id']))->find();//類型轉換
$data=M('Member')->where(array('id'=>I('get.id','','intval')))->find();//本人習慣寫法
$data=M('Member')->where(array('id'=>':id'))->bind(':id',I('get.id'))->select();//PDO驅動可以使用參數綁定
$data=M('Member')->where("id=%d",array($_GET['id']))->find();//預處理機制
//不安全的寫法舉例2
$_GET['id']=8;//希望得到的是正整數
$data=M()->query('SELECT * FROM `member` WHERE id='.$_GET['id']);//執行的SQL語句
$_GET['id']='8 UNION SELECT * FROM `member`';;//隱患:構造畸形語句進行注入;
2.防止注入的總的原則是<<根據具體業務邏輯,對來源於用戶的值的范圍,類型和正負等進行限制和判斷>>,同時<<盡量使用THINKPHP自帶的SQL函數和寫法>>.
3.在THINKPHP3.2版本中的操作步驟是:
一:在項目配置文件中添加配置: 'DEFAULT_FILTER' => 'htmlspecialchars', //默認過濾函數
二: 使用框架帶的I方法獲取來自用戶提交的數據;
例子:M('Member')->save(array('content'=>I('post.content')));這樣添加的content內容是經過htmlspecialchars處理過的.
4.為COOKIE添加httponly配置
5.最新版本的thinkphp已經支持此參數。
9.富文本過濾
富文本過濾是,XSS攻擊最令人頭疼的話題,不僅是小網站,就連BAT這樣的巨頭也是三天兩頭的被其困擾.
Ⅲ 新手學習thinkphp6還是thinkphp5比較好
thinkphp5好
ThinkPHP5是一個全新的里程碑版本,包括路由、日誌、異常、模型、資料庫、模板引擎和驗證等模塊都已經重構,不適合原有3.2項目的升級,請慎重考慮商業項目升級,但絕對是新項目的首選(無論是WEB還是API開發),而且最好是忘記3.2版本的思維習慣,重新理解TP5。
Ⅳ Thinkphp5防止某個IP多次登錄的方法
//昨天寫的思路不對,重新寫....
/**
*檢查IP是否重復登錄多次
*/
public function check_ip(){
//獲取ip
$login_ip=$_SERVER["REMOTE_ADDR"];
$login_time=date("Y-m-d",time());
if(Cache::get('cache_login_data')==false){
//如果ip換成為false,那麼創建一個緩存,並賦值第一個
$login_data[0]=['login_ip'=>$login_ip,'login_time'=>$login_time];
Cache::set('cache_login_data',$login_data);
}else{
//如果有cache,那麼將這條數據加入到緩存中最後一條去
$cache_login_data=Cache::get('cache_login_data');
$count=0;
foreach($cache_login_dataas$k=>$v){
//如果當前緩存中的值含有當前ip和時間,那麼計算當前時間內登錄次數
if($v['login_time']==$login_time&&$v['login_ip']==$login_ip){
$count++;
if($count>10){
//當前ip登錄超過10次
$this->error("你登錄超過了10次,請不要再來登了...","Login/index");
}else{
//當前時間內有該IP登陸過,但是沒有超過10次
$cache_login_data[count($cache_login_data)+1]=['login_ip'=>$login_ip,'login_time'=>$login_time];
Cache::set('cache_login_data',$cache_login_data);
}
}else{
//當前時間內,該IP沒有登陸過
$cache_login_data[count($cache_login_data)+1]=['login_ip'=>$login_ip,'login_time'=>$login_time];
Cache::set('cache_login_data',$cache_login_data);
}
}
}
}