面试题答案
一键面试SQL 注入
- 产生原因:
- 用户输入的数据未经过有效验证和过滤,直接拼接到 SQL 语句中。例如,在 Ruby 中如果使用字符串拼接的方式构建 SQL 语句,恶意用户输入包含 SQL 语法关键字的数据,就可能改变原 SQL 语句的逻辑。比如以下代码:
如果username = params[:username] password = params[:password] sql = "SELECT * FROM users WHERE username = '#{username}' AND password = '#{password}'"
username
被恶意输入为'; DROP TABLE users; --
,整个 SQL 语句的逻辑就会被改变,导致users
表被删除。 - 代码层面预防:
- 使用参数化查询(Prepared Statements)。在 Ruby 中,大多数数据库适配器(如 ActiveRecord 用于 Rails 应用)支持参数化查询。例如,在 ActiveRecord 中:
这样,数据库适配器会自动处理参数,防止恶意 SQL 语法的注入。username = params[:username] password = params[:password] user = User.where(username: username, password: password).first
- 对用户输入进行严格的白名单验证。只允许特定格式的数据输入,比如用户名只能包含字母和数字,可以使用正则表达式验证:
valid_username = params[:username] =~ /^[a-zA-Z0 - 9]+$/ if valid_username # 处理逻辑 else # 提示错误,用户名格式不正确 end
- 应急响应策略:
- 立即停止受影响的服务或相关功能,防止进一步的数据破坏。
- 备份数据库,确保在修复漏洞过程中数据不会丢失。
- 分析日志,确定攻击者的来源和操作,查找可能被篡改的数据。
- 修复漏洞,使用参数化查询或其他安全的方式重构相关代码。
- 对数据库进行完整性检查和修复,恢复可能被破坏的数据。
- 安全测试和持续监控:
- 安全测试:使用工具如 SQLMap 进行自动化测试,模拟 SQL 注入攻击,检测应用是否存在漏洞。同时进行代码审查,检查所有数据库查询语句,确保使用参数化查询。
- 持续监控:设置数据库审计功能,记录所有数据库操作,实时监控异常的 SQL 语句执行。例如,监控大量的
DROP
、DELETE
等危险操作语句。使用日志分析工具,对应用日志进行实时分析,发现可疑的用户输入模式。
XSS 攻击
- 产生原因:
- 未对用户输入的内容进行适当的转义就直接输出到网页上。例如,在 Ruby 的视图模板中,如果直接将用户输入的文本嵌入 HTML:
如果<%= @user_comment %>
@user_comment
被恶意输入为<script>alert('XSS')</script>
,当页面渲染时,这段恶意脚本就会在用户浏览器中执行,可能窃取用户的 cookie 等敏感信息。 - 代码层面预防:
- 在输出到网页时,对用户输入进行转义。在 Ruby on Rails 中,视图模板默认会对输出进行 HTML 转义。如果手动处理,可以使用
ERB::Util.html_escape
方法。例如:
comment = ERB::Util.html_escape(@user_comment)
- 对用户输入进行严格的内容过滤,只允许特定的标签和属性。可以使用库如
Loofah
在 Rails 应用中实现。例如:
这会去除所有 HTML 标签,只保留纯文本。require 'loofah' safe_comment = Loofah.fragment(@user_comment).scrub!(:strip)
- 在输出到网页时,对用户输入进行转义。在 Ruby on Rails 中,视图模板默认会对输出进行 HTML 转义。如果手动处理,可以使用
- 应急响应策略:
- 立即刷新受影响页面,防止恶意脚本继续执行。对于单页应用,可以通过重新加载部分页面或整个应用来实现。
- 通知受影响用户,告知他们可能存在的风险,建议他们更改密码等敏感信息。
- 分析日志,确定攻击者的来源和攻击方式,查找可能被窃取的数据。
- 修复漏洞,对所有输出到网页的用户输入进行转义或过滤处理。
- 安全测试和持续监控:
- 安全测试:使用工具如 OWASP ZAP 进行自动化 XSS 测试,模拟各种 XSS 攻击场景。同时进行手动测试,在输入框等位置输入各种 XSS 攻击 payload,检查页面是否存在漏洞。
- 持续监控:监控用户输入和页面输出,使用日志分析工具查找异常的 HTML 标签或脚本内容。对用户报告的页面异常行为进行及时响应和调查。
安全测试和持续监控的通用部分
- 安全测试:
- 除了上述针对 SQL 注入和 XSS 的特定测试工具,还可以使用全面的安全扫描工具如 Nessus 对整个 Web 服务进行漏洞扫描,包括检查服务器配置、端口开放情况等。
- 进行渗透测试,模拟真实的攻击者对系统进行攻击,发现潜在的安全漏洞。可以聘请专业的渗透测试团队或使用开源的渗透测试框架如 Metasploit。
- 持续监控:
- 建立监控系统,实时监控服务器的性能指标、网络流量等。异常的流量模式或服务器性能下降可能暗示着安全攻击。例如,突然的大量数据库查询可能是 SQL 注入攻击的迹象。
- 定期进行安全评估和代码审查,确保新添加的功能和代码没有引入新的安全漏洞。同时,关注 Ruby 及其相关库的安全更新,及时进行升级,以修复已知的安全问题。