面试题答案
一键面试- 严格校验输入
- 在接收用户输入数据时,对输入的数据进行严格的格式校验。例如,如果脚本期望的是数字类型的参数,使用正则表达式等方式验证输入是否为合法数字,拒绝非数字字符。比如对于接收用户传递的ID参数,确保其为正整数形式:
import re user_input = "123" if not re.match(r'^\d+$', user_input): raise ValueError('Invalid input, expected a number')
- 避免拼接脚本
- 不要直接将用户输入拼接在Lua脚本中。例如,以下是错误的拼接方式(以Python伪代码示例):
user_key = "user_key_from_input" script = f"return redis.call('GET', '{user_key}')"
- 而应该使用EVALSHA命令的参数机制,将用户输入作为参数传递给Lua脚本。在Python的redis - py库中可以这样实现:
import redis r = redis.Redis() user_key = "user_key_from_input" script_sha = r.script_load("return redis.call('GET', ARGV[1])") result = r.evalsha(script_sha, 0, user_key)
- 最小化脚本权限
- 编写Lua脚本时,只赋予脚本执行必要操作的权限。例如,如果脚本只需要读取数据,就不要在脚本中使用像
SET
这样的写操作命令。比如下面这个只读取数据的脚本:
return redis.call('GET', KEYS[1])
- 编写Lua脚本时,只赋予脚本执行必要操作的权限。例如,如果脚本只需要读取数据,就不要在脚本中使用像
- 审查和审计脚本
- 定期审查和审计Lua脚本,确保脚本中没有潜在的危险操作,例如执行系统命令(在Redis Lua脚本环境中通常无法直接执行系统命令,但要防止意外引入类似危险功能)。同时,检查脚本是否符合最小权限原则。
- 使用固定的脚本存储
- 将Lua脚本存储在安全且固定的位置,避免随意修改脚本内容。例如,可以将脚本存储在版本控制系统(如Git)中,只有经过授权的人员才能修改脚本。同时,在部署环境中确保脚本文件的权限设置为只读,防止恶意篡改。