统一筹划基于HTML5的APP登录功用及平安调用接口的章程,怎么着利用Python的Requests包达成模拟登陆

www.5929.com 1

 

1.概述

前段时间喜欢用python去抓一些页面玩,但都差不离都以用get请求一些页面,再经过正则去过滤。

image

登录 保存密码 安全 加密
统一筹划基于HTML5的APP登录功用及平安调用接口的章程,怎么着利用Python的Requests包达成模拟登陆。近年来察觉群内大伙对用Hbuilder做的APP怎么办登录作用以及尊崇登录状态卓殊纳闷,而自作者前一段时间正好稍微斟酌了一下,所以把作者明白的报告大家,节约大家找找资料的时刻。

1.1.用途

向集成客户端提供查询数据和登录服务。
设若财富要求授权才能查看和采用,请首先阅读“5.登录验证”小节。

后天试了一晃,模拟登五人网站。发现也比较简单。读懂本文要求对http协议和http会话有自然的领悟。

在庭院里面来看了三个没人用的路由器(ws860s),看起来像个黑科技的玩意儿,就想着进去看看,到底有如何好玩的。看到前边的竹签上有web界面包车型大巴地方,然后登陆进去看看,发现有密码,然后本身想,路由器的密码应该都以足以reset的,然后小编就用笔戳那些reset键,神蹟没有发出,原来那么些reset键坏了。

您是或不是确实供给报到功能?
把那么些题材放在最前头并不是灌水,而是真正见过很多并不需求登录的APP去做了登录功用,恐怕是并不须要强制登录的APP把登录作为运维页。
用户对你的APP一无所知,你就须求对方注册并登录,除非APP自身已经很出名声恐怕是用户有强要求,不然平常人应有会向来把它删掉。
比较温柔的法门是将某个并不必要登录,但足以给用户带来扶助的事物,第叁时半刻间呈现给他俩,让他俩发生兴趣,再在适用的火候指引他们注册(比如选拔须要动用更尖端的功效,或用户须要收藏有些喜欢的新闻时)。

1.2.通讯商谈

客户端和服务器通过HTTP协议通讯,客户端选取HTTP
Get向服务器发送请求,服务器再次回到json格式的思想政治工作数据或操作结果给客户端。

注明:因为模仿登陆的是自个儿的村办网站,所以以下代码对民用网站和账号密码做了处理。

www.5929.com 2

报到和挂号要丰盛不难
那是非常的小手提式有线电话机端,用再好的输入法,打字也是不便民的,所以别把登录页设计得须要填很多东西。假如有或许的话,只填手提式有线电话机号,让用户接受短信验证码就到位注册是极端可是的了。想得到愈来愈多音讯?想想大集团的APP是如何做的,他们会告知用户,以后的个人资料完善程度是30%,借使想获取越多积分,你供给填完。
tips:倘使你想昭示在Appstore并且同时含有注册成效,那么注册页面必须做叁个用户许可协议的链接,不然有只怕通可是审核。

1.3.接口请求

接口地址是一个HTTP协议的url地址,具体格式是:

ip替换到实际服务器的ip或域名,假若端口不是暗中认可端口,须求把端口加上。
token是印证字符串,在签到接口中赢得,借使没有登录则省略。
别的内容参见接口的概念。
当U奥迪Q3L请求参数值中带有U君越L地址保留字符时,应对参数值进行U奥德赛L编码。
现实参见“HavalFC2396: Uniform Resource Identifiers (UPRADOI): Generic
Syntax”。
当呼吁参数包括中文字符时,应对中文字符选用UTF-8编码。

网站分析

image

落到实处登录后的session有二种方法?
APP当浏览器用,直接载入远程页面

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成分的属性时,会不难一些属性的讲述,即事实上调用接口重回的性质在本文书档案中可能会没有描述,那种情状下请直接忽略被忽略描述的属性值。本文书档案中描述的属性是实际上再次回到内容的2个子集,没有描述到的内容对集花费系统绝非影响。
带分页数据的消息
如果回去数据较多,服务器会对回到的多寡开始展览分页,客户端能够服从页码请求内定范围的数量。带分页音讯的归来数据结构如下:

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

分页数据消息在data成分下,意义如下:
page 当前页码
page_size 每页数据记录条数
pages 总共的页数
total 总数据条数
count 当前回到页的多少条数
设若回到的数据带有分页音讯,则能够在调用接口时选拔page参数来呼吁钦定页码的数额。

爬虫的必需第3步,分析目的网站。那里运用谷歌(谷歌(Google))浏览器的开发者者工具分析。

www.5929.com 3

那种场馆是广大偷懒的程序员也许傻X的业主选取的不二法门,因为做起来其实太快。如若笔者网站是响应式布局,那么很有或然不必要做怎么样变动,就假若在付出时打开头页就好了,那样Hybird的APP外壳就纯粹成为了一个浏览器。
但比起这么做带来的广大弱点来,开发速度快的亮点大概可以忽略不计。
率先,在互连网环境倒霉时,纯大白页,用户体验0;
然后,CSS和JS等财富不在本地,供给长途载入,若是应用了bootstrap之类的框架,那用户为了开一下APP而消耗的流量真是令人感动;
再然后,网页里常用的jquery,在三弟大的webview里速度并救经引足,而只尽管非ajax的网页那就更闹心了,每趟操作都要跳转和页面渲染,要令人把它当成APP那其实是笑话。
再再然后,那样的所谓APP,要因而Appstore的稽审,那是做梦的(除非审核员当天闹肚子严重,拿着纸巾奔向厕所前误点了经过……),苹果的供给是,那得是APP,而不可能是某些网站做成APP的样板,那样的意况符合做Web
APP。而据作者所知,国内多少个较大的Android市镇,那样的APP也是心有余而力不足透过审查批准的。

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

经过登陆抓取,看到这么三个请求。

image

调用后端接口

2.查询分类

上面部分为请求头,上面部分为呼吁是传的参数。由图片能够观望,页面通过表单提交了四个参数。分别为_csrf,usermane,password。

解析进程

那是个很好的时代,因为不论后端你是用Java、PHP,依然node.js,都得以经过xml、json来和APP通信。遥想当年写服务端要团结写包结构,然后为了化解出现难题还折腾了七个月IOCP模型,真心觉得以往太幸福了。
把刚刚那些用APP当浏览器使的案例的有着缺点反过来看,就是如此做的独到之处,在优化完善的气象下体验接近原生,而且通信流量极少,通过各样审查批准也是妥妥的。
tips:通过plus对象中的XMLHttpRequest来Get、Post远程的后端接口,恐怕选取Mui中封装好的AJAX相关函数。

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统一筹划基于HTML5的APP登录功用及平安调用接口的章程,怎么着利用Python的Requests包达成模拟登陆。 编号
name 名称
comment 备注
“upper_catalog_id 上级分类编号, 0 表示方今分类是一级分类。

个中csrf是为着避防跨域脚本伪造。原理相当的粗略,正是每三回呼吁,服务器生成一串加密字符串。放在隐藏的input表单中。再一回呼吁的时候,把这么些字符串一起传过去,为了验证是或不是为同多少个用户的哀求。

抓包

插一段代码,作者把mui的ajax又做了尤其的包装,对逾期进行了电动重试,而对invalid_token等气象也做相应处理:

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 或七个下级分类。

www.5929.com 4

壹 、打开路由的web页面:192.168.3.1,路由器再次回到

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_www.5929.com,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中保存登录数据,每趟调用接口时传输

3.查询媒体财富

据此,我们的代码逻辑就有了。首先请求1回登录页面。然后分析页面,获得csrf字符串。最终把那么些字符串和账号密码一起传给服务器用来报到。

www.5929.com 5

程序员总能给本人找到偷懒的章程,有的程序为了方便,会在用户登录后,直接把用户名和密码保存在本地,然后每一回调用后端接口时作为参数字传送递。真省事儿啊!可那种措施简便就像是拿着一兜子钱在途中边走边喊“快来抢作者啊!快来抢作者啊!”,多个纤维的嗅探器就能把用户的密码获得手,假使用户习惯在具备地点用贰个密码,那么你闯大祸了,黑客通过撞库的主意能把用户的持有音讯一锅端。

3.1.询问媒体财富

  • 用途
    查询媒体能源。
    能够查询某些编号的能源的音信,也得以查询某些分类下的享有资讯。
    请求

    parent
    分类编号,倘使要询问有个别分类下的有所能源,请忽略下1个参数。
    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 开放景况

第②份代码

image

登录时伸手三回token,之后用token调用接口

4.询问播放地址

#!/usr/bin/env python2.7
# -*- coding: utf-8 -*-

import requests
import re

# 头部信息
headers = {
 'Host':"localhost",
 'Accept-Language':"zh-CN,zh;q=0.8",
 'Accept-Encoding':"gzip, deflate",
 'Content-Type':"application/x-www-form-urlencoded",
 'Connection':"keep-alive",
 'Referer':"http://localhost/login",
 'User-Agent':"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2490.86 Safari/537.36"
}

# 登陆方法
def login(url,csrf):
 data = {
 "_csrf" : csrf,
 "username": "xiedj",
 "password": "***"
 }

 response = requests.post(url, data=data, headers=headers)
 return response.content


# 第一次访问获取csrf值
def get_login_web(url):
 page = requests.get('http://localhost/login')
 reg = r'<meta name="csrf-token" content="(.+)">'
 csrf = re.findall(reg,page.content)[0]
 login_page = login(url,csrf)
 print login_page


if __name__ == "__main__":
 url = "http://localhost/login/checklogin"
 get_login_web(url)

www.5929.com 6

那是相比较安全的办法,用户在登录时,APP调用获取token的接口(比如),用post将用户名和密码的摘要传递给服务器,然后服务器比对数据库中的用户消息,匹配则赶回绑定该用户的token(这一般翻译为令牌,很直观的名字,一看就了然是有了这厮,就会对您放行),而数据库中,在用户的token表中也同时插入了这一个token相关的数量:那一个token属于什么人?那个token的有效期是多长期?那么些token当前报到的ip地址是?这些token对应的deviceid是?……
这么就算token被细心截获,也不会促成太大的巴中风险。因为没有用户名和密码,然后一旦黑客通过那么些token伪造用户请求,大家在劳务器端接口被调用时就足以对发起呼吁的ip地址、user-agent之类的音信作比对,以防备伪造。再然后,借使token的有效期设得小,过一会儿它就过期了,除非黑客能够不停截获你的token,不然他只好眼睁睁。(插一句题外话:看到此间,是还是不是知道怎么不引进在外场随便接入来历不明的wifi热点了?)
tips:token怎么着转变?
能够依照用户的音讯及部分任意音信(比如时间戳)再经过hash编码(比如md伍 、sha1等)生成唯一的编码。
tips:token的安全级别,取决于你的实际上供给,所以只要不是关乎财产安全的世界,并不建议太严谨(比如用户走着走着,3G换了个基站,闪断了眨眼之间间IP地址变了,尼玛token过期了,那就属于为了不须要的平安丢了用户体验,当然假若变换的IP地址跨省的话依旧应该证美素佳儿下的,想想QQ有时候会让填验证码就精通了)。
tips:接口在回去音讯时,能够涵盖此次请求的图景,比如成功调用,那么result[‘status’]可能正是’success’,而反之则是’error’,而一旦是’error’,则result[‘errcode’]中就足以分包错误的缘由,比如errcode中是’invalid_token’就能够告诉APP那么些token过期或无效,那时APP应弹出登录框只怕用本地存款和储蓄的用户名或密码再度请求token(用户选择“记住密码”,就应当在地头保存用户名和密码的摘要,方法见plus.storage的文书档案)。

4.1.询问播放地址

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

    media_id 财富编号。
    protocol
    播出协议,点播能源能够是hls,http-flv或http-mp5;直播财富得以是
    rtmp或hls。假设不难,再次来到全体协议的地方。
    客户端请依照终端体系选取合适的热映协议:
    android、ios或任何接济H5的浏览器,能够接纳:hls, http-mp5协议
    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 播出协议

代码看起来好像没有啥难题。然则执行的时候出错了。核对了刹那间,错误的缘故是,csrf验证退步!

image

再插点代码,基于plus.storage的用户音讯类,注意:要求在plusReady之后再使用。

5.登录验证

再频仍承认获得的csrf和伸手登录的csrf字符串没难题领悟后,笔者想开了八个题材。
假使,大家还不明了不当原因来说,那里可以暂停思考1个难点。“服务器如何精通,第三遍呼吁获取csrf和第3回post登录请求是同二个用户?”

会收获csrf和cookie和所急需的值,那一个值都要保留下去,前边会用。

;function UserInfo(){
};

概述

  • 1)登录的供给和意义
    客户端应当首要选拔判断服务器是还是不是要求必须登录。如若须要,则应首先调用登录接口登录,然后再请求其余接口。
    是还是不是须求强制登录,跟运维须要有关,网站运营者能够由此管理平台安装这几个选项。
    一旦没有强制须求,客户端能够登录,也得以不登陆。
    用户不利登录后,会博得三个token值,在此起彼伏的接口中,应当将该token值带入。例如:

  • 2)登录的流程
    服务器和客户端通过“挑战->应答”方式(challenge-response)举行身份表明交互,在这一个进程中,客户端供给调用一次接口向服务器评释身份。认证进程中不必要传递密码,密码用于签名验证。
    地点申明的过如下:
    1)客户端应用“用户名”作为参数调用“login1”接口,向服务器发出身份验证请求
    1.1)服务器确认用户是还是不是是有效的用户:
    1.2)若不是,则不做越发处理,重回错误音信
    1.3)假诺,服务器发生二个“随机数(挑衅字符串)”发送给客户端
    2)客户端选用“用户密码”和“随机数(挑衅字符串)”作为输入,按预定的算法生成1个hash值,用该hash值作为
    调用“login2”接口的参数,请求login2接口。
    2.1)服务器用收到的hash值与和谐的乘除结果相比较,若两者相同,则透过验证;不然,认证失利
    2.2)若申明通过,服务器重返“token”给客户端,否者重临错误消息。

到那,应该都驾驭了,若是要登录成功,须求缓解哪些让服务相信五遍呼吁是同3个用户。那里需求使用http会话(不知道的能够活动百度,那里大致介绍)。

二 、输入用户名密码后:

//清除登录新闻
UserInfo.clear = function(){
    plus.storage.removeItem(‘username’);
    plus.storage.removeItem(‘password’);
    plus.storage.removeItem(‘token’);
}

5.1.断定是还是不是必须登录

  • 用途
    看清是不是供给必须登录。
    借使须要必须登录,则需求首先登场录,否者查询数据的接口会再次回到没有权力的失实。

请求

  • 响应

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

err_desc 属性描述了对登录的渴求。no 代表不强制要求, yes
表示必须供给登录。

http协议是二个种无状态的磋商。为了使那种无状态变得有状态,由此引进了对话。简单的说,通过session去记录那么些状态。当3个用户率先次呼吁web服务的时候,服务器会生成多少个session,用于保存那几个用户的音讯。同时,在重临给用户端时,把那些sessionID保存在cookies里。当用户再二回呼吁的时候,浏览器会把这几个cookies带上。因此在劳务器端就能知道多次请求是不是为同二个用户。

www.5929.com 7

//检查是或不是带有自动登录的新闻
UserInfo.auto_login = function(){
    var username = UserInfo.username();
    var pwd = UserInfo.password();
    if(!username || !pwd){
        return false;
    }
    return true;
}

5.2.login1

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

    username 登录用户名。

  • 响应

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

id session识别号,用于login2接口,原样传递给login2即可。
chcode
挑衅字符串,客户端按预订规则使用该字符串生成2个hash值,然后调用login2接口。

为此我们的代码,需求在第③次呼吁的时候获得这些sessionID。第1回呼吁的时候把那么些sessionID一起传过去。而requests厉害的地点就是,一句简单requests.Session(),就能应用这几个会话对象。

image

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

5.3.login2

  • 用途
    接纳login1重返的chcode统计出2个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 用户所属的用户组

其次份代码

www.5929.com 8

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

5.4.logout

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

    =abcdefg
    token 登录接口中获得的token

  • 响应

{
    "code": 0,
}
#!/usr/bin/env python2.7
# -*- coding: utf-8 -*-

import requests
import re

# 头部信息
headers = {
 'Host':"localhost",
 'Accept-Language':"zh-CN,zh;q=0.8",
 'Accept-Encoding':"gzip, deflate",
 'Content-Type':"application/x-www-form-urlencoded",
 'Connection':"keep-alive",
 'Referer':"http://localhost/login",
 'User-Agent':"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2490.86 Safari/537.36"
}

# 登陆方法
def login(url,csrf,r_session):
 data = {
 "_csrf" : csrf,
 "username": "xiedj",
 "password": "***"
 }

 response = r_session.post(url, data=data, headers=headers)
 return response.content


# 第一次访问获取csrf值
def get_login_web(url):
 r_session = requests.Session()
 page = r_session.get('http://localhost/login')
 reg = r'<meta name="csrf-token" content="(.+)">'
 csrf = re.findall(reg,page.content)[0]


 login_page = login(url,csrf,r_session)
 print login_page


if __name__ == "__main__":
 url = "http://localhost/login/checklogin"
 get_login_web(url)

image

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]);
};

马到功成博得登陆后的页面

www.5929.com 9

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]);
};
那样当用户运营APP或应用了索要登录才能使用的职能时,就能够运用UserInfo.has_login()来判定是不是已经报到,若是已报到,则动用UserInfo.token()来收获到token数据,作为参数调用远程的后端接口。

www.5929.com 10

image

if(UserInfo.has_login()){
    //打开需求出示给用户的页面,大概是调用远端接口
}
else{
    wv_login.show(‘slide-in-up’);   //从最底层向上海滑稽剧团出登录页面
}
在签到页面中,用户输入了用户名和密码后,并点击了”登录“按钮,大家下一步做哪些?再插段代码(注意:此处使用的是小编刚刚代码中扩大的web_query函数,你也能够平素利用mui的ajax):

由代码能够知晓,requests.Session()运行会话对象后,第三回呼吁会自行把上叁回的sessionID一起传过去。

www.5929.com 11

function get_pwd_hash(pwd){
    var salt = ‘hbuilder’; 
//此处的salt是为着幸免黑客撞库,而在md5从前对最初的作品做一定的变形,可以设为自身喜欢的,只要和服务器验证时的salt一致即可。
    return md5(salt + pwd);
//此处借使你早已引用了md5相关的库,比如github上的JavaScript-MD5
}

上述就是本文的全体内容,希望对我们的就学抱有帮忙,也盼望大家多多支持脚本之家。

image

//那里倘诺你已经因此DOM操作获取到了用户名和密码,分别保存在username和password变量中。
var username = xxx;
var password = xxx;
var pwd_hash = get_pwd_hash(password);

你大概感兴趣的作品:

  • python模拟搜狐天涯论坛登陆作用(博客园微博爬虫)
  • python使用paramiko模块完结ssh远程登陆上传文件并实施
  • Python爬虫利用cookie完结模拟登陆实例详解
  • python3.3学科之模拟百度登陆代码分享
  • python完毕带验证码网站的活动登陆达成代码
  • python完成多线程暴力破解登陆路由器功能代码分享
  • Python完毕SSH远程登陆,并执行命令的点子(分享)
  • python完毕的登陆Discuz!论坛通用代码分享
  • python模拟登陆Ali阿娘生成商品推广链接
  • python完毕登陆今日头条得到个人收藏并保存为word文件

三 、路由器重返数据

var onSuccess = function(data){
    UserInfo.username(username);
    UserInfo.password(pwd_hash);
    UserInfo.token(data.token); //把获取到的token保存到storage中
    var wc = plus.webview.currentWebview();
    wc.hide(‘slide-out-bottom’);   
//此处如果是隐藏登录页回到从前的页面,实际你也足以干点儿其余
}

www.5929.com 12

var onError = function(errcode){
    switch(errcode){
    case ‘INCORRECT_PASSWORD’:
        mui.toast(‘密码不得法’);
        break;
    case ‘USER_NOT_EXISTS’:
        mui.toast(‘用户没有注册’);
        break;
    }
}

image

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

密码的变动方法

刚刚的方法,机智一点儿的读者大约会心存疑虑:那获取token时不还是得明白传输2回密码吗?
是的,你能够将以此获得token的地点,用SSL来保卫安全(比如),这样黑客正是截了包,权且半会儿也解不出什么音讯。
SSL证书的取得渠道很多,作者相信您总有办法查到,所以不赘述了。可是话说namecheap上的SSL证书比godaddy的要便于得多……(那是吐槽)
tips:前段时间OpenSSL漏洞让许多服务器遭殃,所以只要本人搭服务器,一定记得装补丁。
tips:能够把持有接口都弄成SSL的啊?能够。但会拖慢服务器,固然是铺排并不自信的VPS,提出不折腾。

从上边抓包的结果来看,Password字段是经过加密的,所以一旦大家要Python暴力破解,须求把那几个password的变型算法找出来。

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

开辟web登录页面,查看源代码,找找算法

还记得刚才APP向服务器请求token时,能够加入的用户消息吗?比如用户的装置deviceid。
设若大家在调用接口时,还捎带贰个当下时间戳参数timestamp,同时,用deviceid和这一个时刻戳再生成二个参数sign,比如
md5(deviceid timestamp
token)那样的样式。而服务端首先验证一下参数中的时间戳与当下服务器时间是或不是相同(误差保持在合理范围内即可,比如四分钟),然后遵照用户保存在服务器中的deviceid来对参数中的时间戳举办同样的变形,验证是不是协作,那便自然“更更安全”了。
tips:假设对一切调用请求中的参数实行排序,再以deviceid和timestamp加上排序后的参数来对整个调用生成三个sign,黑客便是截获sign,分歧的时间点、参数请求所使用的sign也是分歧的,难以伪造,自然会更安全。当然,写起来也更麻烦。
tips:精通了规律,整个验证进程是足以依据自身的需求改造的。

www.5929.com 13

image

www.5929.com 14

image

www.5929.com 15

image

www.5929.com 16

image

www.5929.com 17

image

在linux上修改ip地址,很不难一条命令就能够消除:

www.5929.com 18

image

[password:bbbbbbbb];{“errorCategory”:”user_pass_err”,”csrf_param”:”FcnG919l8J7XhQsOYQEMS3WhsC2liSX”,”count”:2,”csrf_token”:”IQ/LfSZSx7gTp6VflYnZelobNSpoMy2″}

ip地址被限制,要求静观其变1分钟的提醒:

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

登录成功的唤起:

****[password:xxxxxxxx];{“csrf_param”:”H/DyWxogz7+2y4UfzhqddowkjH1uL04″,”csrf_token”:”MorgBb0+PNpoE8KhwBwq4OoioD2NcCs”,”errorCategory”:”ok”,”level”:2,”IsWizard”:true,”IsFirst”:true}

流程

www.5929.com 19

image

抱有的数码都准备好了,下一步,就是开首使用Python写程序了。

核心Python代码:

www.5929.com 20

image

www.5929.com 21

image

www.5929.com 22

image

www.5929.com 23

image

www.5929.com 24

image

www.5929.com 25

image

www.5929.com 26

image

www.5929.com 27

image

www.5929.com 28

image

www.5929.com 29

image

www.5929.com 30

image

www.5929.com 31

image

www.5929.com 32

image

www.5929.com 33

image

www.5929.com 34

image

怎么幸免暴力破解?

www.5929.com 35

image

www.5929.com 36

Leave a Comment.