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