@@InPutString是引擎暴露给脚本的字符串输入接口,弹窗后玩家输入的内容直接写入<$STR(N)>变量,不经过客户端本地过滤,必须在脚本层完成校验,否则特殊字符会破坏脚本逻辑、篡改文本文件、注入封包指令。输入触发格式为<$INPUTSTRING(提示文本变量索引最小长度最大长度)>,变量索引对应<$STR(0)>至<$STR(99)>,长度按字节计算,中文占2字节,超长内容会被引擎截断或拒绝写入。
非法字符过滤分三层执行。第一层基础过滤:使用<$STRFILTER(源变量目标变量过滤规则)>指令,规则参数为字符串,列出禁止字符,如<$STRFILTER(STR0STR1"|@#$%^&*<>/")>,将STR0中匹配字符删除后写入STR1。第二层正则过滤:GOM/GEE引擎支持<STRREGEX(源变量正则表达式目标变量)>,用正则匹配只允许白名单字符,如只允许中文、字母、数字和下划线,表达式为^[a-zA-Z0-9_\u4e00-\u9fa5]+,不匹配则变量置空。第三层自定义过滤:脚本中循环调用<STRCMP>和<STRPOS>`逐个字符比对ASCII码,拦截ASCII0-31的控制字符、DEL字符以及引擎保留符号。
变量处理流程必须遵循“输入-校验-存储-使用”的隔离原则。输入完成后立即进入校验段:先检查<$STRLEN(STR0)>是否为0,为空则跳转至输入取消逻辑;再检查长度是否超出预设范围,超长则提示重新输入;接着执行字符过滤指令,将过滤后的结果写入临时变量<$STR(90)>。校验通过后,将<$STR(90)>的值通过MOVS0<$STR(90)>同步到业务变量,防止后续逻辑误用未过滤的原始变量。
敏感数据写入文件时需二次转义。使用SAVEVARS0..\Account\$USERNAME.txt保存账号数据时,需确保$USERNAME变量已经过过滤,禁止包含路径穿越符..\或/。脚本中应建立独立的变量槽位分配表,输入变量固定使用STR0-STR9,过滤结果存STR90-STR94,业务逻辑用STR10-STR49,避免变量覆盖导致的校验绕过。
引擎差异体现在过滤能力上。Hero引擎缺乏原生正则支持,依赖<$STRFILTER>和手动循环检测,需编写冗长的脚本段处理每一个非法字符;GOM引擎支持正则表达式,可在单行指令内完成复杂校验;GEE引擎提供<$STRSQLFILTER>指令,专门过滤SQL注入字符,写入数据库前必须调用。对于老版本Hero引擎,需额外检测输入内容是否包含脚本指令符@,防止玩家输入@make或@mob等GM指令尝试提权。
输入超时与取消处理。玩家点击取消或超时未输入,<$STR(N)>变量保持不变或置空,脚本需检测变量状态。若变量为空且为必填项,需重新调用@@InPutString或执行退出逻辑。在自动任务脚本中,输入超时可能导致流程阻塞,需设置超时计数器,连续超时3次后强制结束脚本。
多行输入与特殊格式处理。部分引擎支持多行输入,内容中包含换行符(ASCII10),需过滤或替换为空格,防止文本显示错乱或日志注入。输入邮箱、网址等特殊格式时,脚本需拆分校验逻辑:先过滤非法字符,再用<$STRCMP>检查是否包含@或.,最后用长度校验确保格式合规。
变量作用域与生命周期管理。@@InPutString写入的变量默认作用域为当前脚本实例,跨地图或跨脚本调用时需通过LOADVAR和SAVEVAR持久化。在持久化前,必须确保变量已通过所有过滤规则,防止脏数据写入文件。脚本结束时,显式调用MOVS0""清空输入变量,释放内存并消除残留数据。
调试与日志追踪。开发阶段开启VARTRACE监控变量变化,记录输入原始值、过滤后值及写入结果。使用SENDMSG6输入内容:<$STR(0)>输出到聊天框,验证过滤逻辑是否生效。日志中需屏蔽敏感输入内容,仅记录校验结果和错误码,避免泄露玩家隐私。
性能考量。频繁的字符串过滤和正则匹配消耗CPU资源,在高并发场景(如登录校验、批量创建角色)下,需简化过滤规则,优先使用引擎原生指令<$STRFILTER>而非脚本循环。对于固定格式的输入(如数字、日期),优先使用<$INPUTNUMBER>替代字符串输入,从源头规避字符注入风险。
异常输入攻击防护。针对玩家故意输入超长字符串、特殊控制字符或脚本指令的攻击行为,脚本需设置硬性限制:最大长度不超过255字节,禁止连续重复字符超过10次,拦截包含@@、$、#等脚本控制符的输入。检测到攻击行为时,记录玩家IP和角色名,触发临时封禁逻辑。
跨引擎兼容性处理。脚本从Hero迁移至GOM/GEE时,需重写过滤逻辑:将手动循环过滤替换为<$STRREGEX>,调整变量槽位分配,适配新的字符串长度限制。在混合引擎环境中,使用条件判断指令检测引擎类型,加载对应的过滤子程序,确保脚本在所有环境下均能正确过滤输入。
实战示例:角色命名脚本。玩家输入角色名后,脚本依次执行:1.检查长度2-12字节;2.过滤非法字符|@#$%^&*<>/\;3.正则校验只允许中文、字母、数字;4.检查是否包含敏感词(GM、Admin等);5.查询角色文件是否存在重名;6.全部通过后写入账号数据库。任何一步失败均提示错误并重新输入。
底层封包交互。@@InPutString的输入内容通过CM_INPUTSTRING封包发送至M2Server,引擎解析后写入脚本变量。过滤逻辑在M2脚本虚拟机中执行,而非客户端,因此即使客户端被篡改,服务端脚本校验依然有效。理解这一机制有助于在脚本层构建坚固的输入防线,确保变量数据的完整性与安全性。
非法字符过滤分三层执行。第一层基础过滤:使用<$STRFILTER(源变量目标变量过滤规则)>指令,规则参数为字符串,列出禁止字符,如<$STRFILTER(STR0STR1"|@#$%^&*<>/")>,将STR0中匹配字符删除后写入STR1。第二层正则过滤:GOM/GEE引擎支持<STRREGEX(源变量正则表达式目标变量)>,用正则匹配只允许白名单字符,如只允许中文、字母、数字和下划线,表达式为^[a-zA-Z0-9_\u4e00-\u9fa5]+,不匹配则变量置空。第三层自定义过滤:脚本中循环调用<STRCMP>和<STRPOS>`逐个字符比对ASCII码,拦截ASCII0-31的控制字符、DEL字符以及引擎保留符号。
变量处理流程必须遵循“输入-校验-存储-使用”的隔离原则。输入完成后立即进入校验段:先检查<$STRLEN(STR0)>是否为0,为空则跳转至输入取消逻辑;再检查长度是否超出预设范围,超长则提示重新输入;接着执行字符过滤指令,将过滤后的结果写入临时变量<$STR(90)>。校验通过后,将<$STR(90)>的值通过MOVS0<$STR(90)>同步到业务变量,防止后续逻辑误用未过滤的原始变量。
敏感数据写入文件时需二次转义。使用SAVEVARS0..\Account\$USERNAME.txt保存账号数据时,需确保$USERNAME变量已经过过滤,禁止包含路径穿越符..\或/。脚本中应建立独立的变量槽位分配表,输入变量固定使用STR0-STR9,过滤结果存STR90-STR94,业务逻辑用STR10-STR49,避免变量覆盖导致的校验绕过。
引擎差异体现在过滤能力上。Hero引擎缺乏原生正则支持,依赖<$STRFILTER>和手动循环检测,需编写冗长的脚本段处理每一个非法字符;GOM引擎支持正则表达式,可在单行指令内完成复杂校验;GEE引擎提供<$STRSQLFILTER>指令,专门过滤SQL注入字符,写入数据库前必须调用。对于老版本Hero引擎,需额外检测输入内容是否包含脚本指令符@,防止玩家输入@make或@mob等GM指令尝试提权。
输入超时与取消处理。玩家点击取消或超时未输入,<$STR(N)>变量保持不变或置空,脚本需检测变量状态。若变量为空且为必填项,需重新调用@@InPutString或执行退出逻辑。在自动任务脚本中,输入超时可能导致流程阻塞,需设置超时计数器,连续超时3次后强制结束脚本。
多行输入与特殊格式处理。部分引擎支持多行输入,内容中包含换行符(ASCII10),需过滤或替换为空格,防止文本显示错乱或日志注入。输入邮箱、网址等特殊格式时,脚本需拆分校验逻辑:先过滤非法字符,再用<$STRCMP>检查是否包含@或.,最后用长度校验确保格式合规。
变量作用域与生命周期管理。@@InPutString写入的变量默认作用域为当前脚本实例,跨地图或跨脚本调用时需通过LOADVAR和SAVEVAR持久化。在持久化前,必须确保变量已通过所有过滤规则,防止脏数据写入文件。脚本结束时,显式调用MOVS0""清空输入变量,释放内存并消除残留数据。
调试与日志追踪。开发阶段开启VARTRACE监控变量变化,记录输入原始值、过滤后值及写入结果。使用SENDMSG6输入内容:<$STR(0)>输出到聊天框,验证过滤逻辑是否生效。日志中需屏蔽敏感输入内容,仅记录校验结果和错误码,避免泄露玩家隐私。
性能考量。频繁的字符串过滤和正则匹配消耗CPU资源,在高并发场景(如登录校验、批量创建角色)下,需简化过滤规则,优先使用引擎原生指令<$STRFILTER>而非脚本循环。对于固定格式的输入(如数字、日期),优先使用<$INPUTNUMBER>替代字符串输入,从源头规避字符注入风险。
异常输入攻击防护。针对玩家故意输入超长字符串、特殊控制字符或脚本指令的攻击行为,脚本需设置硬性限制:最大长度不超过255字节,禁止连续重复字符超过10次,拦截包含@@、$、#等脚本控制符的输入。检测到攻击行为时,记录玩家IP和角色名,触发临时封禁逻辑。
跨引擎兼容性处理。脚本从Hero迁移至GOM/GEE时,需重写过滤逻辑:将手动循环过滤替换为<$STRREGEX>,调整变量槽位分配,适配新的字符串长度限制。在混合引擎环境中,使用条件判断指令检测引擎类型,加载对应的过滤子程序,确保脚本在所有环境下均能正确过滤输入。
实战示例:角色命名脚本。玩家输入角色名后,脚本依次执行:1.检查长度2-12字节;2.过滤非法字符|@#$%^&*<>/\;3.正则校验只允许中文、字母、数字;4.检查是否包含敏感词(GM、Admin等);5.查询角色文件是否存在重名;6.全部通过后写入账号数据库。任何一步失败均提示错误并重新输入。
底层封包交互。@@InPutString的输入内容通过CM_INPUTSTRING封包发送至M2Server,引擎解析后写入脚本变量。过滤逻辑在M2脚本虚拟机中执行,而非客户端,因此即使客户端被篡改,服务端脚本校验依然有效。理解这一机制有助于在脚本层构建坚固的输入防线,确保变量数据的完整性与安全性。

