系统设计面试 - 车辆API

3

系统设计问题:

你有一个包含几百万辆二手车信息的数据集 -- 里程、颜色、价格等。你需要在两天内创建一个API端点,允许用户查询该数据集。

这是我给出的答案:

使用关系型数据库(比如PostgreSQL)存储数据。提供一个GET端点,它接收与数据集中属性相对应的查询字符串参数,解析并用于查询数据库。此端点还可以跟踪哪些属性被查询最多,并为这些属性添加索引以加速查询。当我被问及如何处理范围时 (例如,“里程数介于50,000到100,000之间的汽车”), 我说可以通过查询字符串参数处理,并由GET端点将其转换为SQL查询。

反馈

我在后来的反馈中被告知,这个答案“没有传达出对Web系统设计的深入理解。” 我希望能够得到一些有关我的解决方案可能不足/弱或可能忽略了Web系统设计的某些方面的见解。

注意:我依据记忆重构了我的答案,所以这里的表述可能比面试时更清晰。

感谢您的任何帮助!


2
你不应该直接从URL构建SQL查询,因为这样会导致SQL注入,而这似乎是面试官想要通过范围示例来说明的重点。 - triplem
@triplem 为什么这个问题只针对具有范围的属性,而不是具有单个值的参数?我看到我应该指定我将使用一个存储过程,但从我的研究来看,您提出的问题似乎适用于任何参数,对吗? - Jed
通过允许参数直接解析到SQL中,您正在打开一个巨大的潘多拉魔盒。每个参数都可能包含特殊字符,并导致数据库上发生一些奇怪的事情(尝试在Google上搜索SQL注入)。这可能会导致数据丢失或其他类型的数据操作。即使存储过程也可能受到攻击。因此,所有参数都需要进行解析和检查。 - triplem
@triplem 明白了。那么这个问题的解决方案就是在从查询字符串解析后检查每个变量吗?有更好的解决方案吗? - Jed
1个回答

2

如评论中所讨论的那样,面试官希望听到关于SQL注入的内容。有一些对策可以避免SQL注入。以下是一些措施(可能不完整,但应该能够提示注意事项):

  • 使用预编译语句(prepared statements)
  • 注意访问限制(在数据库和操作系统中)
  • 验证用户输入

1
我接受了这个答案,但想要补充一点——我的研究发现存储过程也是安全的。由于它们已经编译过,特殊字符只是被视为字符串字面量的一部分。唯一的危险在于在存储过程中使用动态SQL。 - Jed

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接