You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python requests POST数据安全性及HTTP/HTTPS传输差异咨询

Python Requests POST 传输安全性及树莓派到云服务的优化建议

嘿,我来帮你把这个问题拆解清楚——从你的测试代码和实际场景来看,核心就是树莓派到PythonAnywhere上Flask服务的POST数据传输安全对吧?

先回答最核心的问题:POST传输安全吗?

这完全取决于你用的是HTTP还是HTTPS。

你的测试代码里用了https://httpbin.org/post,这时候传输是安全的;但如果换成HTTP协议,那数据在传输过程中就是裸奔状态:

  • 任何处在传输路径上的设备(比如中间路由器、恶意网络节点)都能轻松拦截、复制你的计量数据和时间戳
  • 攻击者还能篡改数据后再转发给你的服务器,比如把120.2改成200.2,直接导致数据库存假数据,后续业务流程全乱
  • 甚至可以伪造大量请求,往你的数据库里塞垃圾数据,直接破坏服务

而用HTTPS的话,传输的数据会通过TLS/SSL加密,中间人无法直接读取原始内容;同时TLS自带完整性校验,数据被篡改后服务器能立刻检测到并拒绝请求,还能验证服务器身份,避免你把数据发到伪造的钓鱼服务器。

你的场景具体分析

你用树莓派定时发带时间戳的计量数据到Flask服务,再存数据库展示:

  • 如果用HTTP:前面说的所有风险都存在,你的计量数据完全没有保障,很容易被搞坏业务流程
  • 如果用HTTPS:能解决绝大多数传输过程中的安全问题,是基础且必须的安全措施

树莓派到云服务的安全优化建议

除了强制用HTTPS,还有这些措施可以进一步提升安全性:

  • 添加请求签名验证:
    HTTPS能防拦截篡改,但无法防请求重放(比如攻击者截获了合法的HTTPS请求,重复发送)。可以给每个请求加HMAC签名:用只有你和服务器知道的密钥,结合请求里的时间戳、计量数据生成签名,放到请求头里。服务器收到请求后重新计算签名,对比一致才处理。
    客户端(树莓派)示例代码:
    import hmac
    import hashlib
    import time
    import requests
    
    # 注意:密钥要保密,别硬编码在代码里,可以存在树莓派的环境变量里
    SECRET_KEY = b"your_ultra_secret_key_here"
    stuff = {}
    stamp = time.time()
    data = 120.2
    stuff['Date'] = stamp
    stuff['meter_reading'] = data
    
    # 生成签名:把关键字段拼接后用HMAC-SHA256加密
    sign_content = f"{stamp}:{data}".encode()
    signature = hmac.new(SECRET_KEY, sign_content, hashlib.sha256).hexdigest()
    
    # 把签名放到请求头
    headers = {"X-Request-Sign": signature}
    r = requests.post('https://your-pythonanywhere-domain.com/submit', data=stuff, headers=headers, timeout=10)
    
    服务器端(Flask)验证代码:
    from flask import request
    import hmac
    import hashlib
    
    SECRET_KEY = b"your_ultra_secret_key_here"
    
    @app.route('/submit', methods=['POST'])
    def receive_meter_data():
        stamp = request.form.get('Date')
        meter_data = request.form.get('meter_reading')
        received_sign = request.headers.get('X-Request-Sign')
    
        if not all([stamp, meter_data, received_sign]):
            return "Missing parameters", 400
    
        # 重新计算签名
        sign_content = f"{stamp}:{meter_data}".encode()
        expected_sign = hmac.new(SECRET_KEY, sign_content, hashlib.sha256).hexdigest()
    
        # 用hmac.compare_digest避免时序攻击
        if hmac.compare_digest(received_sign, expected_sign):
            # 签名验证通过,写入数据库
            # your database code here
            return "Data received", 200
        else:
            return "Invalid request", 403
    
  • 限制请求来源IP:
    在Flask服务里或者PythonAnywhere的后台设置IP白名单,只允许你的树莓派的公网IP访问POST接口。就算有人拿到了签名密钥,没有树莓派的IP也无法发送请求。
  • 设置请求超时与幂等性:
    树莓派网络可能不稳定,给requests请求加超时时间(比如timeout=10)避免长时间挂起;同时设计接口为幂等性——比如用时间戳+计量数据的组合作为唯一标识,服务器收到重复请求时直接跳过,避免重复存数据。
  • 定期更新依赖与系统:
    定期更新树莓派的系统和requests、openssl等依赖库,修复已知的安全漏洞,确保TLS加密的安全性。
  • 避免硬编码敏感信息:
    不要把密钥、服务器地址等敏感信息硬编码在代码里,存在树莓派的环境变量或者加密的配置文件里,降低泄露风险。

内容的提问来源于stack exchange,提问作者bbartling

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.08 16:52:46