REST API 和 Unity3D:服务器如何区分官方 Unity 构建从某些恶意 cURL 发送的合法请求?
REST APIs and Unity3D: How could the server tell between a legitimate request sent by an official Unity build from some malicious cURL?
--长版--
我做了一个超级基本的 REST API 来处理我将从 Unity3D 游戏调用的用户帐户管理(帐户创建、检查登录凭据等),我计划为此支持移动(主要是android).
玩家将上传他们使用 Unity 游戏中存在的绘图工具制作的绘图。我制作该工具的唯一目的是防止有人上传他们不是自己画的图画的屏幕截图,或者有人上传自拍或色情照片(我不允许这种可能性发生,因为我的游戏主要针对儿童),而且这些图可以被其他玩家公开查看。
--简短版本--
要存储上传的绘图,我会使用简单的 $_GET['base64']
,但为了防止不允许的图像进入,我如何确保请求来自官方 android 构建而不是,比如说,一些 cURL 或逆向工程的 Unity 项目?
这就是整个问题。
在 WebGL 构建的情况下,我可以阻止任何不是来自 WebGL 构建所在域的 Web 请求,但是在 android 构建的情况下,只要我知道服务器无法真正区分官方 android 构建发送的请求与 cURL 发送的某些请求。而且我很确定有人只要付出一点努力,就能弄清楚我的 REST API 是如何工作的。我不知道如何有效地保护它。
我想要一些建议,如果您认为我目前的方法很糟糕(而且可能确实如此),请告诉我如何改进它或用什么来代替它。
如果您真的想防止未经授权的客户端向您的服务器发送图像,最简单的方法就是完全忘记处理图像。
相反,我会让客户端和服务器处理输入数据。
让客户记录用户为创建绘图所做的输入(或者,如果输入太多,则记录近似于输入结果的内容,例如线段序列、颜色、笔划宽度、贴纸 ID,无论您的绘图系统使用什么)。当他们绘制图像时,将他们刚刚绘制的内容替换为您系统的图像表示,以便他们可以在发送之前确定图像的外观。
根据需要发送、接收和存储输入数据
需要出图时,播放录音重现出图
例如,这基本上就是 Jackbox 进行绘画游戏的方式。
使用此方法,有人可能会尝试使用您的 API 输入数据重现自拍或色情内容的模糊描述,但如果您执行限制数据大小、限制图像保真度等操作颜色,限制线段开始和结束的分辨率等,这些东西被复制的能力越来越小,直到变得不可行。
--长版--
我做了一个超级基本的 REST API 来处理我将从 Unity3D 游戏调用的用户帐户管理(帐户创建、检查登录凭据等),我计划为此支持移动(主要是android).
玩家将上传他们使用 Unity 游戏中存在的绘图工具制作的绘图。我制作该工具的唯一目的是防止有人上传他们不是自己画的图画的屏幕截图,或者有人上传自拍或色情照片(我不允许这种可能性发生,因为我的游戏主要针对儿童),而且这些图可以被其他玩家公开查看。
--简短版本--
要存储上传的绘图,我会使用简单的 $_GET['base64']
,但为了防止不允许的图像进入,我如何确保请求来自官方 android 构建而不是,比如说,一些 cURL 或逆向工程的 Unity 项目?
这就是整个问题。
在 WebGL 构建的情况下,我可以阻止任何不是来自 WebGL 构建所在域的 Web 请求,但是在 android 构建的情况下,只要我知道服务器无法真正区分官方 android 构建发送的请求与 cURL 发送的某些请求。而且我很确定有人只要付出一点努力,就能弄清楚我的 REST API 是如何工作的。我不知道如何有效地保护它。
我想要一些建议,如果您认为我目前的方法很糟糕(而且可能确实如此),请告诉我如何改进它或用什么来代替它。
如果您真的想防止未经授权的客户端向您的服务器发送图像,最简单的方法就是完全忘记处理图像。
相反,我会让客户端和服务器处理输入数据。
让客户记录用户为创建绘图所做的输入(或者,如果输入太多,则记录近似于输入结果的内容,例如线段序列、颜色、笔划宽度、贴纸 ID,无论您的绘图系统使用什么)。当他们绘制图像时,将他们刚刚绘制的内容替换为您系统的图像表示,以便他们可以在发送之前确定图像的外观。
根据需要发送、接收和存储输入数据
需要出图时,播放录音重现出图
例如,这基本上就是 Jackbox 进行绘画游戏的方式。
使用此方法,有人可能会尝试使用您的 API 输入数据重现自拍或色情内容的模糊描述,但如果您执行限制数据大小、限制图像保真度等操作颜色,限制线段开始和结束的分辨率等,这些东西被复制的能力越来越小,直到变得不可行。