php api安全,PHP接口安全
php的api接口
在实际工作中,经常用PHP编写api接口。PHP编写接口后,前台可以通过链接获取接口提供的数据,返回的数据一般分为两种情况,xml和json。在这个过程中,服务器不知道请求的来源是什么。有可能是别人非法调用我们的接口来获取数据,所以需要使用安全验证。
证实原则
示意图
原则
从图中可以清楚地看到,前台如果要调用接口,需要使用几个参数来生成签名。
时间戳:当前时间随机数:随机生成的随机数密码:前台和后台开发时双方都知道的标识,相当于约定的操作规则。上述三个参数可以通过使用算法规则来生成签名。
前台生成一个签名,当需要访问接口时,时间戳、随机数、签名通过URL传输到后台。得到后台时间戳和随机数后,用同样的算法规则计算签名,然后和传递过来的签名进行比较。如果相同,则返回数据。
算法规则
在前后交互中,算法规则很重要。前面和后面都要通过算法规则计算签名。至于规则怎么制定,就看你有多开心了。
我算法的规则是
时间戳、随机数、密码按照首字母的大小写顺序排序,然后拼接成一个字符串进行sha1加密,再进行MD5加密进行大写。
舞台
我在这里没有真正的前台。我直接用一个PHP文件代替前台,然后通过CURL模拟GET请求。我用的是TP框架,URL格式是pathinfo格式。
源代码
?服务器端编程语言(Professional Hypertext Preprocessor的缩写)
*由PhpStorm创建。
*用户:管理员
*日期:2017年3月16日
*时间:15时56分
命名空间客户端\控制器;
使用思考\控制器;
类ClientController扩展控制器{
const TOKEN= API
//模拟前台请求服务器的api接口
公共函数getDataFromServer(){
//时间戳
$ timeStamp=time();
//随机数
$ randomStr=$ this-createnoncastr();
//生成签名
$signature=$this -算术($timeStamp,$ randomStr);
//url地址
$ URL= http://www . API test . com/Server/Server/respond/t/{ $ timeStamp }/r/{ $ randomStr }/s/{ $ signature } ;
$ result=$ this-http get($ URL);
转储($ result);
//curl模拟get请求。
私有函数httpGet($url){
$ curl=curl _ init();
//需要请求哪个地址?
curl_setopt($curl,CURLOPT_URL,$ URL);
//表示将请求的数据以文件流的形式输出到变量中。
curl_setopt($curl,CURLOPT_RETURNTRANSFER,1);
$ result=curl _ exec($ curl);
curl _ close($ curl);
返回$ result
//随机生成一个字符串
私有函数createnoncentr($ length=8){
$ chars= abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz 0123456789 ;
$ str=“”;
for($ I=0;$ i $长度;$i ) {
$str。=substr($chars,mt_rand(0,strlen($chars) - 1),1);
返回“z”。$ str
* @param $timeStamp时间戳
* @ paramrandomStr随机字符串
* @return string返回签名
私有函数算术($timeStamp,$randomStr){
$ arr[ timeStamp ]=$ timeStamp;
$ arr[ randomStr ]=$ randomStr;
$ arr[ TOKEN ]=self:TOKEN;
//按首字母的大小写顺序排序
sort($arr,SORT _ STRING);
//拼接成字符串
$str=内爆($ arr);
//加密
$ signature=sha1($ str);
$ signature=MD5($ signature);
//转换成大写
$ signature=strtoupper($ signature);
return $ signature
计算机网络服务器
接受前台数据进行验证。
源代码
?服务器端编程语言(Professional Hypertext Preprocessor的缩写)
*由PhpStorm创建。
*用户:管理员
*日期:2017年3月16日
*时间:16时01分
命名空间服务器\控制器;
使用思考\控制器;
类ServerController扩展控制器{
const TOKEN= API
//响应前台的请求
公共函数respond(){
//验证您的身份
$ timeStamp=$ _ GET[ t ];
$ randomStr=$ _ GET[ r ];
$ signature=$ _ GET[ s ];
$str=$this -算术($timeStamp,$ randomStr);
if($str!=$signature){
回显-1 ;
退出;
//模拟数据
$ arr[ name ]= API ;
$ arr[ age ]=15;
$ arr[ address ]= ZZ ;
$ arr[ IP ]= 192 . 168 . 0 . 1 ;
echo JSON _ encode($ arr);
* @param $timeStamp时间戳
* @param $randomStr随机字符串
* @返回字符串返回签名
公共函数算术($timeStamp,$randomStr){
$ arr[ timeStamp ]=$ timeStamp;
$ arr[ randomStr ]=$ randomStr;
$ arr[ TOKEN ]=self:TOKEN;
//按照首字母大小写顺序排序
sort($arr,SORT _ STRING);
//拼接成字符串
$str=内爆($ arr);
//进行加密
$ signature=sha1($ str);
$ signature=MD5($ signature);
//转换成大写
$ signature=strtoupper($ signature);
返回$签名
结果
string(57) {name:api , age:15, address:zz , ip:192.168.0.1}
总结
这种方法只是其中的一种方法,其实还有很多方法都是可以进行安全验证的。
http://blog..net/li741350149/article/details/62887524
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。