indesign快速入门动态参数怎么解决

URL参数中值 为空时,会出错,如何处理 - ThinkPHP框架
&a href="__URL__/ipsignset/ip/{$vo['ip']}/company/{$vo['company']}/customs_id/{$vo['customs_id']}" target="dialog"
&分配IP&/a&
如上代码,当company值 为空时 ,在另一面页获取到compay的值为customs_id,而不是正确的空值或""
ThinkPHP 是一个免费开源的,快速、简单的面向对象的 轻量级PHP开发框架 ,创立于2006年初,遵循Apache2开源协议发布,是为了敏捷WEB应用开发和简化企业应用开发而诞生的。ThinkPHP从诞生以来一直秉承简洁实用的设计原则,在保持出色的性能和至简的代码的同时,也注重易用性。并且拥有众多的原创功能和特性,在社区团队的积极参与下,在易用性、扩展性和性能方面不断优化和改进,已经成长为国内最领先和最具影响力的WEB应用开发框架,众多的典型案例确保可以稳定用于商业以及门户级的开发。清除回答草稿
&&&您需要以后才能回答,未注册用户请先。开放API接口签名验证,让你的接口从此不再裸奔
接口安全问题
请求身份是否合法?
请求参数是否被篡改?
请求是否唯一?
AccessKey&SecretKey (开放平台)
为开发者分配AccessKey(开发者标识,确保唯一)和SecretKey(用于接口加密,确保不易被穷举,生成算法不易被猜测)。
按照请求参数名的字母升序排列非空请求参数(包含AccessKey),使用URL键值对的格式(即key1=value1&key2=value2…)拼接成字符串stringA;
在stringA最后拼接上Secretkey得到字符串stringSignTemp;
对stringSignTemp进行MD5运算,并将得到的字符串所有字符转换为大写,得到sign值。
请求携带参数AccessKey和Sign,只有拥有合法的身份AccessKey和正确的签名Sign才能放行。这样就解决了身份验证和参数篡改问题,即使请求参数被劫持,由于获取不到SecretKey(仅作本地加密使用,不参与网络传输),无法伪造合法的请求。
虽然解决了请求参数被篡改的隐患,但是还存在着重复使用请求参数伪造二次请求的隐患。
timestamp+nonce方案
nonce指唯一的随机字符串,用来标识每个被签名的请求。通过为每个请求提供一个唯一的标识符,服务器能够防止请求被多次使用(记录所有用过的nonce以阻止它们被二次使用)。
然而,对服务器来说永久存储所有接收到的nonce的代价是非常大的。可以使用timestamp来优化nonce的存储。
假设允许客户端和服务端最多能存在15分钟的时间差,同时追踪记录在服务端的nonce集合。当有新的请求进入时,首先检查携带的timestamp是否在15分钟内,如超出时间范围,则拒绝,然后查询携带的nonce,如存在已有集合,则拒绝。否则,记录该nonce,并删除集合内时间戳大于15分钟的nonce(可以使用redis的expire,新增nonce的同时设置它的超时失效时间为15分钟)。
请求接口:http://api.test.com/test?name=hello&home=world&work=java
生成当前时间戳timestamp=now和唯一随机字符串nonce=random
按照请求参数名的字母升序排列非空请求参数(包含AccessKey)
stringA="AccessKey=access&home=world&name=hello&work=java&timestamp=now&nonce=random";
拼接密钥SecretKey
stringSignTemp="AccessKey=access&home=world&name=hello&work=java&timestamp=now&nonce=random&SecretKey=secret";
MD5并转换为大写
sign=MD5(stringSignTemp).toUpperCase();
http://api.test.com/test?name=hello&home=world&work=java&timestamp=now&nonce=nonce&sign=
Token&AppKey(APP)
在APP开放API接口的设计中,由于大多数接口涉及到用户的个人信息以及产品的敏感数据,所以要对这些接口进行身份验证,为了安全起见让用户暴露的明文密码次数越少越好,然而客户端与服务器的交互在请求之间是无状态的,也就是说,当涉及到用户状态时,每次请求都要带上身份验证信息。
Token身份验证
用户登录向服务器提供认证信息(如账号和密码),服务器验证成功后返回Token给客户端;
客户端将Token保存在本地,后续发起请求时,携带此Token;
服务器检查Token的有效性,有效则放行,无效(Token错误或过期)则拒绝。
安全隐患:Token被劫持,伪造请求和篡改参数。
Token+AppKey签名验证
与上面开发平台的验证方式类似,为客户端分配AppKey(密钥,用于接口加密,不参与传输),将AppKey和所有请求参数组合成源串,根据签名算法生成签名值,发送请求时将签名值一起发送给服务器验证。这样,即使Token被劫持,对方不知道AppKey和签名算法,就无法伪造请求和篡改参数。再结合上述的重发攻击解决方案,即使请求参数被劫持也无法伪造二次重复请求。
登陆和退出请求
和上述开放平台的客户端行为类似,把AccessKey改为token即可。
请移步,博主正在开发的一款开源项目,其中接口验证采用的就是上文中开放平台的验证方案,欢迎大家Star!
没有更多推荐了,有容乃大,无欲则刚
Sign签名生成与校验
参数说明:
from 接口发起方标识,由管理员分配
secret 密钥,由管理员分配
timestamp 时间戳 s (用于校验签名有效期)
1.对所有参数(此时不含sign参数)升序排列得出arrarg
2.把arrarg的值以’&’拼接成一个字符串得出strarg
3.secret.’&’.strarg.’&’.secret得出sign
defined('BASEPATH') OR exit('No direct script access allowed');
class Sign {
const TIME = 'timestamp';
const FROM = 'from';
const SIGN = 'sign';
const TIMEOUT = 30;
private $ci;
private $froms;
public function __construct()
$this-&ci =& get_instance();
$this-&froms = $this-&ci-&config-&item('api_froms');
[array] $args [参数列表]
[string] $secret [密钥]
* @return [string] sign
public function create($args,$secret)
if(isset($args[self::SIGN]))
unset($args[self::SIGN]);
if(!is_array($args))
return FALSE;
ksort($args);
$strArgs = implode('&', $args);
return md5($secret.'&'.$strArgs.'&'.$secret);
string $method [调用方式]
* @return [array]
public function valid($data)
$err = -2;
$msg = 'falid';
if( FALSE === $secret=$this-&checkFrom($data) )
$msg = 'the from is not defined';
elseif(FALSE === $this-&checkTime($data))
$msg = 'the sign is overdue';
elseif(FALSE === $this-&checkSign($data,$secret))
$msg = 'the sign is wrong';
$msg = 'ok';
return array('err'=&$err,'msg'=&$msg);
private function checkSign($data,$secret)
$sign = isset($data[self::SIGN]) ? $data[self::SIGN] : FALSE;
if(!$sign )
return FALSE;
elseif($sign != $this-&create($data,$secret))
return FALSE;
return TRUE;
private function checkTime($data)
if(! isset($data[self::TIME]))
return FALSE;
elseif( self::TIMEOUT & intval(time()-$data[self::TIME]) )
return FALSE;
return TRUE;
private function checkFrom($data)
if( ! isset($this-&froms[$data[self::FROM]]) )
return FALSE;
return $this-&froms[$data[self::FROM]];
没有更多推荐了,

我要回帖

更多关于 d.sign是什么牌子 的文章

 

随机推荐