面试题答案
一键面试整体设计思路
- 定义安全策略接口:创建一个基类接口,所有具体的安全策略类都继承自该接口,确保每个策略类都有统一的方法来执行过滤操作。
- 策略注册机制:通过一个注册函数或装饰器,将具体的安全策略类注册到一个全局的策略注册表中,方便后续调用。
- 字符串插值及安全过滤核心逻辑:在进行字符串插值时,根据指定的安全策略从注册表中获取相应的过滤函数,并对插值的内容进行过滤,确保输出的字符串符合安全要求。同时,框架应具备扩展性,即新的安全策略类只需继承接口并实现过滤方法,然后通过注册机制即可添加到框架中。
核心代码示例
# 安全策略接口定义
class SecurityPolicyInterface:
def filter(self, value):
raise NotImplementedError
# 策略注册表
policy_registry = {}
# 策略注册装饰器
def register_policy(policy_name):
def decorator(cls):
policy_registry[policy_name] = cls()
return cls
return decorator
# SQL安全策略示例
@register_policy('sql')
class SQLSecurityPolicy(SecurityPolicyInterface):
def filter(self, value):
# 简单示例,实际应用需要更复杂的转义等操作
return value.replace("'", "''")
# XSS安全策略示例
@register_policy('xss')
class XSSSecurityPolicy(SecurityPolicyInterface):
def filter(self, value):
# 简单示例,实际应用需要更多的HTML转义等操作
return value.replace('<', '<').replace('>', '>')
# 文件路径安全策略示例
@register_policy('file_path')
class FilePathSecurityPolicy(SecurityPolicyInterface):
def filter(self, value):
# 简单示例,实际应用需要更多的路径验证等操作
import os
return os.path.normpath(value)
# 字符串插值及安全过滤核心逻辑
def safe_interpolate(template, values, policy_name):
if policy_name not in policy_registry:
raise ValueError(f"Unknown security policy: {policy_name}")
policy = policy_registry[policy_name]
result = template
for key, value in values.items():
filtered_value = policy.filter(value)
result = result.replace(f'{{{key}}}', filtered_value)
return result
可以使用以下方式调用:
# 使用示例
template = "SELECT * FROM users WHERE username = '{username}'"
values = {'username': "O'Connor"}
policy_name ='sql'
result = safe_interpolate(template, values, policy_name)
print(result)