PHP接口开发数据签名程序代码
现在应用开发中通常会用到接口,其数据是通过开放的互联网传输,对数据的安全性有一定要求,为了防止数据在传输过程中被篡改,常用数据签名(sign)的方式来校验。
数据签名sign生成方法
①去除数组中的空值和签名参数(sign/sign_type)
②按键名升序排列数组
③把数组所有元素,按照“参数=参数值”的模式用“&”字符拼接成字符串
④把拼接后的字符串再与安全校验码直接连接起来
⑤MD5等加密函数,加密字符串
示例代码
class Sign {
/**
* 获取数据签名
*
* @param array $param 签名数组
* @param string $code 安全校验码
* @param string $sign_type 签名类型
* @return string 签名字符串
*/
public static function getSign($param, $code, $sign_type = 'MD5'){
//去除数组中的空值和签名参数(sign/sign_type)
$param = self::paramFilter($param);
//按键名升序排列数组
$param = self::paramSort($param);
//把数组所有元素,按照“参数=参数值”的模式用“&”字符拼接成字符串
$param_str = self::createLinkstring($param);
//把拼接后的字符串再与安全校验码直接连接起来
$param_str = $param_str . $code;
//创建签名字符串
return self::createSign($param_str, $sign_type);
}
/**
* 校验数据签名
*
* @param string $sign 接口收到的签名
* @param array $param 签名数组
* @param string $code 安全校验码
* @param string $sign_type 签名类型
* @return boolean true正确,false失败
*/
public static function checkSign($sign, $param, $code, $sign_type = 'MD5'){
return $sign == self::getSign($param, $code, $sign_type);
}
/**
* 去除数组中的空值和签名参数
*
* @param array $param 签名数组
* @return array 去掉空值与签名参数后的新数组
*/
private static function paramFilter($param){
$param_filter = array();
foreach ($param as $key => $val) {
if($key == 'sign' || $key == 'sign_type' || !strlen($val)){
continue;
}
$param_filter[$key] = $val;
}
return $param_filter;
}
/**
* 按键名升序排列数组
*
* @param array $param 排序前的数组
* @return array 排序后的数组
*/
private static function paramSort($param){
ksort($param);
reset($param);
return $param;
}
/**
* 把数组所有元素,按照“参数=参数值”的模式用“&”字符拼接成字符串
*
* @param array $param 需要拼接的数组
* @return string 拼接完成以后的字符串
*/
private static function createLinkstring($param){
$str = '';
foreach ($param as $key => $val) {
$str .= "{$key}={$val}&";
}
//去掉最后一个&字符
$str = substr($str, 0, strlen($str) - 1);
//如果存在转义字符,那么去掉转义
if(get_magic_quotes_gpc()){
$str = stripslashes($str);
}
return $str;
}
/**
* 创建签名字符串
*
* @param string $param 需要加密的字符串
* @param string $type 签名类型 默认值:MD5
* @return string 签名结果
*/
private static function createSign($param, $type = 'MD5'){
$type = strtolower($type);
if($type == 'md5'){
return md5($param);
}
if($type == 'dsa'){
exit('DSA 签名方法待后续开发,请先使用MD5签名方式');
}
exit("接口暂不支持" . $type . "类型的签名方式");
}
}
Codeigniter支持缓存技术,以达到最快的速度。尽管CI已经相当高效了,但是网页中的动态内容、主机的内存CPU和数据库读取速度等因素直接影响了网页的加载速度。依靠网页缓存,你的网页可以达到近乎静态网页的加载速度,因为他们将程序输出的结果保存到硬盘上了。
缓存是怎么工作的?
CI支持每个页面单独缓存,而且可以设置缓存更新时间。当一个网页第一次被加载的时候,缓存文件将被保存到application/cache文件夹。下次访问的时候,系统就会直接读取缓存文件,然后返回给用户的浏览器。如果缓存文件过期,它将被删除并重新生成。
注意:Benchmark标签在使用了缓存的页面仍然可用。
启动缓存
启用缓存功能,只需要将下面的代码放入你的任何一个控制器(controller)的方法(function)内:
$this->output->cache(n);
其中n是你希望缓存更新的分钟数。可以使用m/60来精确到秒,例如1/60,则是精确到1秒 上面的代码可以放到任何一个function里面。他的出现顺序对缓存并没有影响,所以将它放在你认为最合乎逻辑的地方。一旦上面的代码放到了控制器的方法中,页面就会被缓存。 警告:由于CI存储缓存文件的方式,只有通过view文件的输出才能被缓存。 注意:在缓存文件产生之前,请确保application/cache文件夹可写。
清除缓存
如果你不再想使用缓存,仅需将上面的代码从你的controller里面删除即可。注意:这样做并不能让缓存文件立即消失,它将会自动过期并被删除。如果你想立即删除那些文件,就必须自己动手了。
可手动设置缓存开关。如果您想保留某些查询不被缓存 这个功能就十分有用。例如:
// 打开缓存开关
$this->db->cache_on();
$query = $this->db->query("SELECT * FROM mytable");
// 使下面这条查询不被缓存
$this->db->cache_off();
$query = $this->db->query("SELECT * FROM members WHERE member_id = '$current_user'");
// Turn caching back on
$this->db->cache_on();
$query = $this->db->query("SELECT * FROM another_table");
删除缓存文件与特定网页。如果你需要清除缓存后,更新您的数据库。
缓存系统会在缓存存放目录中建立与被访问的URL所对应的子目录,同时把缓存文件存放在那个子目录中.缓存主目录就是您在application/config/database.php 里面设置的缓存目录. 例如, 如果您正在浏览地址为 example.com/index.php/blog/comments的页面, 缓存系统会把所有生成的缓存文件放进一个以 blog+comments做为名称的文件夹里. 如果您要删除关于刚才提到的这个例子与之对应的缓存文件 需要执行以下代码:
$this->db->cache_delete('blog', 'comments');
$this->db->cache_delete('blog', 'comments'),我在实际测试的时候不起作用,不知道为什么原因,不知道是不是小bug?但是下面的$this->db->cache_delete_all()是可以的,没有问题。
如果您不使用任何参数,目前的URI设置将决定什么时候应该清除/更新 该缓存。
清除所有所有的缓存文件。例子:
$this->db->cache_delete_all();
缓存小记
1. 数据库缓存
数据库缓存主要是针对于SELECT查询
// 打开缓存开关
$this->db->cache_on();
$query1 = $this->db->query("SELECT * FROM mytable");
// 使下面这条查询不被缓存
$this->db->cache_off();
$query2 = $this->db->query("SELECT * FROM members WHERE member_id = '$current_user'");
// 再次打开缓存开关
$this->db->cache_on();
$query3 = $this->db->query("SELECT * FROM another_table");
这样query1和query3就被缓存在文件中了,缓存的路径根据您的URL而定,如example.com/index.php/blog/comments的页面, 缓存系统会把所有生成的缓存文件放进一个以 blog+comments做为名称的文件夹里. 如果您要删除关于刚才提到的这个例子与之对应的缓存文件 需要执行以下代码:
$this->db->cache_delete('blog', 'comments');//$this->db->cache_delete('blog', 'comments')#来删除缓存 如果要清除所有数据库缓存:
$this->db->cache_delete_all(); *其cache模式在于针对不同的uri就会生成cache文件,如果URL中参数不同,则 cache文件就会不同,从而产生了漏洞。如果访问者构建自动生成URI,不断向服务器发起请求,就会瞬间产生大量的垃圾文件,导致系统文件臃肿。
2. 页面缓存
$this->output->cache(n); // 请确保application/cache可写 n 是你希望缓存更新的 分钟 数。可以使用 m/60 来精确到秒,例如 1/60 ,则是精确到 1秒
3. 序例化缓存到文件
$this->load->driver('cache', array('adapter' => 'apc', 'backup' => 'file'));
if ( ! $foo = $this->cache->get('foo'))
{
echo 'Saving to the cache!<br />';
$foo = 'foobarbaz!';
// Save into the cache for 5 minutes
$this->cache->save('foo', $foo, 300);
}
echo $foo;
第一种方式
$data = eval(‘return ‘.iconv(‘gbk’,’utf-8′,var_export($data,true)).';’);
在这里var_export函数可以输出或返回一个变量的字符串表示。此函数返回关于传递给该函数的变量的结构信息,它和 var_dump()
类似,不同的是其返回的表示是合法的 PHP 代码。
可以通过将函数的第二个参数设置为 TRUE,从而返回变量的表示。
下面就利用这一特性将数组转化为字符串然后再iconv接着再用eval函数将其还原为数组。这次结果正确显示了。
第二种方式
< ?php
class arrayiconv
{
static protected $in;
static protected $out;
/**
* 静态方法,该方法输入数组并返回数组
*
* @param unknown_type $array 输入的数组
* @param unknown_type $in 输入数组的编码
* @param unknown_type $out 返回数组的编码
* @return unknown 返回的数组
*/
static public function Conversion($array,$in,$out)
{
self::$in=$in;
self::$out=$out;
return self::arraymyicov($array);
}
/**
* 内部方法,循环数组
*
* @param unknown_type $array
* @return unknown
*/
static private function arraymyicov($array)
{
foreach ($array as $key=>$value)
{
$key=self::myiconv($key);
if (!is_array($value)) {
$value=self::myiconv($value);
}else {
$value=self::arraymyicov($value);
}
$temparray[$key]=$value;
}
return $temparray;
}
/**
* 替换数组编码
*
* @param unknown_type $str
* @return unknown
*/
static private function myiconv($str)
{
return iconv(self::$in,self::$out,$str);
}
}
$b=array(“测试”=>array(“测试”=>”测试”,”测试”=>”测试”,”测试”=>array(“测试”=>”测试”)),”fasdf”=>”测试”,”测试”=>”测试 “);
$a =arrayiconv::Conversion($b,”utf-8″,”gb2312″);
print_r($a);
?>
开发的时候,基本上都会把display_errors,error_reporting开启,有助于提高开发效率,上线后,基本上都会关掉页面报错信息,在把报错信息,放到文件中。
一,php-fpm的error_log配置
1,修改php.ini
display_errors = Off //改为off,页面访问时就不会出现报错信息了
2,修改php-fpm配置文件
;php_flag[display_errors] = off
php_admin_value[error_log] = /var/log/php-fpm/www-error.log
php_admin_flag[log_errors] = on
重启php-fpm,在这里要注意,php-fpm的配置会替换php.ini中的配置,display_errors也可以在php-fpm中配置。这样页面上就不会出现报错信息,报错信息被记录到了文件中。
二,命令行下的error_log配置,修改php.ini
display_errors = Off
log_errors = On
error_log = /var/log/cron/error.log
执行命令,例如:
[root@network www]# php test.php //test.php有语法错误
命令行下,是不调用php-fpm的配置的,所以我们只能修改php.ini的内容,修改后,不用重启php。执行命令后,错误信息,会被写到error.log文件中,这种情况适合crontab的php脚本。
相关文章
- 本文给大家分享C#连接SQL数据库和查询数据功能的操作技巧,本文通过图文并茂的形式给大家介绍的非常详细,需要的朋友参考下吧...2021-05-17
- 最基础的对数据的增加删除修改操作实例,菜鸟们收了吧...2013-09-26
- 这篇文章主要介绍了解决Mybatis 大数据量的批量insert问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-01-09
Antd-vue Table组件添加Click事件,实现点击某行数据教程
这篇文章主要介绍了Antd-vue Table组件添加Click事件,实现点击某行数据教程,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-11-17- 这篇文章主要介绍了详解如何清理redis集群的所有数据,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-02-18
- 有一种方法,可以不打开网站而直接查看到这个网站的源代码.. 这样可以有效地防止误入恶意网站... 在浏览器地址栏输入: view-source:http://...2016-09-20
- <?php require('path.inc.php'); header('content-Type: text/html; charset=utf-8'); $borough_id = intval($_GET['id']); if(!$borough_id){ echo ' ...2016-11-25
- 这篇文章主要介绍了vue 获取到数据但却渲染不到页面上的解决方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-11-19
- 本文实例讲述了JS+CSS实现分类动态选择及移动功能效果代码。分享给大家供大家参考,具体如下:这是一个类似选项卡功能的选择插件,与普通的TAb区别是加入了动画效果,多用于商品类网站,用作商品分类功能,不过其它网站也可以用,...2015-10-21
- 本文实例讲述了JS实现自定义简单网页软键盘效果。分享给大家供大家参考,具体如下:这是一款自定义的简单点的网页软键盘,没有使用任何控件,仅是为了练习JavaScript编写水平,安全性方面没有过多考虑,有顾虑的可以不用,目的是学...2015-11-08
- 本文实例讲述了JS基于Mootools实现的个性菜单效果代码。分享给大家供大家参考,具体如下:这里演示基于Mootools做的带动画的垂直型菜单,是一个初学者写的,用来学习Mootools的使用有帮助,下载时请注意要将外部引用的mootools...2015-10-23
- 这篇文章主要介绍了mybatis-plus 处理大数据插入太慢的解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-12-18
- 在php中解析xml文档用专门的函数domdocument来处理,把json在php中也有相关的处理函数,我们要把数据xml 数据存到一个数据再用json_encode直接换成json数据就OK了。...2016-11-25
- php 取除连续空格与换行代码,这些我们都用到str_replace与正则函数 第一种: $content=str_replace("n","",$content); echo $content; 第二种: $content=preg_replac...2016-11-25
- php简单用户登陆程序代码 这些教程很对初学者来讲是很有用的哦,这款就下面这一点点代码了哦。 <center> <p> </p> <p> </p> <form name="form1...2016-11-25
- 公司一些wordpress网站由于下载的插件存在恶意代码,导致整个服务器所有网站PHP文件都存在恶意代码,就写了个简单的脚本清除。恶意代码示例...2015-10-23
- 这篇文章主要给大家分享的是TypeScript 索引签名的理解,索引签名由方括号中的索引名称及其类型组成,后面是冒号和值类型:{ [indexName: KeyType]: ValueType }, KeyType 可以是一个 string、number 或 symbol,而ValueType 可以是任何类型,下面就俩简单了解一下吧...2021-10-15
- 这篇文章主要介绍了postgresql数据添加两个字段联合唯一的操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-02-04
- 其实挺简单的就是if(navigator.userAgent.indexOf('UCBrowser') > -1) {alert("uc浏览器");}else{//不是uc浏览器执行的操作}如果想测试某个浏览器的特征可以通过如下方法获取JS获取浏览器信息 浏览器代码名称:navigator...2015-11-08
- 本文实例讲述了JS实现双击屏幕滚动效果代码。分享给大家供大家参考,具体如下:这里演示双击滚屏效果代码的实现方法,不知道有觉得有用处的没,现在网上还有很多还在用这个特效的呢,代码分享给大家吧。运行效果截图如下:在线演...2015-10-30