LZMA Returns 不支持输入格式

LZMA Returns Input Format not supported

似乎当我尝试解码一些从 base 64 解码的字节时,它给出了 Input Format not Supported。我无法隔离这个问题,因为当我将解码后的逻辑单独放入一个新文件时,错误不会发生,让我认为这与 flask 将参数传递给函数的方式有关。

代码:

from flask import Flask
import base64
import lzma
from urllib.parse import quote, unquote
app = Flask('app')

@app.route('/')
def hello_world():
  return 'Hello, World!<br><button onclick = "var base = \'https://Text-Viewer-from-Bsace-64-URL.inyourface3445.repl.co/encode\';location.href = `${base}/${prompt(\'What do you want to send?\')}`" >Use</button>'

newline = '/n'

@app.route('/view/<path:b64>')
def viewer(b64):
    print(type(b64))
    s1 = base64.b64decode(b64.encode() + b'==')
    s2 = lzma.decompress(s1).decode()
    s3 = unquote(s2).replace(newline, '<br>')
    
    return f'<div style="overflow-x: auto;">{s3}</div>'


@app.route('/encode/<path:txt>')
def encode(txt):
    quote_text = quote(txt, safe = "")
    compressed_text = lzma.compress(quote_text.encode())
    base_64_txt = base64.b64encode(compressed_text).decode()
    
    return f'<a href = "https://Text-Viewer-from-Bsace-64-URL.inyourface3445.repl.co/view/{base_64_txt}">text link </a>'


app.run(host='0.0.0.0', port=8080, debug=True)

谁能解释一下我做错了什么?

您正在传递 base64 编码的字符串作为 URL 的一部分,并且该字符串可能包含在此过程中被破坏的字符。

例如,访问 /encode/hello 将得到以下内容 URL:

https://text-viewer-from-bsace-64-url.inyourface3445.repl.co/view//Td6WFoAAATm1rRGAgAhARYAAAB0L+WjAQAEaGVsbG8AAAAAsTe52+XaHpsAAR0FuC2Arx+2830BAAAAAARZWg==

几个字符可能出错:

  • 第一个字符是 /,因此 Flask 将从 view//TD6... 重定向到 view/TD6...:换句话说,第一个字符被删除
  • 根据浏览器执行 URL-encoding 和 Flask 执行 URL-decoding 的方式,+ 字符可能会被解码为 space

为了避免这些问题,我建议使用 base64.urlsafe_b64encode / base64.urlsafe_b64decode,它们是 base64 编码的版本,输出可以在 URL 中使用而不会被破坏。

对您的代码进行以下更改似乎可以解决问题:

  1. s1 = base64.urlsafe_b64decode(b64.encode())viewer
  2. base_64_txt = base64.urlsafe_b64encode(compressed_text).decode()encode