面试java开发被问“cookie、session、token”问题,教你搞懂
由于扫码登录比账号密码登录更方便、快捷、灵活,在实际使用中更受到用户的欢迎。在这个趋势下,一些SAAS软件也开始增加扫码登录的功能。本人在前几天就对公司的地产中介管理系统的登录功能进行优化,增加了扫码登录功能。在梳理的过程中发现这个小功能还是很有趣的。
产品有手机端和PC端,PC端只有账号密码登录,登录方式比较单一。
产品的用户是地产经纪人,在实际工作中,他们没有固定的使用的电脑,所以每次使用系统都需要重新输入账号和密码,登录过程不方便。所以需要增加扫码登录,方便用户登录。
1、web服务端需要生成了一个唯一KEY,代表此次用户的登录事件ID。
2、根据唯一KEY生成二维码信息,显示在网页上。
3、用户app扫描二维码
4、扫描后App通知服务端我已经扫描了二维码。
5、服务端接收消息后,更新网页提示说已经扫描,把唯一KEY加入将要登录列表,如果超时将会移除。
6、用户app端主动获取当前状态,如果唯一KEY没有超时或者没有异常,将会跳转到app端的确认登录页面。
7、用户点击确认登录后,与服务端通信,提交用户名和密码验证值(可以考虑其他方案)。
8、web服务端接收后,判断验证值是否与数据库的验证值匹配,如果匹配确认用户登录。
9、用户app端检测服务端返回值,处理当前返回状态,登录成功,失败。
PC端登录页面
进入登录页面,默认显示账户登录;
点击“账户登录”、“扫码登录”,可切换登录模式;
点击“扫码登录”,弹出二维码;
点击“返回”按钮,或点击“账户登录”,切换到账户登录模式
扫码成功
点击APP首页的扫码入口,弹出“扫一扫”页面:
成功扫码后,点击“确认登录”按钮,跳转到APP首页并提示“登录成功”;
5秒钟后提示语消失,首页显示PC端登录状态;
手机未绑定
当APP处于未绑定状态,打开APP首页提示绑定
手机无网络
当手机没有网络连接时,扫码后提示网络连接失败;
点击“确定”按钮后回到“扫一扫”页面
电脑无网络
当电脑没有网络连接,打开客户端或者网页,则提示网络异常。
二维码过期失效
当在一分钟内未扫码,或者扫码后未确认登录,则二维码过期失效。
如果手机端一直没有确认登录,则一直是“确认登录”页面;一分钟后PC端的二维码失效。
手机端扫了失效的二维码,提示“二维码”已失效;点击“确定”按钮后回到“扫一扫”页面。
其他APP扫码
用其他App扫码后,跳转到App Store的相应下载页面,或者跳转到H5页面,提示下载。
例如QQ的提示页:
退出登录
点击App首页中登录状态那一栏,弹窗退出页面,点击“退出”,PC端退出登录,手机端的登录状态消失。
避免密码泄露
在不考虑电脑中毒的情况下,输入密码也有可能被攻击者肉眼看到或者拍摄到。而扫码登入,尽管二维码是公开的,但只有你自己用手机APP扫描才有用。
原先的核心验证信息是账号密码,是暴露在外界的。现在的核心验证信息变成了手机里的app_token,而这是外界看不到的,只有手机APP自己知道。就这点来说,安全性确实提高了。
避免撞库攻击
许多人在设置密码时,为了省事,会在多个网站设置相同的密码。这样一旦任何一个网站被攻破,攻击者拿到了你的密码,他就可以尝试并成功登入其他网站。
而扫码登入的话,就算攻击者拿到了 app_token,也找到了伪造请求的正确方法,他也只能登入一个网站,对其他网站束手无策。
便捷性
随着现在App越来越多,用户需要设置的密码也越来越多,很多人是记不住自己的密码。以我个人为例,我的QQ被盗过几次,改过几次密码,每次登录时都要试好几遍,这导致整个登录过程很繁琐。
还有就是有人用户的密码设置的比较复杂,大小写+数字+符号等,在输入密码时非常容易出错。在这种时候,扫码登录真的是非常让人愉悦又便捷的选择了。
提高手机端的使用率
使用扫码登录的一个前提就是手机端处于登录状态。对于微信来说,这个举动确实可以保证微信用户必是移动客户端用户,有利于微信移动端战略。
目前的SAAS产品以PC端为主,但地产中介的SAAS产品也在积极地推动移动端的使用。如果扫码登录功能上线,移动端的下载和活跃使用也会有增长。
用户习惯的改变
大部分用户习惯了账户密码登录,突然强制扫码登录,强行改变用户习惯,这容易导致用户的反对心理。以淘宝为例,之前淘宝在推广扫码登录之初,直接取消扫码登录,遭到广大用户的投诉。在改进后,账户密码登录到一半时,强行跳出扫码登录弹框。这个操作也遭到很多用户的吐槽。在不断地改进后,淘宝目前还是以推广扫码登录为主。可以看到,淘宝的的默认登录方式还是扫码登录,点击右上角进行切换。
当然有比较好的解决方法,就是扫码登录和账号密码登录并存,只给用户多个选择,不绑架用户。这样的话,用户更容易接纳扫码登录,时间长了,也愿意使用它。
在某些情况下并不方便快捷
如果用户是使用固定的个人电脑,网站上的账户密码都自动记住,在登录时只需点击“确定”即可登录。或者用户的密码简单好记,无需太多时间输入。此时如果使用扫码登录的话,还需要掏出手机,解锁屏幕,找到对应app,打开,找到扫一扫的按钮,点一下,慢慢等手机相机启动,扫一下,然后登录成功。相比之下,扫码登录的过程更繁琐,并没有帮助用户方便快捷地登录。
由于扫码登录现在被广泛应用,微信、QQ、钉钉这些软件都做得很不错。所以在思考这个功能的时候有比较成熟的参考例子。在梳理扫码过程中,不同情况也能够思考地更完整。
SAAS产品的扫码登录比较特殊的一点是,关于权限的问题。但由于各个SAAS产品的登录权限都不同,所以这里就没展开讲。
总而言之,在查找资料、梳理逻辑的过程中,发现每天使用的扫码登录功能背后还是很有趣的。这也正是产品工作的乐趣所在,将最复杂的逻辑考虑清楚,将最简单的产品呈现给用户。
作者:异彩,产品新人。公众号:一只蜗牛慢慢跑
本文由 @异彩 原创发布于人人都是产品经理。未经许可,禁止转载。
题图来自 Pixabay,基于 CC0 协议
JS 中的异常处理,"try..catch" 详解(超级详细)
电脑硬盘出错有时候是会出现一些报错代码的,可能大家对此都不是十分清楚,也不太了解。就算是看到一些报错代码也不知道是什么意思。下面,我们就对于硬件的报错代码作一下综合的介绍。
电脑硬件的报错代码大全:
1006 0x03EE 储存该档案的外部媒体发出警告, 表示该已开启档案已经无效。
1007 0x03EF 所要求的作业无法在全萤幕模式下执行。
1008 0x03F0 An attempt was made to reference a token that does not exist.
1009 0x03F1 组态系统登录资料库毁损。
1010 0x03F2 组态系统登录机码无效。
1011 0x03F3 无法开启组态系统登录机码。
1012 0x03F4 无法读取组态系统登录机码。
1013 0x03F5 无法写入组态系统登录机码。
1014 0x03F6 系统登录资料库中的一个档案必须使用记录或其他备份还原。 已经还原成功。
1015 0x03F7 系统登录毁损。其中某个档案毁损、或者该档案的 系统映对记忆体 内容毁损、会是档案无法复原。
1016 0x03F8 系统登录起始的 I/O 作业发生无法复原的错误。 系统登录无法读入、写出或更新,其中的一个档案 内含系统登录在记忆体中的内容。
1017 0x03F9 系统尝试将档案载入系统登录或将档案还原到系统登录中, 但是,指定档案的格式不是系统登录档的格式。
1018 0x03FA 尝试在标示为删除的系统登录机码,执行不合法的xx作。
1019 0x03FB 系统无法配置系统登录记录所需的空间。
1020 0x03FC 无法在已经有子机码或数值的系统登录机码建立符号连结。
1021 0x03FD 无法在临时机码下建立永久的子机码。
1022 0x03FE 变更要求的通知完成,但资讯 并未透过呼叫者的缓冲区传回。呼叫者现在 需要自行列举档案,找出变更的地方。
1051 0x041B 停止控制已经传送给其他服务 所依峙的一个服务。
1052 0x041C 要求的控制对此服务无效1053 0x041D The service did not respond to the start or control request in a timely fashion. 1054 0x041E 无法建立服务的执行绪。
1055 0x041F 服务资料库被锁定。
1056 0x0420 这种服务已经在执行。
1057 0x0421 帐户名称错误或者不存在。
1058 0x0422 指定的服务暂停作用,无法启动。
1059 0x0423 指定循环服务从属关系。
1060 0x0424 指定的服务不是安装进来的服务。
1061 0x0425 该服务项目此时无法接收控制讯息。
1062 0x0426 服务尚未启动。
1063 0x0427 无法连线到服务控制程式。
1064 0x0428 处理控制要求时,发生意外状况。
1065 0x0429 指定的资料库不存在。
1066 0x042A 服务传回专属於服务的错误码。
1067 0x042B The process terminated unexpectedly.
1068 0x042C 从属服务或群组无法启动。
0x042D 因为登入失败,所以没有启动服务。
1070 0x042E 在启动之後,服务在启动状态时当机。
1071 0x042F 指定服务资料库锁定无效。
1072 0x0430 指定的服务已经标示为删除。
1073 0x0431 指定的服务已经存在。
1074 0x0432 系统目前正以上一次执行成功的组态执行。
1075 0x0433 从属服务不存在,或已经标示为删除。
1076 0x0434 目前的启动已经接受上一次执行成功的 控制设定。
1077 0x0435 上一次启动之後,就没有再启动服务。
1078 0x0436 指定的名称已经用於服务名称或服务显示 名称。
1100 0x044C 已经到了磁带的最後。
1101 0x044D 到了档案标示。
1102 0x044E 遇到磁带的开头或分割区。
1103 0x044F 到了档案组的结尾。
1104 0x0450 磁带没有任何资料。
1105 0x0451 磁带无法制作分割区。
1106 0x0452 存取多重容体的新磁带时,发现目前 区块大小错误。
1107 0x0453 载入磁带时,找不到磁带分割区资讯。
1108 0x0454 无法锁住储存媒体退带功能。
1109 0x0455 无法解除载入储存媒体。
1110 0x0456 磁碟机中的储存媒体已经变更。
1111 0x0457 已经重设 I/O 汇流排。
1112 0x0458 磁碟机没有任何储存媒体。
1113 0x0459 目标 multi-byte code page,没有对应 Unicode 字元。
1114 0x045A 动态连结程式库 (DLL) 起始常式失败。
1115 0x045B 系统正在关机。
1116 0x045C 无法中止系统关机,因为没有关机的动作在进行中。
1117 0x045D 因为 I/O 装置发生错误,所以无法执行要求。
1118 0x045E 序列装置起始失败,会取消载入序列驱动程式。
1119 0x045F 无法开启装置。这个装置与其他装置共用岔断要求 (IRQ)。 至少已经有一个使用同一IRQ 的其他装置已经开启。
1120 0x0460 A serial I/O operation was completed by another write to the serial port. (The IOCTL_SERIAL_XOFF_COUNTER reached zero.)1121 0x0461 因为已经过了逾时时间,所以序列 I/O 作业完成。
(IOCTL_SERIAL_XOFF_COUNTER 不是零。)1122 0x0462 在磁片找不到任何的 ID 位址标示。
1123 0x0463 磁片磁区 ID 栏位与磁片控制卡追踪位址 不符。
1124 0x0464 软式磁碟机控制卡回报了一个软式磁碟机驱动程式无法识别 的错误。
1125 0x0465 软式磁碟机控制卡传回与暂存器中不一致的结果。
1126 0x0466 存取硬碟失败,重试後也无法作业。
1127 0x0467 存取硬碟失败,重试後也无法作业。
1128 0x0468 存取硬碟时,必须重设磁碟控制卡,但是 连重设的动作也失败。
1129 0x0469 到了磁带的最後。
1130 0x046A 可用伺服器储存空间不足,无法处理这项指令。
1131 0x046B 发现潜在的锁死条件。
1132 0x046C 指定的基本位址或档案位移没有适当 对齐。
1140 0x0474 尝试变更系统电源状态,但其他的应用程式或驱动程式拒绝。
1141 0x0475 系统 BIOS 无法变更系统电源状态。
1150 0x047E 指定的程式需要新的 Windows 版本。
1151 0x047F 指定的程式不是 Windows 或 MS-DOS 程式。
1152 0x0480 指定的程式已经启动,无法再启动一次。
1153 0x0481 指定的程式是为旧版的 Windows 所写的。
1154 0x0482 执行此应用程式所需的程式库档案之一毁损。
1155 0x0483 没有应用程式与此项作业的指定档案建立关联。
1156 0x0484 传送指令到应用程式发生错误。
1157 0x0485 找不到执行此应用程式所需的程式库档案。
1200 0x04B0 指定的装置名称无效。
1201 0x04B1 装置现在虽然未连线,但是它是一个记忆连线。
1202 0x04B2 尝试记忆已经记住的装置。
1203 0x04B3 提供的网路路径找不到任何网路提供程式。
1204 0x04B4 指定的网路提供程式名称错误。
1205 0x04B5 无法开启网路连线设定档。
1206 0x04B6 网路连线设定档坏掉。
1207 0x04B7 无法列举非容器。
1208 0x04B8 发生延伸的错误。
1209 0x04B9 指定的群组名称错误。
1210 0x04BA 指定的电脑名称错误。
1211 0x04BB 指定的事件名称错误。
1212 0x04BC 指定的网路名称错误。
1213 0x04BD 指定的服务名称错误。
1214 0x04BE 指定的网路名称错误。
1215 0x04BF 指定的资源分享名称错误。
1216 0x04C0 指定的密码错误。
1217 0x04C1 指定的讯息名称错误。
1218 0x04C2 指定的讯息目的地错误。
1219 0x04C3 所提供的条件与现有的条件组发生冲突。
1220 0x04C4 尝试与网路伺服器连线,但是 与该伺服器的连线已经太多。
1221 0x04C5 其他网路电脑已经在使用这个工作群组或网域名称。
1222 0x04C6 网路没有显示出来或者没有启动。
1223 0x04C7 使用者已经取消作业。
1224 0x04C8 要求的作业无法在已经开启使用者对应区段的档案执行。
1225 0x04C9 远端系统拒绝网路连线。
1226 0x04CA 关闭网路连线。
1227 0x04CB 网路传输端点已经有相关连的位址。
1228 0x04CC 位址尚未有相关的网路端点。
1229 0x04CD 尝试在不存在的网路连线作业。
1230 0x04CE 在作用中的网路连线上执行无效的作业。
1231 0x04CF 无法传输到远端网路。
1232 0x04D0 无法连线到远端系统。
1233 0x04D1 远端系统不支援传输通讯协定。
1234 0x04D2 远端系统的目的地网路端点没有作何执行中的服务。
1235 0x04D3 要求已经中止。
1236 0x04D4 进端系统已经中断网路连线。
1237 0x04D5 无法完成作业,请重试。
1238 0x04D6 无法与伺服器连线,原因是这个帐户已经到达同时连线数目 的上限。
1239 0x04D7 尝试在这个帐户未授权的时间登入网路。
1240 0x04D8 这个帐户无法从这个地方登入网路。
1241 0x04D9 网路位址无法用於这个要求的作业。
1242 0x04DA 服务已经登记。
1243 0x04DB 指定的服务不存在。
1244 0x04DC 作业无法执行,原因是使用者尚未授权使用。
1245 0x04DD 要求的作业无法执行,原因是使用者尚未登入网路。 指定的服务不存在。
1246 0x04DE 传回要求呼叫者继续工作的讯息。
1247 0x04DF 在完成起始作业之後,尝试再执行起始作业。
1248 0x04E0 没有其他的近端装置。
看了这么多的电脑硬盘报错的代码,相信大家一时也记不清,记不全。可以先保存下来,等到发现问题,直接查看问题代码即可,随后怎么解决就靠度娘了~
装了.Net 7.0后,工程框架用 net6 的 dotnet watch 出错临时解决方案
【本文目标】
通过逐步的指导和截图举证,一步步带领一个技术小白完成一个数字货币(通证,代币,TOKEN)的发布演示和上线交易。
【环境前置条件】
参考《第六课 技术小白如何开发一个DAPP区块链应用(以宠物商店为例)》,已在本地WIDOWS环境完成MetaMask轻钱包客户端的安装和配置;作者建议最好遵循从头开始的课程学习顺序。不过如果你想半途插入实操学习,问题也不大,遇到障碍时反向找对应文章的指导内容即可完成。
【技术收获】
从本实践中,你可以学习到:
ERC20 Token的定义和实践
使用Remix Solidity IDE编写智能合约和编译调试
使用MetaMask完成钱包账户查看
使用网页钱包完成代币交易演示
【实操课程列表】
第一课 如何在WINDOWS环境下搭建以太坊开发环境
第二课 如何实现以太坊最简智能合约“Hello World”的运行
第四课 以太坊开发框架Truffle从入门到实战
第六课 技术小白如何开发一个DAPP区块链应用(以宠物商店为例)
第七课 技术小白如何在45分钟内发行通证(TOKEN)并上线交易
第八课 如何调试以太坊官网的智能合约众筹案例
第九课 如何在Remix环境下进行Solidity代码单步调试
第十课 Solidity语言编辑器REMIX指导大全
【说明】未列出的课程为知识普及的非实操类课程,所有区块链文章参考“区块链入口”专栏。
定义
ERC20合约是在2015年11月在EIP上提出的一个合约标准,代币定义的一个标准。
Token代表数字资产,具有价值,但是并不是都符合特定的规范。
基于ERC20的货币更容易互换,并且能够在Dapps上相同的工作。
新的标准可以让token更兼容,允许其他功能,包括投票标记化。操作更像一个投票操作,Token的持有人可以完全控制资产,遵守ERC20的token可以跟踪任何人在任何时间拥有多少token。基于eth合约的子货币,所以容易实施。
ERC20 Token接口说明
方法
注意:调用者必须处理返回false的returns (bool success).调用者绝对不能假设返回false的情况不存在。
name
返回这个令牌的名字,比如"MyToken".
可选 - 这种方法可以用来提高可用性,但接口和其他契约不能指望这些值存在。
symbol
返回令牌的符号,比如HIX.
可选 - 这种方法可以用来提高可用性,但接口和其他契约不能指望这些值存在。
decimals
返回token使用的小数点后几位, 比如 8,表示分配token数量为100000000
可选 - 这种方法可以用来提高可用性,但接口和其他契约不能指望这些值存在。
totalSupply
返回token的总供应量。
balanceOf
返回地址是_owner的账户的账户余额。
transfer
转移_value的token数量到的地址_to,并且必须触发Transfer事件。 如果_from帐户余额没有足够的令牌来支出,该函数应该被throw。
创建新令牌的令牌合同应该在创建令牌时将_from地址设置为0x0触发传输事件。
注意 0值的传输必须被视为正常传输并触发传输事件。
transferFrom
从地址_from发送数量为_value的token到地址_to,必须触发Transfer事件。
transferFrom方法用于提取工作流,允许合同代您转移token。这可以用于例如允许合约代您转让代币和/或以子货币收取费用。除了_from帐户已经通过某种机制故意地授权消息的发送者之外,该函数应该throw。
注意 0值的传输必须被视为正常传输并触发传输事件。
approve
允许_spender多次取回您的帐户,最高达_value金额。 如果再次调用此函数,它将以_value覆盖当前的余量。
注意:为了阻止向量攻击,客户端需要确认以这样的方式创建用户接口,即将它们设置为0,然后将其设置为同一个花费者的另一个值。虽然合同本身不应该强制执行,允许向后兼容以前部署的合同兼容性
allowance
返回_spender仍然被允许从_owner提取的金额。
Events
Transfer
当token被转移(包括0值),必须被触发。
Approval
当任何成功调用approve(address _spender, uint256 _value)后,必须被触发。
[官网接口说明点击查看],(https://github.com/ethereum/EIPs/blob/master/EIPS/eip-20.md)
接口文件ERC20Interface.sol如下:
合约文件TokenERC20.sol如下:
函数的功能参考函数的说明描述和代码自解释。
MetaMask钱包联网
【前置条件】作者假设学习者已完成MetaMask的安装和配置。还没有完成的,参考《第六课 技术小白如何开发一个DAPP区块链应用(以宠物商店为例)》的章节“5. 安装 MetaMask和配置区块链网络”,在本地WIDOWS环境完成MetaMask轻钱包客户端的安装和配置。
打开MetaMask钱包,点击左上角的“Ropsten Test Network” 连接成功。
连接成功
查看存量的账号Account 1,其中ETH余额显示为0。
存量账号Account 1余额为0
点击“Copy Address to Clipboard”,记录Account 1钱包地址为
点击MetaMask右上角环形头像的菜单“Create Account”, 创建一个新钱包账号Account 8,
新增账号成功
记录Account 8的钱包地址为
点击Account 8的"BUY"按钮,可以从“Ropsten Test Network” 免费获取一些测试ETH。
跳转到BUY ETH页面
点击按钮“ROPSTEN TEST FAUCET”可以看到赠送页面
点击绿色按钮,等待10秒以上,成功的话每次可以获取1个测试ETH。
【故障排查】
赠送失败
作者操作时,出现错误。从提示看,是由于用户交易拒绝。等10秒后再点击该绿色按钮则未有错误提示了。原因不明,可能是操作频繁导致。
多次点击,偶尔出错,小编一共从这个测试网站获取了5个测试ETH用于作为发币的GAS燃料。
获取测试ETH
Remix Solidity IDE调试环境介绍
1,代码编写和编译
我们以第二课的“Hello World”智能合约为例,参考下图可完成编译和语法错误发现。
编译环境使用方法
2,合约创建
参考附图描述,在配置号MetaMask账号和网络连接的情况下,确保账户有虚拟ETH用于合约创建花销。最后点击“Create”按钮可以完成合约创建。点击输出区的网页链接可以查看合约的详细情况。
支付合约花销
image.png
3, 合约执行
参考附件路径图,点击RUN按钮可以执行一次合约。点击下方的“Say”按钮,可以看到合约输出。在调试输出窗口可以看到“call to hello.say”的运行提示。
合约执行
【总结】所以说,没有Ubuntu+Ganache等,直接在WINDOWS环境,也可以使用Remix+MetaMask+Ropsten Test Network组合完成一套完整的以太坊测试环境。
更详细的REMIX帮助文档参考第十课 Solidity语言编辑器REMIX指导大全
编译ERC20智能合约
CHROME浏览器打开Remix Solidity IDE环境,打开之前编写的“TokenERC20.sol”智能合约,然后点击右侧的“start to compile”按钮。可以看到,除了一些Warning提示外,智能合约编译成功。
编译操作
运行ERC20智能合约
运行页面
切换到"RUN"页面,Environment选择“Injected Web3”, Account自动更新为MetaMask的Account 8账号。“Create”按钮前按照发币数量(本次发1个亿),代币名称,代币符号填写为100000000,"ColorBay","CB"。
点击"Create"按钮,会弹出一个交易确认框,设置合理的Gas Price,但要确保Max Transaction Fee不会超过Account 8的ETH总数,点“SUBMIT”按钮。
智能合约部署
部署成功的话,Account8 会产生一条交易记录,显示状态为“Contract Published”,表示部署成功了。
部署成功
【说明】有时点击账号,会出现“Retry with a higher gas price here”的提示,一般情况下再等待10秒看看能否交易成功。万一还是不成的话,可考虑该Gas Price大点。
部署确认中
MetaMask加载TOKEN
点击Account 8的交易记录,可以跳转智能合约部署信息显示页面:
部署成功
获取智能合约地址为0x5eeec41dc08d7caece17c4a349635934637036f1,点击可查看该交易详情。
点击MetaMask的Account 8账号的TOKENS页面的“ADD TOKEN”按钮,把代币智能合约地址Token Contract Address为0x5eeec41dc08d7caece17c4a349635934637036f1,代币标识符Token Symbol为CB,则可以创建你的代币了。
代币创建成功,一共有1亿个CB币了。此时,点击100000000的代币位置,跳转到代币查询页面, 可以在etherscan网站看到账户的持币数量了。
1亿
TOKEN信息
截止作者发稿时,以太坊的价格为2559元/个,而你有1亿个CB币,是不是快要走上人生巅峰了呢?哈哈,做个梦而已。真正的区块链应用,要能有生态,能为人类社会创造价值,而不是讲故事,割韭菜!
由于MetaMask插件没有提供代币交易功能,同时考虑到很多人并没有以太坊钱包或是被以太坊钱包网络同步问题折磨,今天我用网页钱包来讲解代币交易。
1. 进入网页钱包地址
第一次进入有一些安全提示需要用户确认。
2. 进入之后,按照下图进行设置
网络配置
3,增加自定义代币
填写地址Token Contract 为0x5eeec41dc08d7caece17c4a349635934637036f1和其他信息,点击保存按钮。
增加自定义TOKEN
配置TOKEN合约地址和代币符号
配置成功的界面如下:
【说明】如果不成功,则提示为“Not a valid ERC-20 token CB”,则可能是代币信息填写不正确或者右上角的网络选择错误,没有选择“Network Ropston(infura.com)”选项引起。4.转账给Account 1
填写Account 1的地址“0xD1F7922e8b78cBEB182250753ade8379d1E09949”到“发送至地址”输入框,
选择CB,不是ETH
转账确认
交易确认
交易提示
查看账户余额,Account 8减少800万个CB币,而Account 1则增加了800万个CB币。
Account 8
Account 1
转账交易成功了!
本文是站在巨人的肩膀上的操作实践,感谢以下文章作者的帮助:
知识对接服务:
辉哥和欧阳哥哥在知识星球开通了区块链入门专栏,用于存放简书区块链入门专栏文章的工程源码等内容,并建立专项微信群用于技术交流,欢迎加入。
https://t.zsxq.com/ZFaaYVF
阿里云物联网平台,HTTP协议构建认证报文,获取token令牌
作者:0xabad1dea
机器之心编译
编辑:Panda
近日,GitHub 推出了一款利用人工智能生成模型来合成代码的工具——Copilot,但发布之后却饱受争议,包括版权争议、奇葩注释 和涉嫌抄袭。除此之外,生成的代码能不能用、敢不敢用也是一大问题。在这篇文章中,Copilot 测试受邀用户 0xabad1dea 在试用该代码合成工具后发现了一些值得关注的安全问题,并以此为基础写了一份简单的风险评估报告。
GitHub 真好,就算我因为 ICE 已经叨扰了他们好几百次,他们还是给予了我进入 Copilot 测试阶段的权限。这次,我不关心 Copilot 的效率,只想测试它的安全性。我想知道,让 AI 帮人写代码风险有多高。
每一行提交的代码都需要人来负责,AI 不应被用于「洗刷责任」。Copilot 是一种工具,工具要可靠才能用。木工不必担心自己的锤子突然变坏,进而在建筑物内造成结构性缺陷。同样地,程序开发者也应对工具保有信心,而不必担心「搬起石头砸自己的脚」。
在 Twitter 上,我的一位关注者开玩笑说:「我已经迫不及待想用 Copilot 写代码了,我想让它写一个用于验证 JSON 网页 token 的函数,然后看都不看就提交上去。」
我按照这一思路使用了 Copilot,得到的结果很是搞笑:
除了删除硬盘驱动器之外,这可能是最糟糕的实现了。这种错误是如此明显、粗陋,任何专业的程序开发者对此都不会有异议。我更感兴趣的是 Copilot 是否会生成乍一看很合理的代码,以至于其中的错误会被程序员忽视或被经验不足的程序员认为是正确的。(剧透一下:确实会出现这种情况。)
我有意使用 Copilot 生成实际应该人工编写的代码,因为用户肯定会在生产过程中这样做。
不确定性
Copilot 是一种生成模型,这意味着其目的是生成在统计学意义上近似其输入(即训练数据)的输出结果。其目标并不是精准重现其输入,因为单纯的复现并不需要机器学习系统。这类模型有一个通常被称为「温度(temperature)」的参数,这是一个滑动比例,可在保守风格(模仿最常见的输入)和原创风格之间调整。原创性设置越高,输出的结构化程度就越低,就越有可能得到垃圾结果。Copilot 的温度由 GitHub 控制,据说他们会根据当前试验阶段而对其进行调节。
以同样的方式调用一个生成模型两次,通常并不会得到两个同样的结果。它每次都会重新运行一次自己的统计模型。这有其优势——如果你不喜欢该模型的前一个建议,你可以再次提问。这也能减少 Copilot 为不同用户生成相同代码的数量。但是,这与可靠性最基本的原则之一(即确定性)并不一致。它有可能在某一天完全按照你的样本文件执行,而在第二天又完全做错。
举个例子,使用完全一样的输入(一个仅包含注释、关键词 “function” 和一个空格的文件),我得到了以下两个不同的月相计算器实现:
月相计算器 A
月相计算器 B
粗略一看,它们完成的任务好像一样,但其中一个实现会将一个月份分为 8 个月相,每个月相包含若干天,然后返回日期对应的月相文本标签;另一个则像是将每个月份的每一天视为一个不同的月相且没有文本标签。但实际上它们都做错了。计算器 A 说 2021 年 7 月 2 日是新月,而人工编写的天文学网站则表示 2021 年 7 月 2 日是残月。计算器 B 则在 phase 值高得离谱(>29)时,将月相设为29。这两个实现乍一看都是可行的,而如果你比较一些结果,你会发现很难说其中哪一个是正确的。
实际上,我在生成一个复活节日期计算器时多次得到了完全一样的输出结果,而且这个计算器是正确的(至少在我验证过的一些年份上是正确的)。我猜想这意味着复活节计算器实现之间的偏差要比月相计算器之间的偏差小得多。
复活节计算器
可解读性
上面的复活节计算器是正确的,但我也只是通过实验知道的;它实在太难以解读了。(更新:有人在评论区指出有一个书写错误会影响少量年份——这是逃过了我的检验的漏洞!)
Copilot 可以并且有时候肯定会增加注释,但在这里没有影响。其中的变量名也完全毫无用处。我毫不怀疑其中一些是没有明确名称的中间结果,但整体而言,它能够做到更加清晰。有时候,回到开始从注释的起点开始调用,会让 Copilot 试图给出解释。举个例子,在函数中间提示 //f is 会让 Copilot 声明 // f is the day of the week (0=Sunday),但这似乎并不对,因为复活节星期日(Easter Sunday)往往是在星期日。其还会声明 // Code from http://www.codeproject.com/Articles/1114/Easter-Calculator ,但这似乎并非一个真实网站链接。Copilot 生成的注释有时候是正确的,但并不可靠。
我尝试过一些与时间相关的函数,但仅有这个复活节计算器是正确的。Copilot 似乎很容易混淆不同类型的计算日期的数学公式。举个例子,其生成的一个「格列高利历到儒略历」转换器就是混杂在一起的计算星期几的数学公式。即使是经验丰富的程序员,也很难从统计学上相似的代码中正确辨别出转换时间的数学公式。
密钥以及其它机密信息
真实的密码学密钥、API 密钥、密码等机密信息永远都不应该发布在公开的代码库中。GitHub 会主动扫描这些密钥,如果检测到它们,就会向代码库持有者发出警告。我怀疑被这个扫描器检测出的东西都被排除在 Copilot 模型之外,虽然这难以验证,但当然是有益的。
这类数据的熵很高(希望如此),因此 Copilot 这样的模型很难见过一次就完全记住它们。如果你尝试通过提示生成它,那么 Copilot 通常要么会给出一个显而易见的占位符「1234」,要么就会给出一串十六进制字符——这串字符乍看是随机的,但基本上就是交替出现的 0-9 和 A-F。(不要刻意使用它来生成随机数。它们的语法是结构化的,而且 Copilot 也可能向其他人建议同样的数字。)但是,仍然有可能用 Copilot 恢复真实的密钥,尤其是如果你使用十个而非一个建议打开一个窗格时。举个例子,它向我提供了密钥 36f18357be4dbd77f050515c73fcf9f2,这个密钥在 GitHub 上出现了大约 130 次,因为它曾被用于布置家庭作业。任何在 GitHub 上出现过 100 次以上的东西都不可能是真正敏感的东西。最现实的风险是天真的程序员接收自动填充的密码作为加密密钥,这会让所得到的值看起来随机,但其熵却很低很危险。
通过提示来生成密码会得到各种有趣的不安全样本。在训练数据中,这些样本通常是作为占位字符串使用的。大家最喜欢的占位字符串是「mongoose」。对一些用户而言,生成脏话词汇可能会造成一些问题。
证书清洗
GitHub 已经公开表示他们在 Copilot 模型中包含了托管于该网站的所有公开代码,并且不管证书如何。很明显,他们认为这算是正当使用,不受制于证书限制,但这样的意见在法庭上是否站得住脚…… 还有待观察。
可以很容易验证,Copilot 包含 GPL 代码,因为 Copilot 可以很容易从记忆中引用 GPL 证书文本。用 Copilot 写出类似于某些具有独特命名惯例的 GPL 项目的代码也很容易。
关键在于,Copilot 可用于「证书清洗」,做法是通过提示让其对不想要证书下的代码进行细微的修改。对于使用 Copilot 的所有人而言,这有可能突然成为一个大的法律问题,也可能不会成为问题。
安全漏洞示例:用 C 写的 HTML 解析器
一位朋友建议使用「具有正则表达式的通用 HTML 解析器」来为 Copilot 提供提示,这恰好是一个你不应该做的例子;Copilot 实际上拒绝使用正则表达式,而是编写了一个完备的 C 函数和相当好的 main() 来驱动它。我做出的唯一修改是注释掉 free(html),因为 free() 没有通过 include 定义并且在任何情况下都不是必需的。
这是格式良好甚至还有注释的 C 代码,它当然看起来像是能解析 HTML,其 main 函数在打开文件时有一些很有用的样板。但是,其解析过程有很多问题。
好消息是其有数量惊人的设计精妙的指针数学,其工作起来就像是…… 之前已经设计好的。很难说这是预先设计好的,因为这个函数其实并没有做什么有用的事情,尽管它与基础解析器的功能差不多有 80% 相似。当然,因为运行到缓冲区末端而直接引发的崩溃是一个致命的安全问题。
安全漏洞示例:用 PHP 写的 SQL 注入
前两行是我的提示。
这个样板直接犯了大错,产生了 2000 年代早期最典型的安全漏洞:PHP 脚本采用原始的 GET 变量并将其插入到用作 SQL 查询的字符串中,从而导致 SQL 注入。对于 PHP 初学者来说,犯这样的错无可厚非,因为 PHP 文档和生态系统很容易导致他们犯这种错误。现在,PHP 那臭名昭著的容易诱导人出错的问题甚至也对非人类生命产生了影响。
此外,当提示使用 shell_exec() 时,Copilot 很乐于将原始 GET 变量传递给命令行。
有趣的是,当我添加一个仅是 htmlspecialchars() 的 wrapper 的函数时(Copilot 决定将其命名为 xss_clean()),它有时候会记得在渲染数据库结果时让这些结果通过这个过滤器。但只是有时候。
安全漏洞示例:Off By One
我为 Copilot 给出提示,让其写一个基本的监听 socket。其大有帮助地写了大量样板,并且编译也毫不费力。但是,这个函数在执行实际的监听任务时会出现基本的 off-by-one 缓冲溢出错误。
一个打开 socket 并将命令收入缓冲区的函数
如果缓冲区填满,buffer[n] 可能指向超过缓冲区末端之后再一个,这会导致超出边界的 NUL 写入。这个例子很好地表明:这类小漏洞在 C 中会如野草般生长,在实际情况下它是有可能被利用的。对于使用 Copilot 的程序员而言,因为未注意到 off-by-one 问题而接受这种代码还是有可能的。
总结
这三个有漏洞的代码示例可不是骗人的,只要直接请求它写出执行功能的代码,Copilot 就很乐意写出它们。不可避免的结论是:Copilot 可以而且将会常常写出有安全漏洞的代码,尤其是使用对内存不安全的语言编写程序时。
Copilot 擅于编写样板,但这些样板可能阻碍程序开发人员找到好的部分;Copilot 也能很准确地猜测正确的常数和设置函数等等。但是,如果依赖 Copilot 来处理应用逻辑,可能很快就会误入歧途。对此,部分原因是 Copilot 并不能总是维持足够的上下文来正确编写连绵多行的代码,另一部分原因是 GitHub 上有许多代码本身就存在漏洞。在该模型中,专业人员编写的代码与初学者的家庭作业之间似乎并没有系统性的区分。神经网络看到什么就会做什么。
请以合理质疑的态度对待 Copilot 生成的任何应用逻辑。作为一位代码审查员,我希望人们能清楚地标记出哪些代码是由 Copilot 生成的。我预期这种情况无法完全解决,这是生成模型工作方式的基本问题。Copilot 可能还将继续逐步改进,但只要它能够生成代码,它就会继续生成有缺陷的代码。