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

