用php写一个php大转盘抽奖源码网站需要有哪些接口

您所在的位置: &
关于PHP写APP接口的安全问题探讨(一)
时间: 编辑:菜问 来源:本站整理
在探讨这个问题之前,先要确认一点的是,作为一名互联网Coder,无论你是前端或者后端你都要对http请求要有一定的了解,知道http特性,要清楚的了解http里面的Request与Response是什么,知道为什么网站会存在cookie,session,验证码的意义和必要性。因为探讨APP接口的安全性就是在探讨HTTP请求的安全性;
我一般把APP接口分为三类,普通接口,表单接口,会员接口;本文重点讨论会员接口
一般为GET请求,比如获取新闻列表 GET /index.?module=news&action=list,为了防止采集或者暴力查询,我们PC端一般做如下处理:
防止本站被它站file_get_contents,所以要识别user_agent,如果不是通过浏览器来访问的话直接不给看。
如果别人通过伪造user_agent来访问的话,就通过单位时间ip的访问量来控制抓取方,可以写一套算法,如果再一个ip在前后一分钟多于多少次访问量来处理。但是,会有一种情况,即某个小区或公司内都是使用某一个IP的外网的话,这样搞就会自寻死路,所以还要配合浏览器中的cookie来处理总结: 请求头可以伪造,IP地址可以变更,cookie可以清空,基本上PC端是很难防这个问题的,比如淘宝,点评等大站的数据我也是经常去采的。
那APP端如何处理这个问题呢?我们可以抓点评APP的http请求包来看一下:
GET http://114.80.165.113/mapi/ugcuserfeeds.bin?filtertype=5&userid=&token=a9cdff854d989f61eabf0fc9904eb51ff&start=0 HTTP/1.1
Host: 114.80.165.113
Accept: */*
pragma-appid:
pragma-newtoken: cabf96c8ef2bac73b88f799e49aab4a426d414f994b5f
pragma-token: a9cdff854d989f61eabf0fc9904eb51ff
pragma-dpid: 1942797
pragma-device: 566fe5aeb75a827967fbadba98a4a6
Proxy-Connection: keep-alive
pragma-os: MApi 1.1 (dpscope 7.5.0 iPhone 8.3 iPhone7,1; a0d0)
Accept-Language: zh-cn
network-type: wifi
User-Agent: MApi 1.1 (dpscope 7.5.0 iPhone 8.3 iPhone7,1; a0d0) Paros/3.2.13
当你直接访问http://114.80.165.113/mapi/ugcuserfeeds.bin?filtertype=5&userid=&token=a9cdff854d989f61eabf0fc9904eb51ff&start=0的时候,直接从服务器端给挡住,并返回450错误;PHP的服务器一般为Apache或Nignx,我们也可以在配置项中根据与客户端开发人员约定的一些自定义的Request头信息,比如上面的parama-*,在服务器配置项中可以获取到这些自定义的Request头信息,然后根据是否为约定好的Request信息,如果不是就rewrite到450;
但是,我们通过抓包既可获得全部请求头信息,这时可以完全模拟请求头信息来获取数据;
很多APP最多到此步既可获得该API接口的数据,而且是非常便于处理的on格式,而点评APP到此处直接返回的是一堆看上去是经过压缩的乱码数据:这有点类似于PC端gzip,服务器端返回的是gzip的压缩数据,而浏览器来解压这个gzip来获取真正的数据,然后再显示出来;我不知道点评的这个乱码数据是否也是这个原理,如果是的话,不得不说真的是&棒棒哒&,因为解压的算法是发生在自己的APP端,这不仅保证了数据的安全性,而且还节省带宽流量,加快的数据传输速度。具体是怎么样做的,暂时还不得而知;
即类似html中的from表单,主要是往服务器提交数据的。一般是post方式的http请求,主要的危险是来自于强刷HTTP请求,撑爆数据库;在PC端我们一般通过验证码来解决这个问题,而在APP端,我能想到的也只有通过验证码的方式,只不过PC端的是把验证码存进session,而APP端是存进cache里面;但如果加上验证码的话,在用户体验上肯定会大打折扣,关于这一点肯定有更好的方式解决,具体怎么解决,暂时还不得而知;
所谓会员接口,就是类似/index.php?module=users&action=info&user_id=333的请求,然后服务器端直接根据user_id来做相应的会员操作,这是及其危险的接口处理,等于把当前的会员系统全暴露出来了,只要对方改一下user_id既可操作所有会员对应的接口。一般在PC端,我们是通过加密的cookie来做会员的辨识和维持会话的;但是cookie是属于浏览器的本地存储功能。APP端不能用,所以我们得通过token参数来辨识会员;而这个token该如何处理呢?
首先,先说说在做该接口加密前,我一共经历的四个方案:
方案一与APP端开发人员约定特定的md5组合算法,然后两端比对一下,如果相同就allow,不相同就deny;但是,这也是不安全的,如果APP程序被反编译,这些约定的算法就会暴露,特别是在安卓APP中,有了算法,完全就可以模拟接口请求通过验证;
方案二数据库会员表的password是带上了随机密窜并经过双重加密的md5值;在用户登录的时候,我返回会员相应的uid和password,password虽然是明文的,别人知道也不能登录,毕竟是经过加密的,然后每次请求接口的时候user_id=333&token=aa37e10ceab8a2d5020568f,通过主键uid可以很快的找到当前uid对应的token,然后再来比对;但是这样想法是too yang too simple的,抓包的人虽然不能通过密文密码来登录该会员,然而一旦知道了这个token,除非用户更改密码,否则也可以一直通过这个token来操作该会员的相关接口;
方案三通过对称加密算法,该加密算法对uid+网站公钥进行时效加密,在一定时效内可用。在会员登录成功时,服务器端对该ID加密后返回给客户端,客户端每次请求接口的时候带上该参数,服务器端通过解密认证;但是这样做,也是不安全的。因为,防外不防内,听说这次的携程宕机就是因为内部离职人员的恶意操作。内部不怀好意的人员如果知道相应的算法规则后,就算没有数据库权限,也可以通过接口来操作相关会员;
方案四会员登录的时候请求登录接口,然后服务器端返回给客户端一个token,该token生成的规则是 网站公钥 + 当前uid + 当前时间戳 + 一段随机数双重加密,根据需求决定是把该token放进cache等一段时间自动失效,还是放进数据库(如果要放进数据库的话,单独拎出一张表来,顺便记录用户的登录,登出时间),在用户登出登录的时候改变一下,确保该token只能在用户人为登出登录之间有用。为保安全,应保证让用户在一段时间内自动退出;此方案配合Linux和数据库的权限管理可以防外又防内;
其他接口开发的注意事项
数据格式最好使用JSON格式数据,因为JSON有较好的跨平台性。在生成JSON的时候,要注意json的两种格式:对象(字典) 与 数组;mobile端开发语言中没有类似PHP中的foreach不能遍历对象,只能遍历数组,他们对对象的操作一般都是通过键名去取键值。
不管是成功,还是失败。接口必须提供明确的数据状态信息,并且不能返回NULL,如果返回NULL的话,在IOS端会崩掉。
热门关键字第三方登录
打开微信“扫一扫”,打开网页后点击屏幕右上角分享按钮
自己在网上找到的PHP快递接口类,因为时间有点长,忘记原文链接是哪里了,如果有朋友知道这个PHP快递接口类的原文地址,请在下方留言或直接QQ我,谢了
class Express{
public function __construct($name,$num){
return $this-&getExpressInfo($this-&searchExpress($name),$num);
function searchExpress($keyword)
$expresses = array (
"AAE" =& "aae",
"安捷" =& "anjie",
"安信达" =& "anxinda",
"Aramex" =& "aramex",
"CCES" =& "cces",
"长通" =& "changtong",
"程光" =& "chengguang",
"城市100" =& "chengshi100",
"传喜" =& "chuanxi",
"传志" =& "chuanzhi",
"CityLink" =& "citylink",
"东方" =& "coe",
"城市之星" =& "cszx",
"大田" =& "datian",
"大洋" =& "dayang",
"德邦" =& "debang",
"DHL" =& "dhl",
"店通" =& "diantong",
"递达" =& "dida",
"递四方" =& "disifang",
"DPEX" =& "dpex",
"D速" =& "dsu",
"百福东方" =& "ees",
"EMS" =& "ems",
"ems" =& "ems",
"凡宇" =& "fanyu",
"Fedex" =& "fedex",
"联邦" =& "fedexcn",
"飞邦" =& "feibang",
"飞豹" =& "feibao",
"原飞航" =& "feihang",
"飞狐" =& "feihu",
"飞远" =& "feiyuan",
"丰达" =& "fengda",
"飞康达" =& "fkd",
"广东邮政" =& "gdyz",
"共速达" =& "gongsuda",
"国通" =& "guotong",
"海盟" =& "haimeng",
"昊盛" =& "haosheng",
"河北建华" =& "hebeijianhua",
"华企" =& "huaqi",
"华夏龙" =& "huaxialong",
"华宇" =& "huayu",
"汇强" =& "huiqiang",
"汇通" =& "huitong",
"佳吉" =& "jiaji",
"佳怡" =& "jiayi",
"加运美" =& "jiayunmei",
"京广" =& "jingguang",
"晋越" =& "jinyue",
"急先达" =& "jixianda",
"嘉里大通" =& "jldt",
"快捷" =& "kuaijie",
"乐捷递" =& "lejiedi",
"联昊通" =& "lianhaotong",
"立即送" =& "lijisong",
"龙邦" =& "longbang",
"能达" =& "nengda",
"OCS" =& "ocs",
"平安达" =& "pinganda",
"邮政" =& "pingyou",
"全晨" =& "quanchen",
"全峰" =& "quanfeng",
"全际通" =& "quanjitong",
"全日通" =& "quanritong",
"全一" =& "quanyi",
"RPX" =& "rpx",
"如风达" =& "rufeng",
"赛澳递" =& "saiaodi",
"三态" =& "santai",
"伟邦" =& "scs",
"圣安" =& "shengan",
"盛丰" =& "shengfeng",
"盛辉" =& "shenghui",
"申通" =& "shentong",
"顺丰" =& "shunfeng",
"穗佳" =& "suijia",
"速尔" =& "sure",
"天天" =& "tiantian",
"TNT" =& "tnt",
"通成" =& "tongcheng",
"通和" =& "tonghe",
"UPS" =& "ups",
"USPS" =& "usps",
"万家" =& "wanjia",
"新邦" =& "xinbang",
"信丰" =& "xinfeng",
"源安达" =& "yad",
"亚风" =& "yafeng",
"一邦" =& "yibang",
"银捷" =& "yinjie",
"优速" =& "yousu",
"一统飞鸿" =& "ytfh",
"远成" =& "yuancheng",
"圆通" =& "yuantong",
"元智" =& "yuanzhi",
"越丰" =& "yuefeng",
"韵达" =& "yunda",
"运通" =& "yuntong",
"源伟丰" =& "ywfex",
"宅急送" =& "zhaijisong",
"芝麻开门" =& "zhima",
"中铁" =& "zhongtie",
"中通" =& "zhongtong",
"忠信达" =& "zhongxinda",
"中邮" =& "zhongyou"
return $expresses[$keyword];
function getExpressInfo($companyEn, $number)
$key = "1DC833D5BE7F70E8B4E4";
$url= "/?id=1DC833D5BE7F70E8B4E4&com=".$companyEn."&nu=".$number."&type=json&encode=utf8";
//$url= "/api?id=".$key."&com=".$companyEn."&nu=".$number."&show=0&muti=1&order=asc";
//var_dump($url);
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$output = curl_exec($ch);
//var_dump($output);
if(curl_errno($ch))
{ echo 'CURL ERROR Code: '.curl_errno($ch).', reason: '.curl_error($ch);}
curl_close($ch);
$AllInfo = json_decode($output, true);
if($AllInfo['message'] != "" ){
return $AllInfo['message'];
$result = "";
foreach ($AllInfo["data"] as $singleStep)
//$result .= $singleStep["time"]." ".$singleStep["context"]."&br /&";
$result .= $singleStep["time"]." ".$singleStep["context"]."n";PHP 如何写接口给人家调用? - 开源中国社区
当前访客身份:游客 [
当前位置:
我怎么用PHP 写接口,然后人家调用我的接口方法,人家给我的接口传值过来,我接口接收值
共有12个答案
<span class="a_vote_num" id="a_vote_num_
就是平时写表单那样啊,有什么区别。。。。
--- 共有 4 条评论 ---
: 记录日志啊 直接吧别人的内容post的内容保存本地一份
(2年前)&nbsp&
: OK ,可以取到值了,人家用的是.net访问我的接口,我自己调试,可以,不知道人家怎么调用和传值过来
(2年前)&nbsp&
: 是两个不同的申请啊。。。不能用return。。只能echo
(2年前)&nbsp&
但是我直接这样调用没反应啊
(2年前)&nbsp&
<span class="a_vote_num" id="a_vote_num_
<span class="a_vote_num" id="a_vote_num_
PHP接收值无非是$_GET和$_POST,具体到HTTP协议也就是请求头和请求体。PHP这边接收数据之后进行处理,然后协定格式输出即可,这里的格式可以是json,xml或者二进制等等。
--- 共有 1 条评论 ---
(2年前)&nbsp&
<span class="a_vote_num" id="a_vote_num_
“调用接口”是个误导人的说法。
其实就是你提供一个url,别人get或post你的url。跟处理表单是一样的。最后不用构造html,直接输出数据(json/xml/...)就行了
--- 共有 1 条评论 ---
感谢。正困扰着,看到这答案,突然明白。
(2年前)&nbsp&
<span class="a_vote_num" id="a_vote_num_
rest大家都通用
<span class="a_vote_num" id="a_vote_num_
http接口么,就是给别人url和参数传递规则然后返回结构化的数据。
<span class="a_vote_num" id="a_vote_num_
echo json_encode($data);
<span class="a_vote_num" id="a_vote_num_
注意编码和跨域问题
<span class="a_vote_num" id="a_vote_num_
return&json
<span class="a_vote_num" id="a_vote_num_
你还是请一个程序员做事情吧,连个程序员都不想请的老板,注定不会弄接口。
更多开发者职位上
有什么技术问题吗?
好烦人的其它问题
类似的话题[PHP]使用CURL抓取网站或调用接口
是一个利用URL语法规定来传输文件和数据的工具,基于libcurl库,是跨平台的,几乎可以所有现存操作系统上使用,功能强大。而其libcurl库也支持几乎所有编程语言,当然也包括本文介绍的PHP语音。
cURL是瑞典CURL组织开发的,您可以访问:
http://curl.haxx. se/
获取它的源代码和相关说明,最新版本是7.32.0。
PHP支持的由Daniel
Stenberg创建的libcurl库允许你与各种的服务器使用各种类型的协议进行连接和通讯。libcurl目前支持http、https、ftp、gopher、telnet、dict、file和ldap协议。libcurl同时也支持HTTPS认证、HTTP
POST、HTTP
上传(这个也能通过PHP的FTP扩展完成)、HTTP
基于表单的上传、代理、cookies和用户名+密码的认证。这些函数在PHP
4.0.2中被引入。
使用cURL的步骤:&
执行并获取结果&
释放cURL句柄
下面的实例是使用curl请求baidu然后输出请求到的结果,会完整的展现和baidu首页一样的内容,即实现了页面的抓取。
代码实例:
我们可以看到,在PHP中我们使用CURL来抓取网站或者编写网站接口(使用json或xml来传递数据)。
我们用curl_setopt()
来设置一个cURL传输选项,,它们能指定URL请求的各个细节。由于参数较多,需要大家慢慢掌握,不过我们只要知道一些常用的参数即可,其他的随用随查。&
使用POST传递数据的设置:
&&curl_setopt($ch,
CURLOPT_POST, 1);&//启用发送常规的POST请求
&&curl_setopt($ch,
CURLOPT_POSTFIELDS, $postData);& //$postData
是要post的数据
设置cURL允许执行的最长秒数:
& curl_setopt($ch, CURLOPT_TIMEOUT, 10);
curl_close — 关闭一个cURL会话
curl_copy_handle — 复制一个cURL句柄和它的所有选项
curl_errno — 返回最后一次的错误号
curl_error — 返回一个保护当前会话最近一次错误的字符串
curl_escape — URL encodes the given string
curl_exec — 执行一个cURL会话
curl_file_create — Create a CURLFile object
curl_getinfo — 获取一个cURL连接资源句柄的信息
curl_init — 初始化一个cURL会话
curl_multi_add_handle — 向curl批处理会话中添加单独的curl句柄
curl_multi_close — 关闭一组cURL句柄
curl_multi_exec — 运行当前 cURL 句柄的子连接
curl_multi_getcontent —
如果设置了CURLOPT_RETURNTRANSFER,则返回获取的输出的文本流
curl_multi_info_read — 获取当前解析的cURL的相关传输信息
curl_multi_init — 返回一个新cURL批处理句柄
curl_multi_remove_handle — 移除curl批处理句柄资源中的某个句柄资源
curl_multi_select — 等待所有cURL批处理中的活动连接
curl_multi_setopt — Set an option for the cURL multi handle
curl_multi_strerror — Return string describing error code
curl_pause — Pause and unpause a connection
curl_reset — Reset all options of a libcurl session handle
curl_setopt_array — 为cURL传输会话批量设置选项
curl_setopt — 设置一个cURL传输选项
curl_share_close — Close a cURL share handle
curl_share_init — Initialize a cURL share handle
curl_share_setopt — Set an option for a cURL share handle.
curl_strerror — Return string describing the given error code
curl_ — Decodes the given URL encoded string
curl_version — 获取cURL版本信息
【参考阅读】
基于PHP的cURL快速入门
PHP手册CURL部分
PHP curl新浪微博发信接口
免责声明:本内容来自网络,为了传播更多知识或者信息,供读者免费阅读使用。若文章内容侵犯您的权益,请联系博主。文章仅代表作者个人观点,与本博客无关,其原创性以及文中陈述文字和内容未经证实,请读者仅作参考,并请自行核实相关内容。
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。用php写一个取数据的接口
目录结构:JS:index.js&span style=&font-family:Microsoft YaH&&$(function () { /* @QUERY_ID query.xml的sql语句的id @id sql里[]的参数 */
$.post(&http://localhost/cwq/index.php&,{QUERY_ID:&QUERY_TABLE_ATTR&,id:1},function(data){
data=setTranscoding(data);
console.log(data);
})});function setTranscoding(data){
data= unescape(data);//处理编码
data = eval(&#39;(&#39; + data + &#39;)&#39;);}&/span&lib:dba.php&?php
class phpMysql_h
var $listmysql=&&;
var $linkmysql=0;
var $database_ip=&127.0.0.1&;
var $database_user=&root&;
var $database_password=&&;
var $database_db=&phptest&;
function link_mysql()
$this-&linkmysql=mysqli_connect($this-&database_ip,$this-&database_user,$this-&database_password);
if(!$this-&linkmysql)
echo&登录MySQL失败!请联系系统管理员!!!&;
function close_mysql()
mysqli_close($this-&linkmysql);
function select_db()
mysqli_select_db($this-&linkmysql,$this-&database_db)or die(&#39;数据库选择错误!请联系系统管理员!!!&#39;.mysqli_connect_error());
function init()
$this-&link_mysql();
$this-&select_db();
function query($str)
// $this-&listmysql=mysqli_query($this-&linkmysql,$str) or die(&#39;Query failed: &#39;. mysql_error());
$this-&listmysql=mysqli_query($this-&linkmysql,$str) or die(json_encode(array(&#39;code&#39; =& 0 )));
}?&JSON.php&?phpfunction change_json($json){ $results = array();
while ($row = mysqli_fetch_assoc($json)) {
$results[] = $ } return $}?&p.php&?phpfunction p ($array){ print_r($array);}?&query.php&?phpfunction queryStamt($query_id){ $doc = new DOMDocument();
$doc-&load(&#39;./query/query.xml&#39;); //读取xml文件
$config = $doc-&getElementsByTagName(&query-config&); //取得query-config标签的对象数组
foreach( $config as $cg ){
$query = $cg-&getElementsByTagName( &query& ); //取得query的标签的对象数组
foreach( $query as $key=&$qy){
$var=$query-&item($key)-&getAttribute(&#39;id&#39;);
// p($var);
if($var==$query_id) {
$stmt = $qy-&getElementsByTagName( &stmt& ); //取得stmt的标签的对象数组
$queryStmt = $stmt-&item(0)-&nodeV
return $queryS
// echo $queryS
}}?&queryquery.xml&?xml version=&1.0& encoding=&UTF-8&?&&query-config& &query id=&QUERY_TABLE_ATTR&&
select * from wq_attr where id=[id];
&/stmt& &/query& &query id=&QUERY_TABLE_BIOG&&
select * from wq_
&/stmt& &/query& &query id=&QUERY_TABLE_CATE&&
select * from wq_
&/stmt& &/query&&/query-config&index.html&!DOCTYPE html&&html&&head lang=&en&&
&meta charset=&UTF-8&&
&title&&/title&&/head&&body&
new&/body&&script src=&js/jquery-2.1.3.min.js&&&/script&&script src=&js/index.js&&&/script&&/html&index.php&?php require &./lib/dba.php&; require &./lib/p.php&; require &./lib/JSON.php&;//json转换函数 require &./lib/query.php&;//json转换函数 $msql=new phpMysql_h; $msql-&database_db=&blog&; $msql-&init(); // echo $_GET[&#39;ID&#39;]; // $query_id=&&; if(!empty($_POST[&#39;QUERY_ID&#39;])){
$query_id=$_POST[&#39;QUERY_ID&#39;]; } if(!empty($_GET[&#39;QUERY_ID&#39;])){
$query_id=$_GET[&#39;QUERY_ID&#39;]; } // echo
$query_ // die(); // $str=&select * from wq_attr&; // p($query_id); $str=queryStamt($query_id); $countGet = count($_GET); $countPost = count($_POST);
if($countGet&1){ foreach ($_GET as $key =& $value) {
$str=str_replace(&[&.$key.&]&,$value,$str); }
} if($countPost&1){ foreach ($_POST as $key =& $value) {
// P($key.&,&.$value);
$str=str_replace(&[&.$key.&]&,$value,$str); }
} // str_replace(find,replace,string,count)参数 描述
// find 必需。规定要查找的值。
// replace 必需。规定替换 find 中的值的值。
// string 必需。规定被搜索的字符串。
// count 可选。一个变量,对替换数进行计数。 if(!empty($str)){
$msql-&query($str);
$results=change_json($msql-&listmysql);//转换json对象数组
echo json_encode($results); }else{
$code=array(&#39;code&#39; =& 0 );
echo json_encode($code);
最新教程周点击榜
微信扫一扫}

我要回帖

更多关于 php大转盘抽奖源码 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信