======协议安全====== =====1/用户凭据===== ====1.1凭据生成和使用==== 我们采用access_token 来认证用户\\ 具体方法是在登陆成功验证账号密码,或成功登陆角色后,为角色账号分配一个token accout_token 是账号用的 access_token 是角色用的 登录token在协议中会以参数或者header的形式传送 <code csharp> headers.Add("character_access_token", DataStorage.Instance.my_character_info.access_token); getData = new WWW(url, webForm.data, headers); </code> ====1.2 GM的快速入口==== GM可以有以下伪造凭据的特权 * 直接在协议中以参数形式输入access_token **示例用法** <code php> http://114.55.218.242:8081/AddItem.php?id=1&num=10&access_token=wyf&ignore_bz=1 </code> * 直接在协议中议参数形式输入character_id **示例用法** <code php> http://114.55.218.242:8081/AddItem.php?id=1&num=10&gm_character_id=323&ignore_bz=1 </code> =====2/GM特权===== ====2.1GM判断依据==== GM基于登录IP进行判断 ,只有我们公司的外网出口的IP//180.169.115.26//才可以执行GM相关的指令 //挂VPN的同学注意及时切换// GM相关指令在[[generated::protocol_list#gm|Protocol_gm]]中 ====2.2GM相关接口安全==== 服务器的测试功能,GM专用功能都需要使用以下方式保证安全 <code php> if(!game_get_is_gm()) { SendToClient_ErrorCode(4321);//你不是GM return; } </code> =====3/协议阻塞和重试确认===== ====3.1 协议预期==== 客户端发起协议,我们会有几种不同的预期,以保证逻辑正确 [[generated:PROTOCOL_BLOCK]] * 0/ 发出此协议后,即使没有服务器返回,也可以进行任意操作。 比如 状态同步[[generated:SyncAttrib]] * 1/ 发出此协议后,在服务器返回前,不接受任何点击请求。直到服务器返回之后才可以进行下一步操作和逻辑。 比如 道具操作 [[generated:SellItem]] * 2/ 发出此协议后,在服务器返回前,客户端其他逻辑也等待结果,不进行战斗和其他自动逻辑。 比如 战斗完成 [[generated:EndBattle]] * 3/ 发出此协议后,在服务器返回前,客户端其他逻辑和画面都卡顿,战斗画面完全禁止。 比如 转生操作 [[generated:Reborn]] ====3.2 客户端表现==== 除第一种之外,客户端都需要有画面表现 一般来说,遮挡一个透明蒙板,保证不会点击到UI。\\ 并在一定时间(1秒)还未返回之后呈现为半透明黑灰色,并显示“连接中...”字样 \\ 不要第一时间就 半透明遮挡是为了在网速顺利的情况下,不要频繁出现这个遮挡影响用户体验。\\ 协议成功完成后,移除此界面 客户端UI需要以下方法:\\ <code csharp> float fadeOutTime=1.0f; int panelOverlapCount = 0; //添加一个遮挡页面,阻止所有UI操作,经过fadeOutTime之后呈现半透明全屏遮挡并呈现“连接中"字样 AddBlockPanel(); //移除遮挡页面 removeBlockPanel(); </code> 调用AddBlockPanel时,对panelOverlapCount进行自增, 如果已经有一个遮挡页面存在,也不重新创建新页面, 调用removeBlockPanel时,对panelOverlapCount进行自减, 知道计数为零的时候,移除页面. 同理还需要 AddLogicLock, 和 AddGraphicLock的方法,对游戏逻辑和游戏画面进行锁定. ====3.3 协议不成功的情况处理==== 协议不成功的情况分两种:404和其他(逻辑) 协议还有个配置项叫重试规则 [[generated:PROTOCOL_RETRY]] - 0:不重试 - 1: 404状态重试 - 2:所有错误重试(不推荐) 当错误发生时,协议会按配置进行重试操作。并不移除阻止panel =====4/ Mysql防注入===== ====4.1 php关于Mysql字符串通用转义方法==== <code php> $account= mysql_real_escape_string($account); $password= mysql_real_escape_string($password); $sql = "SELECT * FROM users WHERE account='$account' AND password='$password'"; </code> 参考:http://www.w3school.com.cn/php/func_mysql_real_escape_string.asp ======备注====== 如果升级php7,mysql extension将被移除。mysql相关的方法都要替换成 mysqli 或 PDO_MYSQL 的方法。 =====5/ 协议消耗分析===== [[generated:protocol_stat_info]] 在ProtocolHandle.php 进行统计