MST
星途 面试题库

面试题:如何在使用Redis EVALSHA命令时防止脚本注入攻击

假设你正在开发一个使用Redis EVALSHA命令的应用,描述你将采取哪些措施来有效防范脚本注入攻击,确保系统安全。
25.1万 热度难度
数据库Redis

知识考点

AI 面试

面试题答案

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