Ⅰ 如何评价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);
}
}
}
}