添加成功,弹框键盘按enter,会无限添加的

回复

X-admin相关滔滔滔 发起了问题 • 1 人关注 • 0 个回复 • 456 次浏览 • 2017-05-16 17:29 • 来自相关话题

小白教你玩转php的闭包

PHP技术交流资料收集专员 发表了文章 • 0 个评论 • 217 次浏览 • 2017-05-07 16:51 • 来自相关话题

php5.3有一个非常赞的新特性,那就是支持匿名函数(闭包)。匿名函数可用于动态创建函数,并保存到一个变量中。举个栗子:
$func = function(){
exit('Hello world!!');
};//这里必须要有;结尾
$func();
等效于
function func(){
exit('Hello world!!');
}
func();
看上去没什么新奇的地方是不?(☆_☆)/~~
别急,继续看。

看这段代码:
function operate($operator){
if($operator == "-"){
return function($a,$b){
return $a-$b;
};
}else{
return function($a,$b){
return $a+$b;
};
}
}
$subtraction = operate("-");
echo $subtraction(4,3);//1
$addition = operate("+");
echo $addition(1,2);//3
通过operate函数,我们可以生成不同的函数作为结果返回,并将这个结果直接作为函数调用,上面的代码分别动态创建了减法运算和加法运算函数。

如果说仅仅是这样的话,那么我并不觉得它有多少吸引力,下面我将展示一个实战中用到的技巧:
<?php
header("Content-Type:text/html;charset=utf-8");
class Di{
private $_factory;
public function set($id,$value){
$this->_factory[$id] = $value;
}

public function get($id){
$value = $this->_factory[$id];
return $value();
}
}
class User{
private $_username;
function __construct($username="") {
$this->_username = $username;
}
function getUserName(){
return $this->_username;
}
}
//从这里开始看
$di = new Di();
$di->set("zhangsan",function(){
return new User('张三');
});
$di->set("lisi",function(){
return new User("李四");
});
echo $di->get("zhangsan")->getUserName();
echo $di->get("lisi")->getUserName();

代码中有一个Di容器用来保存对象实例,然后通过set()方法注册服务,通过get()方法获取服务。
我们看到$di->set()的时候,使用了匿名函数,我们预先注册了zhangsan和lisi两个服务,这两个服务都是User类的实例,在$di->set的时候实际上并没有实例化,而是在$di->get()的时候才执行了匿名函数并将对象返回,这就实现了按需实例化,不用则不实例化,提高效率。

闭包特性:
经常写js的同学应该知道js的闭包特性,简单的说就是在一个函数里可以定义子函数,父函数中的变量在子函数中可以直接使用,那么PHP的闭包怎么用呢?有一点区别。
function func1($a){
return function() use ($a){
echo $a;
};
}
$a = func1("a");
$a();//输出a
当你想将外层变量传进内层匿名函数时,使用use (变量)的方式。

闭包的用途可以用于很多地方,常见于DI模式中,这篇文章的代码只是为了说明,不可以直接使用,谢谢。
来源:http://www.thinkphp.cn/topic/13624.html 查看全部
php5.3有一个非常赞的新特性,那就是支持匿名函数(闭包)。匿名函数可用于动态创建函数,并保存到一个变量中。举个栗子:
$func = function(){
exit('Hello world!!');
};//这里必须要有;结尾
$func();

等效于
function func(){
exit('Hello world!!');
}
func();

看上去没什么新奇的地方是不?(☆_☆)/~~
别急,继续看。

看这段代码:
function operate($operator){
if($operator == "-"){
return function($a,$b){
return $a-$b;
};
}else{
return function($a,$b){
return $a+$b;
};
}
}
$subtraction = operate("-");
echo $subtraction(4,3);//1
$addition = operate("+");
echo $addition(1,2);//3

通过operate函数,我们可以生成不同的函数作为结果返回,并将这个结果直接作为函数调用,上面的代码分别动态创建了减法运算和加法运算函数。

如果说仅仅是这样的话,那么我并不觉得它有多少吸引力,下面我将展示一个实战中用到的技巧:
<?php
header("Content-Type:text/html;charset=utf-8");
class Di{
private $_factory;
public function set($id,$value){
$this->_factory[$id] = $value;
}

public function get($id){
$value = $this->_factory[$id];
return $value();
}
}
class User{
private $_username;
function __construct($username="") {
$this->_username = $username;
}
function getUserName(){
return $this->_username;
}
}
//从这里开始看
$di = new Di();
$di->set("zhangsan",function(){
return new User('张三');
});
$di->set("lisi",function(){
return new User("李四");
});
echo $di->get("zhangsan")->getUserName();
echo $di->get("lisi")->getUserName();


代码中有一个Di容器用来保存对象实例,然后通过set()方法注册服务,通过get()方法获取服务。
我们看到$di->set()的时候,使用了匿名函数,我们预先注册了zhangsan和lisi两个服务,这两个服务都是User类的实例,在$di->set的时候实际上并没有实例化,而是在$di->get()的时候才执行了匿名函数并将对象返回,这就实现了按需实例化,不用则不实例化,提高效率。

闭包特性:
经常写js的同学应该知道js的闭包特性,简单的说就是在一个函数里可以定义子函数,父函数中的变量在子函数中可以直接使用,那么PHP的闭包怎么用呢?有一点区别。
function func1($a){
return function() use ($a){
echo $a;
};
}
$a = func1("a");
$a();//输出a

当你想将外层变量传进内层匿名函数时,使用use (变量)的方式。

闭包的用途可以用于很多地方,常见于DI模式中,这篇文章的代码只是为了说明,不可以直接使用,谢谢。
来源:http://www.thinkphp.cn/topic/13624.html

登录重放攻击预防

PHP技术交流马志斌 发表了文章 • 2 个评论 • 323 次浏览 • 2017-04-17 20:35 • 来自相关话题

现在的应用系统中,大部分密码存储都是采用md5加密后存储,常用的登录基本流程如下:

1、前端web页面用户输入账号、密码,点击登录。

2、请求提交之前,web端首先通过客户端脚本如javascript对密码原文进行md5加密。

3、提交账号、md5之后的密码

4、请求提交至后端,验证账号与密码是否与数据库中的一致,一致则认为登录成功,反之失败。

上述流程看似安全,认为传输过程中的密码是md5之后的,即使被监听截取到,由于md5的不可逆性,密码明文也不会泄露。其实不然!监听者无需解密出密码明文即可登录!监听者只需将监听到的url(如:http://****/login.do?method=login&password=md5之后的密码&userid=登录账号)重放一下,即可冒充你的身份登录系统。

较安全的登录流程

1、进入登陆页面时,生成一个随机码(称之为盐值),在客户端页面和session中各保存一份。

2、客户端提交登录请求时,将md5之后的密码与该随机码拼接后,再次执行md5,然后提交(提交的密码=md5(md5(密码明文)+随机码))。

3、后端接收到登录请求后,将从数据库中查询出的密码与session中的随机码拼接后,md5运算,然后与前端传递的结果进行比较。

该登录方式,即使登录请求被监听到,回放登录URL,由于随机码不匹配(监听者的session中的随机码与被监听者的session中的随机码相同概率可忽略),无法登录成功。

该登录方式,由于传输的密码是原密码md5之后与随机码再次md5之后的结果,即使监听者采用暴力破解的方式,也很难解密出密码明文。

更安全的登录流程

考虑到密码输入的方便性,好多用户的密码都设置的很短,并且不够复杂,往往是6位数字字母组合,这样的密码md5之后保存到数据库,一旦数据库数据泄露,简单密码的md5结果很容易通过暴力破解的方式给解密出来!同时为了方便用户登录的方便性,我们的系统一般不可能要求用户设置很长、很复杂的密码!怎么办?加固定盐值。

1、系统设置一个固定的盐值,该盐值最好足够复杂,如:1qaz2wsx3edc4rfv!@#$%^&**qqtrtRTWDFHAJBFHAGFUAHKJFHAJHFJHAJWRFA

2、用户注册、修改密码时,将用户的原始密码与我们的固定盐值拼接,然后做md5运算。

3、传递至后端,保存进数据库(数据库中保存的密码是用户的原始密码拼接固定盐值后,md5运算后的结果)。

4、登录时,将用户的原始密码与我们的固定盐值进行拼接,然后做md5运算,运算后的结果再拼接上我们的随机码,再次md5运算,然后提交。

5、后端接收到登录请求后,将从数据库中查询出的密码与session中的随机码拼接后,md5运算,然后与前端传递的结果进行比较。

该登录方式可以认为是很很很安全的登录方式了。

进一步完善

1、加登录验证码,可预防人为地暴力登录破解,为方便合法用户的正常登录,可设置密码输入错误次数达到3次后再出现验证码。

2、账户锁定,如果用户密码输入错误次数达到一定量后(如6次),则可以锁定该账号,为了方便合法用户的正常登录,可以设置成一小时后自动解锁。
(原文地址:http://huangqiqing123.iteye.com/blog/2033014) 查看全部
现在的应用系统中,大部分密码存储都是采用md5加密后存储,常用的登录基本流程如下:

1、前端web页面用户输入账号、密码,点击登录。

2、请求提交之前,web端首先通过客户端脚本如javascript对密码原文进行md5加密。

3、提交账号、md5之后的密码

4、请求提交至后端,验证账号与密码是否与数据库中的一致,一致则认为登录成功,反之失败。

上述流程看似安全,认为传输过程中的密码是md5之后的,即使被监听截取到,由于md5的不可逆性,密码明文也不会泄露。其实不然!监听者无需解密出密码明文即可登录!监听者只需将监听到的url(如:http://****/login.do?method=login&password=md5之后的密码&userid=登录账号)重放一下,即可冒充你的身份登录系统。

较安全的登录流程

1、进入登陆页面时,生成一个随机码(称之为盐值),在客户端页面和session中各保存一份。

2、客户端提交登录请求时,将md5之后的密码与该随机码拼接后,再次执行md5,然后提交(提交的密码=md5(md5(密码明文)+随机码))。

3、后端接收到登录请求后,将从数据库中查询出的密码与session中的随机码拼接后,md5运算,然后与前端传递的结果进行比较。

该登录方式,即使登录请求被监听到,回放登录URL,由于随机码不匹配(监听者的session中的随机码与被监听者的session中的随机码相同概率可忽略),无法登录成功。

该登录方式,由于传输的密码是原密码md5之后与随机码再次md5之后的结果,即使监听者采用暴力破解的方式,也很难解密出密码明文。

更安全的登录流程

考虑到密码输入的方便性,好多用户的密码都设置的很短,并且不够复杂,往往是6位数字字母组合,这样的密码md5之后保存到数据库,一旦数据库数据泄露,简单密码的md5结果很容易通过暴力破解的方式给解密出来!同时为了方便用户登录的方便性,我们的系统一般不可能要求用户设置很长、很复杂的密码!怎么办?加固定盐值。

1、系统设置一个固定的盐值,该盐值最好足够复杂,如:1qaz2wsx3edc4rfv!@#$%^&**qqtrtRTWDFHAJBFHAGFUAHKJFHAJHFJHAJWRFA

2、用户注册、修改密码时,将用户的原始密码与我们的固定盐值拼接,然后做md5运算。

3、传递至后端,保存进数据库(数据库中保存的密码是用户的原始密码拼接固定盐值后,md5运算后的结果)。

4、登录时,将用户的原始密码与我们的固定盐值进行拼接,然后做md5运算,运算后的结果再拼接上我们的随机码,再次md5运算,然后提交。

5、后端接收到登录请求后,将从数据库中查询出的密码与session中的随机码拼接后,md5运算,然后与前端传递的结果进行比较。

该登录方式可以认为是很很很安全的登录方式了。

进一步完善

1、加登录验证码,可预防人为地暴力登录破解,为方便合法用户的正常登录,可设置密码输入错误次数达到3次后再出现验证码。

2、账户锁定,如果用户密码输入错误次数达到一定量后(如6次),则可以锁定该账号,为了方便合法用户的正常登录,可以设置成一小时后自动解锁。
(原文地址:http://huangqiqing123.iteye.com/blog/2033014

X-admin怎么设置分页分页

X-admin相关马志斌 回复了问题 • 2 人关注 • 1 个回复 • 1046 次浏览 • 2017-04-12 14:20 • 来自相关话题

第38节:(展现层面)JS流程控制-if

免费PHP教程马志斌 发表了文章 • 0 个评论 • 264 次浏览 • 2017-04-06 08:57 • 来自相关话题

 
 


第37节:(展现层面)JS运算符

免费PHP教程马志斌 发表了文章 • 0 个评论 • 210 次浏览 • 2017-04-06 08:57 • 来自相关话题

 
 


第36节:(展现层面)JS数据类型

免费PHP教程马志斌 发表了文章 • 0 个评论 • 198 次浏览 • 2017-04-06 08:56 • 来自相关话题

 
 


tp框架 验证码怎么显示乱码呢

PHP技术交流马志斌 回复了问题 • 2 人关注 • 1 个回复 • 302 次浏览 • 2017-04-05 20:19 • 来自相关话题

第35节:(展现层面)js变量

免费PHP教程马志斌 发表了文章 • 0 个评论 • 185 次浏览 • 2017-03-31 21:25 • 来自相关话题

 
 


第34节:(展现层面)js输出交互

免费PHP教程马志斌 发表了文章 • 0 个评论 • 143 次浏览 • 2017-03-31 21:16 • 来自相关话题