背景
在计算机专业面试中,面试官往往会通过一些实际来考察者的业务能力和解决能力。是一道业务上BUG的面试题,以及相应的解答。
面试题
假设你正在参与一个电商平台的开发工作,该平台有一个功能是用户可以通过搜索关键词来查找商品。在实现这个功能时,你发现了一个BUG,当用户输入特殊字符(如SQL注入常用的字符)时,搜索结果会异常。请你这个BUG的具体表现,并给出你的解决方案。
BUG
当用户在搜索框中输入特殊字符,如“' OR '1'='1”,系统在执行搜索操作后,返回的结果包含了不应该出现的商品信息,甚至可能返回全部商品。这表明搜索功能没有正确处理用户输入的特殊字符,导致SQL查询语句被篡改,从而绕过了正常的业务逻辑。
解决方案
为了解决这个我们可以采取措施:
1. 输入验证
在用户提交搜索请求之前,对用户的输入进行严格的验证。可以使用正则表达式来匹配合法的输入格式,过滤掉非法字符。是一个简单的示例代码:
python
import re
def validate_input(input_str):
pattern = re.compile(r'^[a-zA-Z0-9\s]+$')
return pattern.match(input_str) is not None
# 示例
user_input = "example ' OR '1'='1"
if validate_input(user_input):
print("输入有效")
else:
print("输入无效,包含非法字符")
2. 预防SQL注入
即使通过输入验证,也不能完全排除SQL注入的风险。在处理用户输入时,应该使用参数化查询或预处理语句来防止SQL注入。是一个使用参数化查询的示例:
python
import sqlite3
def search_products(search_term):
conn = sqlite3.connect('ecommerce.db')
cursor = conn.cursor()
cursor.execute("SELECT * FROM products WHERE name LIKE ?", ('%' + search_term + '%',))
results = cursor.fetchall()
conn.close()
return results
# 示例
search_term = "example ' OR '1'='1"
results = search_products(search_term)
print(results)
3. 错误处理
在处理搜索结果时,应该对可能出现的异常进行捕获和处理。数据库查询失败,可以返回一个友错误信息给用户,而不是让用户看到技术性的错误信息。
python
def search_products(search_term):
try:
conn = sqlite3.connect('ecommerce.db')
cursor = conn.cursor()
cursor.execute("SELECT * FROM products WHERE name LIKE ?", ('%' + search_term + '%',))
results = cursor.fetchall()
conn.close()
return results
except sqlite3.Error as e:
print("数据库查询出错: ", e)
return []
# 示例
search_term = "example ' OR '1'='1"
results = search_products(search_term)
print(results)
通过上述措施,我们可以有效地解决由特殊字符输入导致的BUG,确保电商平台的搜索功能能够安全、稳定地运行。在面试中,这样的不仅考察了者对技术细节的掌握,还考察了其解决能力和对业务安全性的重视。
还没有评论呢,快来抢沙发~