51mee - AI智能招聘平台Logo
模拟面试题目大全招聘中心会员专区

在移动端应用中,如何保障API调用的安全性?请结合万兴产品(如万兴PDF、万兴视频编辑)的API调用场景,讨论:1)防止SQL注入(如参数化查询);2)防止跨站脚本(XSS,如输入验证、输出编码);3)数据传输加密(HTTPS、TLS);4)身份验证(如OAuth2、JWT);5)API限流与防刷(如令牌桶算法)。

万兴科技移动开发难度:中等

答案

1) 【一句话结论】

移动端API安全需通过输入处理、传输加密、身份认证、访问控制多维度技术手段综合防护,结合万兴PDF、视频编辑等产品的实际场景,通过参数化查询防SQL注入、输入输出编码防XSS、HTTPS/TLS加密传输、OAuth2/JWT身份验证、令牌桶限流防刷,构建全链路安全体系。

2) 【原理/概念讲解】

  • 防止SQL注入:攻击者通过构造恶意SQL语句绕过应用层验证,执行非法操作。参数化查询(Prepared Statements)将SQL语句与参数分离,参数作为变量处理(如填空题),避免拼接漏洞。
  • 防止XSS:恶意脚本注入网页,在用户浏览器执行。输入验证(白名单/正则)限制输入内容(如仅允许字母数字),输出编码(HTML实体编码)将特殊字符转义(如<script>→&lt;script&gt;),防止脚本执行。
  • 数据传输加密:HTTPS/TLS通过SSL/TLS协议加密数据传输,防中间人窃听/篡改(如给数据包加锁,仅双方能解密)。
  • 身份验证:OAuth2是授权框架(通过令牌交换授权),JWT是自包含身份令牌(含用户信息+签名,无状态)。
  • API限流与防刷:令牌桶算法控制令牌生成速率,限制请求频率(如每秒5个令牌,用户每次请求消耗1个,超速拒绝),防恶意刷量。

3) 【对比与适用场景】

安全措施定义特性使用场景注意点
参数化查询SQL语句与参数分离,参数作变量防拼接漏洞,高效数据库操作(查询/插入)需支持预编译
输入验证+输出编码输入限制+输出转义防XSS用户输入处理(表单/搜索)验证规则严格,编码覆盖特殊字符
HTTPS/TLS传输层加密协议加密传输,防窃听篡改所有API请求(移动端→后端)需配置安全证书
OAuth2授权框架,令牌交换授权无状态,支持多种授权用户登录授权(第三方登录)处理回调URL,令牌存储安全
JWT自包含身份验证令牌自包含,无状态,可签名API身份验证(用户登录后调用)过期时间、签名算法(如HS256)
令牌桶限流控制令牌生成速率限制请求限制请求频率,防刷高频API(搜索/刷新)桶大小、填充速率需合理配置

4) 【示例】

  • 参数化查询(Java):
    String sql = "SELECT * FROM users WHERE id = ? AND role = ?";
    PreparedStatement stmt = connection.prepareStatement(sql);
    stmt.setInt(1, userId); // 用户输入ID作为变量
    stmt.setString(2, userRole);
    ResultSet rs = stmt.executeQuery();
    
  • 输入验证+输出编码(前端+后端):
    前端:function validateInput(input){ return /^[a-zA-Z0-9_]+$/.test(input); }
    后端(Java):String html = "<h1>Hello, " + userName + "</h1>"; html = html.replace("<", "&lt;").replace(">", "&gt;");
  • HTTPS请求(移动端):
    GET /api/video/convert HTTP/1.1
    Host: api.wondershare.com
    Authorization: Bearer <JWT Token>
    Accept: application/json
    
  • 令牌桶限流(后端Python):
    from flask import Flask, request
    from flask_limiter import Limiter
    from flask_limiter.util import get_remote_address
    
    app = Flask(__name__)
    limiter = Limiter(app, key_func=get_remote_address, default_limits=["5 per second"])
    
    @app.route('/api/search')
    @limiter.limit("10 per minute")  # 每分钟10次
    def search():
        return {"results": "search data"}
    

5) 【面试口播版答案】

“在移动端应用中,保障API安全需多维度技术手段,结合万兴PDF、视频编辑等产品的实际场景,主要从输入处理、传输加密、身份认证、访问控制四个方面综合防护。首先,防止SQL注入,通过参数化查询(Prepared Statements)将SQL语句与参数分离,避免恶意SQL拼接,比如查询用户数据时,把用户输入的ID作为变量传入,而非拼接字符串;其次,防止XSS,对用户输入进行白名单验证(如仅允许字母数字),并在输出时进行HTML实体编码,将特殊字符转义(如用户输入的<script>会被编码为&lt;script&gt;,防止脚本执行;然后,数据传输加密,所有API请求必须通过HTTPS/TLS协议,确保数据在传输过程中不被窃听或篡改(就像给数据包加锁,仅双方能解密);接着,身份验证,采用OAuth2授权框架或JWT令牌,比如用户登录后,通过授权码交换获取访问令牌,用于后续API调用,JWT令牌包含用户信息和签名,无状态且安全;最后,API限流与防刷,使用令牌桶算法控制请求频率(如每秒生成5个令牌,用户每次请求消耗1个,超速拒绝),防止恶意刷量或高频请求(比如视频编辑的搜索API,设置每分钟10次请求限制,避免服务器过载)。这些措施共同构建了移动端API的全链路安全防护体系。”

6) 【追问清单】

  • 问:OAuth2的授权码流程具体步骤是怎样的?
    回答要点:授权码流程包括用户同意授权→后端生成授权码→前端跳转回应用→应用交换授权码获取访问令牌,需处理回调URL、令牌存储安全。
  • 问:JWT的过期时间如何设置?签名算法有什么选择?
    回答要点:过期时间(如1小时)通过exp字段控制,签名算法(如HS256)需与密钥匹配,密钥需安全存储(如环境变量),防止泄露。
  • 问:令牌桶限流的具体参数(如桶大小、填充速率)如何根据业务调整?
    回答要点:桶大小根据服务器处理能力设置,填充速率根据请求频率调整,避免过松或过严(如高并发场景增大桶大小,低频场景减小)。
  • 问:如何处理移动端设备上的HTTPS证书问题(如旧设备不信任证书)?
    回答要点:使用受信任的CA证书,或提供自定义证书(需用户手动信任),同时提示用户更新设备系统,确保证书有效性。
  • 问:参数化查询是否适用于所有数据库?比如NoSQL数据库?
    回答要点:关系型数据库(如MySQL、PostgreSQL)支持参数化查询,NoSQL(如MongoDB)需根据特性选择安全方法(如MongoDB的$in操作需输入验证)。

7) 【常见坑/雷区】

  • 混淆不同安全措施:用HTTPS但未做输入验证,导致XSS攻击(数据传输安全≠应用层安全)。
  • JWT签名错误:密钥泄露或签名算法不匹配,导致令牌伪造(攻击者冒充用户调用API)。
  • 限流参数设置不当:令牌桶大小过小拒绝正常用户请求,或过大无法限制恶意请求。
  • 输入验证不严格:正则表达式未覆盖所有特殊字符,或白名单规则不完善,导致恶意输入绕过验证。
  • 忽略移动端设备差异:旧设备不信任自定义证书,导致API调用失败,需考虑设备兼容性。
51mee.com致力于为招聘者提供最新、最全的招聘信息。AI智能解析岗位要求,聚合全网优质机会。
产品招聘中心面经会员专区简历解析Resume API
联系我们南京浅度求索科技有限公司admin@51mee.com
联系客服
51mee客服微信二维码 - 扫码添加客服获取帮助
© 2025 南京浅度求索科技有限公司. All rights reserved.
公安备案图标苏公网安备32010602012192号苏ICP备2025178433号-1