界面(去 AI 味): - 大屏页清除 114 处生成器残留属性 data-page-node-id - 视觉系统改回工程控制台风格:去 radial/linear-gradient、去辉光、 去标题前彩色装饰条,改为中性灰阶 + 单一蓝色强调色;KPI 色条改状态点 - 精简各页说教式长提示;修掉 profile.html 泄漏到页面上的 Markdown 星号 - 删除登录页过时的「默认账号 admin / admin123」提示(1.4.0 起已无默认口令) 安全与隐私(按「将会被公网访问」收口): - 内部异常只回 8 位事件号,完整堆栈进服务端日志(web/api.py::_internal) - 导出文件名收敛:防响应头注入与路径穿越;manage.py passwd 补用户名校验 - 登录对不存在的账号也走一次哑哈希,抹平用户名枚举的时序差异 - /api/* 读接口限速 240 次 / 60 秒 / 账号(挡住循环调 /api/bundle) - 进程 umask 0077 + 目录 0700 / 文件 0600:对话正文与主密钥的落盘权限 - 表名与库文件路径只对管理员下发;大屏页所有数据插值转义 - --debug 只允许绑定回环地址;新增 Permissions-Policy 与 413 处理器 文档: - DEPLOYMENT 新增第十三节「安全与隐私基线」;迁移表补 1.4.0 → 1.5.0 行 - SECURITY 更新支持范围、新增「信息泄漏收敛」小节与上线检查项 - .codebuddy/ 加入 .gitignore(助手工作记忆不进仓库) 版本:1.4.0 → 1.5.0(无库结构变更,user_version 仍为 4) 验证:python tools/smoke.py → ok=264 fail=0;python tools/check_docs.py → 0 处问题
40 行
1.7 KiB
HTML
40 行
1.7 KiB
HTML
{% extends "base.html" %}
|
|
{% block title %}登录 · {{ project_title }}{% endblock %}
|
|
{% block body %}
|
|
<div class="loginwrap">
|
|
<form class="card login" method="post" action="{{ url_for('views.login') }}">
|
|
<div class="logo">W</div>
|
|
<h1>{{ project_title }}</h1>
|
|
<p class="hint">{{ project_desc }}</p>
|
|
<input type="hidden" name="_csrf" value="{{ csrf_token() }}">
|
|
<input type="hidden" name="next" value="{{ next_url or '' }}">
|
|
<label>用户名
|
|
<input name="username" value="{{ username or '' }}" autocomplete="username"
|
|
autofocus required maxlength="32">
|
|
</label>
|
|
<label>密码
|
|
<input name="password" type="password" autocomplete="current-password" required>
|
|
</label>
|
|
{% if need_captcha %}
|
|
<label>验证码
|
|
<span class="caprow">
|
|
<input name="captcha" maxlength="6" autocomplete="off" spellcheck="false"
|
|
required placeholder="不区分大小写">
|
|
{# 点击换一张:URL 带时间戳,避免浏览器复用已被消费的旧图 #}
|
|
<img class="capimg" alt="图形验证码" title="看不清?点一下换一张"
|
|
src="{{ url_for('views.captcha_png', purpose='login') }}&t={{ range(1000000)|random }}"
|
|
onclick="this.src='{{ url_for('views.captcha_png', purpose='login') }}&t=' + Date.now();">
|
|
</span>
|
|
</label>
|
|
{% endif %}
|
|
<button class="btn primary" type="submit">登 录</button>
|
|
{% if allow_register %}
|
|
<p class="foot-note">还没有账号?<a href="{{ url_for('views.register') }}">自助注册</a></p>
|
|
{% endif %}
|
|
<p class="foot-note">
|
|
连续输错 {{ max_fails }} 次将锁定 {{ lock_minutes }} 分钟;登录状态保持 {{ session_hours }} 小时。
|
|
</p>
|
|
</form>
|
|
</div>
|
|
{% endblock %}
|