diff --git a/wwwroot/api/todo_form_submit.dspy b/wwwroot/api/todo_form_submit.dspy index f678b76..c159c74 100644 --- a/wwwroot/api/todo_form_submit.dspy +++ b/wwwroot/api/todo_form_submit.dspy @@ -103,16 +103,21 @@ if not project_dir or not os.path.isdir(project_dir): def _safe_rel(target): - """校验相对路径:禁绝对路径、禁 .. 穿越。返回规整后的相对路径或 ''。""" + """校验相对路径:禁绝对路径、禁 .. 穿越。返回规整后的相对路径或 ''。 + + 保留尾部 '/'——它是「目录 target」(保留原文件名)与「文件 target」 + (直接用 target 作路径)的区分标志,归一化时不能丢。 + """ t = (target or '').strip() if not t: return '' if t.startswith('/'): return '' + is_dir = t.endswith('/') parts = [p for p in t.split('/') if p not in ('', '.')] if '..' in parts: return '' - return '/'.join(parts) + return '/'.join(parts) + ('/' if is_dir else '') uploaded = [] # [(name, rel_path)]