作者: chentushen

  • CSRF在服务器跨域攻击的防御原理

    一、CSRF攻击原理

    什么是CSRF(跨站请求伪造)?

    CSRF是一种让用户在不知情的情况下,以他们的身份执行非本意操作的攻击。

    攻击流程示例:

    1. 用户登录银行网站 bank.com,登录后浏览器保存了会话cookie
    2. 用户访问恶意网站 evil.com
    3. 恶意网站包含一个自动提交的表单:
    4. 浏览器会自动带上bank.com的cookie,完成转账操作
    <form action="https://bank.com/transfer" method="POST">
      <input type="hidden" name="amount" value="10000">
      <input type="hidden" name="to" value="hacker">
    </form>
    <script>document.forms[0].submit();</script>
    HTML

    二、CSRF令牌防御机制

    核心思想:引入一个攻击者无法获取的”秘密令牌”

    Flask-WTF的实现:

    1. 令牌生成

    # Flask-WTF内部会为每个会话生成唯一的令牌
    csrf_token = generate_random_string()  # 比如:'abc123xyz'
    session['csrf_token'] = csrf_token  # 存储在服务器端会话中
    Python

    2. 令牌嵌入表单

    <!-- 在表单中嵌入令牌 -->
    <form method="POST">
      <input type="hidden" name="csrf_token" value="{{ csrf_token() }}">
      <!-- csrf_token() 会从session中取出令牌 -->
      <input type="text" name="amount">
    </form>
    HTML

    3. 令牌验证流程

    # Flask-WTF验证逻辑简化版
    def validate_csrf():
        # 1. 获取表单提交的令牌
        form_token = request.form.get('csrf_token')
        
        # 2. 获取服务器存储的令牌
        session_token = session.get('csrf_token')
        
        # 3. 严格比较(防时序攻击)
        if not compare_digest(form_token, session_token):
            abort(403)  # 验证失败
        
        # 4. 每次验证后可选:刷新令牌(防重复提交)
        session['csrf_token'] = generate_random_string()
    Python

    三、为什么能防御CSRF?

    关键点分析:

    1. 同源策略保护令牌

    • 恶意网站evil.com无法读取bank.com页面中的CSRF令牌
    • 浏览器同源策略禁止跨域读取页面内容

    2. 攻击失败示例:

    <!-- evil.com的恶意页面 -->
    <form action="https://bank.com/transfer" method="POST">
      <input type="hidden" name="amount" value="10000">
      <input type="hidden" name="to" value="hacker">
      <!-- 攻击者不知道正确的csrf_token值! -->
      <input type="hidden" name="csrf_token" value="????">
    </form>
    <script>document.forms[0].submit();</script>
    HTML

    3. 双重验证机制:

    • 第一重:会话cookie(浏览器自动发送)
    • 第二重:CSRF令牌(必须存在于表单数据中)
    • 攻击者只能获取第一重,无法获取第二重

    四、Flask-WTF CSRF的完整配置

    from flask import Flask
    from flask_wtf.csrf import CSRFProtect
    
    app = Flask(__name__)
    app.config['SECRET_KEY'] = 'your-secret-key'  # 必须设置,用于签名session
    app.config['WTF_CSRF_SECRET_KEY'] = 'different-secret-key'  # 可选,专门用于CSRF
    
    csrf = CSRFProtect(app)
    
    # AJAX请求需要额外处理
    @app.after_request
    def set_csrf_cookie(response):
        if request.path.startswith('/api/'):
            response.set_cookie('X-CSRFToken', csrf_token())
        return response
    Python

    五、AJAX请求的CSRF保护

    1. 获取令牌

    // 从meta标签获取(Flask-WTF自动生成)
    var csrf_token = document.querySelector('meta[name="csrf-token"]').content;
    
    // 或从cookie获取
    function getCookie(name) {
        let cookieValue = null;
        if (document.cookie && document.cookie !== '') {
            const cookies = document.cookie.split(';');
            for (let cookie of cookies) {
                cookie = cookie.trim();
                if (cookie.substring(0, name.length + 1) === (name + '=')) {
                    cookieValue = decodeURIComponent(cookie.substring(name.length + 1));
                    break;
                }
            }
        }
        return cookieValue;
    }
    JavaScript

    2. 发送AJAX请求

    // 方法1:放在请求头中
    fetch('/api/transfer', {
        method: 'POST',
        headers: {
            'X-CSRFToken': csrf_token,
            'Content-Type': 'application/json'
        },
        body: JSON.stringify(data)
    });
    
    // 方法2:放在请求体中(表单格式)
    const formData = new FormData();
    formData.append('csrf_token', csrf_token);
    formData.append('amount', 100);
    JavaScript

    六、实践和注意事项

    1. 安全配置

    # 生产环境配置
    app.config.update(
        WTF_CSRF_SSL_STRICT=True,      # 检查Referer头
        WTF_CSRF_TIME_LIMIT=3600,       # 令牌有效期
        WTF_CSRF_HEADERS=['X-CSRFToken', 'X-XSRF-Token']  # 接受的请求头
    )
    Python

    2. 需要豁免CSRF的情况

    @csrf.exempt
    @app.route('/webhook', methods=['POST'])
    def webhook():
        # 第三方webhook通常需要豁免
        pass
    Python

    3. 常见问题

    • 令牌刷新:每次验证后刷新令牌可防重复提交攻击
    • 多个标签页:Flask-WTF默认支持多标签页操作
    • API设计:纯API服务应考虑使用JWT等其他认证方式

    总结

    Flask-WTF的CSRF保护通过”会话绑定令牌”机制,确保:

    1. 每个会话有唯一令牌,攻击者无法猜测
    2. 令牌必须随表单提交,攻击者无法获取
    3. 双重验证机制:会话cookie + CSRF令牌

    这种设计完美解决了CSRF攻击的核心问题:攻击者可以伪造请求,但无法伪造令牌。只要遵循正确的配置,就能有效保护Web应用免受跨站请求伪造攻击。

    Think First

    Thank for watching

    I am no bird; and no net ensnares me: I am a free human being with an independent will.

    我不是鸟,也没有网能捕捉我:我是一个有独立意志的自由人。

    —— 《简·爱》夏洛蒂·勃朗特
  • 校园轻型BBS项目

    📌测试连接

    点我传输 或 扫描二维码

    第一次进入会进去这个界面 点击 visit site 继续访问

    🎓 校园轻论坛系统:一个基于 Flask 的匿名交流社区

    项目 GitHub 链接:点我传输

    📌 项目简介

    这是一个为校园场景设计的轻量级匿名交流论坛系统,使用 Python + Flask 构建,支持多板块管理、内容审核、用户认证、投票机制等功能,适用于校园二手交易、失物招领、活动发布、匿名吐槽等常见需求。

    ✨ 核心功能概览

    1. 多板块分类管理

    系统内置多个预设板块,每个板块可独立配置:

    • 常规讨论、二手市场、代取拼团、失物招领、线下活动、吐槽、Q/A、广告等
    • 支持自定义内容留存时间、匿名发帖、评论开关、审核机制等

    2. 用户角色与权限系统

    • 游客:仅可浏览部分内容
    • 注册用户:可发帖、评论、点赞
    • 认证用户:享有更高发帖权限
    • 审核员:可审核内容、投票封禁用户
    • 管理员:全站管理、置顶、维护模式开关

    3. 内容审核与投票机制

    • 发帖审核:部分板块需审核后才公开
    • 删除投票:用户可举报不良内容,达到阈值后自动进入待删除状态
    • 点赞系统:用户可为优质内容点赞

    4. 用户认证与安全

    • 手机号注册 + 密码强度校验
    • 每 IP 仅可注册一个账号
    • 昵称修改限制(30天一次)
    • 用户封禁机制(管理员直接封禁 / 审核员投票封禁)

    5. 管理员后台

    • 用户管理(认证、封禁、角色设置)
    • 内容审核队列(待审核、待删除)
    • 系统设置(一键开启维护模式)
    • 操作日志审计

    6. 媒体与格式支持

    • 图片上传并自动转为 WebP 格式(可选)
    • 内容字数限制(50,000字以内)
    • 月度发帖次数限制(按板块设置)

    7. 特色功能

    • 匿名发帖:部分板块支持匿名发布
    • 标记解决:适用于问答、求助类帖子
    • 广告随机插入:在特定板块中随机展示广告内容
    • 维护模式:一键停服,仅管理员可访问

    🛠️ 技术栈

    • 后端:Flask + SQLAlchemy + Flask-Login
    • 数据库:SQLite / PostgreSQL(可扩展)
    • 前端:Jinja2 模板 + Bootstrap
    • 图片处理:Pillow(WebP 转换)

    📦 使用场景

    失物招领与寻物启事

    大学校园内部交流平台

    班级或社团信息发布

    二手物品交易与拼团

    匿名反馈与吐槽

    婚姻是一座围城,城外的人想进去,城里的人想出来。

    Marriage is like a fortress besieged: those who are outside want to get in, and those who are inside want to get out.

    —— 《围城》钱钟书
  • 个人题库-更新日志

    记者问: “你为什么要攀登珠穆朗玛峰?”
    马洛里答: “因为山就在那里。”

    “Why do you want to climb Mount Everest?”
    “Because it is there.”

    每次重新打开都要输入一次用户名太麻烦了,优化了登入逻辑,现在会先验证用户是否存在,再去决定用户是否需要输入用户名。为了方便用户更改用户名,我把更改用户名的选项改在了设置下面。

    更新简述 V2.01.6.57

    • 优化了部分代码
    • 优化了登入逻辑
      现在不需要每次登录都重新输入一遍用户名
    • 优化了信号解耦
    • #已知BUG
      移动版无法兼容图片加载

    未来更新目标

    V2.01.6.6

    *推迟更新

    更新随机选择下连续选择题的支持

    V2.01.7

    可以通过服务器空中下载最新题库
    题库加密处理

    我很懒的

    Happiness: a good bank account, a good cook, and a good digestion.

    幸福:一个好的银行账户,一位好厨师,和一副好消化系统。

    —— 卢梭

    因为山就在那里

    乔治·马洛里 

  • 个人题库-更新日志

    “瀕死のリテラシー メカニカルに殺す
    濒危的读写能力 被机械扼杀殆尽”

    本来修复安卓端无法兼容图片显示的漏洞的,结构误打误撞把安卓端无法连接验证服务器的问题解决了,一下午修复,发现通用方法不能让移动端常规加载图片。

    更新简述 V2.01.6.4

    • 重构了节点架构
    • 重构了主要代码
    • 安卓端现在可以连接到验证服务器 不需要提交本地验证
    • 优化了信号解耦
    • #已知BUG
      移动版无法兼容图片加载

    未来更新目标

    V2.01.6.5

    更新随机选择下连续选择题的支持

    V2.01.7

    可以通过服务器空中下载最新题库
    题库加密处理

    我很懒的

    What matters in life is not what happens to you but what you remember and how you remember it.

    生命中真正重要的不是你遭遇了什么,而是你记住了哪些事,又是如何铭记的。

    —— 《百年孤独》加西亚·马尔克斯

    碎碎念

    最近长时间没更新主要是把时间投入到大学生职业规划大赛了,院赛真的是简陋,第一版感觉自己太天马行空了,改的很务实。自己排练的时候也压着5分钟限制讲(我把很多重要的点都省略了)。结果比赛第一个上,没激光笔只能给放PPT的干比划,我要讲的要么没放出来,要么我还没讲完就跳下一页了。很多地方也没讲完(残念,最后遗憾离场。听到别人的讲述,我都觉得我写的都是 小~儿~科~(法国口音)。听完我觉得这不是职业规划大赛(成长赛道),是AI复制吹牛逼打草稿大赛(爽文赛道)。听的我想笑,严重超时都能拿第一。我除了笑笑我还能干什么,随他去吧。
    *图片是我拿B站大佬工程文件学习做的花海地铁
    Blender真的太好用了,你们知道吗

  • AI数据标注员专业壁垒何在?

    引言

    在未来职业规划大赛中,在其他择业方面,我发现了一片新的蓝海。认为数据标注是“低端流水线工作”的看法已经过时了。随着AI向各行业纵深发展,这个职业的专业壁垒日益凸显,主要体现在以下两个层面:

    1.通用高端技能壁垒

    整个行业正面临从“劳动密集型”向 “认知密集型” 的转型。企业不再需要大量的基础标注工,而是急需能够处理复杂场景的高端人才。这正是目前百万级高端数据标注师缺口的核心所在。这类人才需要具备:

    综合素质:

    不仅会“标注”,还要能参与制定标注规则、进行质量检验,甚至管理项目流程

    网站图标 数博会-《数据标注产业人才岗位能力要求》

    技术理解:

    需要对AI模型,特别是大模型有基本的认知,理解数据如何影响模型的表现

    网站图标 CCF-中国计算机协会

    2. 行业自限性壁垒

    这正是你提到的关键点。在专业化程度高的领域,数据标注需要的是 “懂AI的领域专家”或 “懂领域的AI辅助人员” 。

    • 信源网站

    医疗
    领域:

    让AI识别CT影像中的恶性肿瘤,标注工作必须由执业医师甚至主任级医师来完成。因为只有他们具备专业的医学知识进行判断。一张CT影像的专家标注成本可高达200元

    网站图标 北京公共开发数据平台

    自动
    驾驶
    领域:

    不同企业对“障碍物”的标注标准和精细程度可能差异高达30%,这直接影响了自动驾驶系统的安全性和泛化能力。这需要标注者或规则制定者同时理解技术要求和交通场景。

    网站图标 CCF-中国计算机协会
    壁垒层面具体表现核心能力要求行业现状与趋势
    通用高端技能壁垒
    (行业转型驱动)
    1. 复杂任务处理:涉及多模态数据对齐、知识图谱构建等。
    2. 流程与质量管理:参与制定标注规则、进行质量检验、管理项目流程。
    3. 技术理解:理解AI模型(尤其大模型)的基本原理,知晓数据如何影响模型表现。
    逻辑推理能力、算法理解能力1. 人才缺口:高端标注岗位存在百万级人才缺口。
    2. 薪资体现:高端岗位薪资可达2-3万元/月。
    3. 自动化替代:重复性强的基层标注工作正逐步被AI取代。
    行业自限性壁垒
    (领域知识驱动)
    1. 医疗影像:病灶标注等任务需要临床医生审核。
    2. 法律:法律条款标注需律师参与。
    3. 自动驾驶:障碍物标记需理解特定场景与安全要求。
    4. AI测评:大模型对话评估需扎实的语言学、心理学或社会科学背景。
    “行业知识 + 标注技能 + 大模型认知”的三维能力模型1. 专业协作:通过聘请领域专家(如医生、律师)兼职解决高阶问题。
    2. 任务拆解:将复杂专业任务拆解为本科生经培训后可完成的步骤。

    职业导向

    面对上述壁垒和行业变革,无论是产业本身还是从业者个人,都在积极寻找出路。

    • 构建三维能力模型:有专家指出,未来的人才需要具备“行业知识 + 标注技能 + 大模型认知”的综合能力。在选择赛道时,深耕医疗、金融、法律等垂直领域,会比只掌握通用技能更具竞争力。
    • 明确职业发展路径:你可以选择纵向深耕,成为某类数据的资深标注专家或项目经理;也可以横向转型,向数据清洗、AI训练师乃至机器学习相关岗位发展。
    • 保持持续学习的心态:数据标注的本质是“认知劳动”。这个行业技术迭代迅速,只有通过不断学习,才能跟上发展,避免被淘汰。
    网站图标 当代陕西

    职业导向

    这份分析印证了我将职业锚点定位于 “药学专业壁垒” 而非“通用IT技能”的前瞻性。行业正从“劳动密集型”转向 “知识密集型” ,而我所构建的 “药学+IT”复合背景,正是为了突破‘行业自限性壁垒’而生。我不是在追逐一个风口,而是在构建一个难以被替代的价值生态位。

    1. 确认了我的核心竞争壁垒:执业药师资格

    • 启示: 报告明确指出,医疗AI数据标注等任务必须由执业药师审核。这并非一个可选项,而是一个法定的、专业的刚性要求。
    • 我的行动: 这极大地强化了我必须考取执业药师资格证的决心。它不再仅仅是一张从业证书,更是我切入医药AI领域的“黄金护照”和最高护城河。我将以此确立我作为“领域专家”的不可替代性。

    2. 明确了我的能力进阶方向:“三维能力模型”

    • 启示: 未来需要的是“行业知识 + 标注技能 + 大模型认知”的复合人才。这正是我“T型人才”战略的精准落地。
      • 我的药学深度(一纵) = 行业知识
      • 我的IT广度(一横) = 标注技能 + 大模型认知
    • 我的行动:
      • 深化专业: 在药学学习上永不止步,确保我的“领域知识”始终保持权威。
      • 技术聚焦: 我的IT学习将更有针对性,从泛泛的编程,转向重点学习数据清洗、标注规则设计、以及大模型的基本原理与应用,直接服务于“三维模型”的后两项。

    3. 点亮了我的职业发展路径:从“专员”到“专家”

    • 启示: 行业存在“低端内卷、高端缺人”的局面,而高端岗位薪资可观。这告诉我,只要坚持专业与技术的深度融合,我的职业天花板将非常高。
    • 我的行动: 我清晰地看到两条路径:
      • 纵向深耕: 从医药AI标注专员,成长为特定领域(如合理用药AI审核、药物警戒信号挖掘)的资深专家或项目经理。
      • 横向拓展: 凭借对医药数据与AI模型的深度理解,向医药AI产品经理或医药数据分析师迈进,参与设计更前沿的智能系统。

    总结:从“备选”到“王牌”的战略升级

    这份行业分析,将我心中的“备选方案”彻底升级为与“数字化药剂师”并驾齐驱的 “王牌方案” 。

    它让我坚信,我所选择的道路,是一条顺应国家战略、符合行业进化规律、并能充分发挥我个人特质的道路。我将以更坚定的信心,系统性地推进我的“成长蓝图”,在医药数字化转型的浪潮中,精准定位,构筑起自己坚实的核心竞争力。

  • 风湿性疾病-我的见解

    引

    “你是否也曾听过‘风湿’这个词,却总觉得它朦朦胧胧,好像只和老年人与阴雨天有关?直到最近的一堂课,才彻底颠覆了我的这个刻板印象。原来,它是一大类疾病的统称,可能侵袭任何人,从关节到皮肤,甚至到内脏……这让我迫不及待地想深入了解它。”

    抗原-抗体交叉学说

    • 第一步:感染
      患者感染了某些特定的病原体,最常见的是A组乙型溶血性链球菌。这种细菌表面有一种特殊的蛋白质,称为“M蛋白”,作为抗原,激发了人体的免疫系统。
    • 第二步:产生抗体
      人体的免疫系统针对链球菌的M蛋白,产生了特异性的抗体,目的是清除这些细菌。
    • 第三步:交叉反应(核心环节)
      问题在于,链球菌M蛋白的某些结构(抗原表位)与人体自身组织,特别是心脏、关节、皮肤和神经组织的某些蛋白质结构非常相似。这就是“分子模仿”或“交叉抗原性”。
    • 第四步:免疫系统攻击自身
      当免疫系统产生的抗体去攻击链球菌时,由于结构相似,这些抗体“敌我不分”,也错误地识别并攻击了人体自身那些结构相似的组织。这种“交叉反应”导致了炎症和组织损伤,从而引发风湿热的种种临床表现,如心脏炎、关节炎、舞蹈病等。

    总结: 这个学说解释了为什么一个细菌感染(如链球菌性咽炎)好了之后,会引发一个看似不相关的、攻击全身多器官的自身免疫性疾病(风湿热)。

    我的分析&见解-1

    课上讲述风湿病还会导致绒毛心,但在日常生活中我看到的老年人并没有太在意,其会不会导致风湿病进一步发展累及其他器官…

    而且,感觉身边老一辈甚至是年轻人类风湿发病率特别高,网上常调侃:“膝盖是天气预报。”

    • 常见但易忽视的早期症状:
      • 间歇性关节痛:不是持续的剧痛,而是“时而好时而坏”,常被误认为是劳累、受凉或“老了”。
      • 晨僵:早上起床时关节僵硬,活动后才能缓解。很多人觉得是“没睡醒”或正常现象。
      • 轻微疲劳、低热:不明原因的疲倦、乏力,偶尔低烧,容易被当作感冒或亚健康。
      • 轻微皮疹:时隐时现的皮疹,可能不被重视。
      • 口干、眼干:觉得是喝水少或看屏幕多。
    • 为何会被忽视?
      1. 非特异性:这些症状太普通了,很多其他情况也会引起。
      2. 间歇性:时好时坏,在“好”的时候,患者会认为已经自愈,不再就医。
      3. 缺乏客观指标:早期检查时,血沉、C反应蛋白等炎症指标可能正常或仅轻度升高,甚至类风湿因子也可能是阴性。
    • 忽视的后果:
      当这些“轻微”信号被忽略,体内异常的免疫炎症反应并不会停止。它会持续攻击身体,最终可能导致:
      • 关节不可逆损伤:软骨侵蚀、骨质破坏,导致关节畸形和功能丧失。
      • 多系统受累:攻击肺部(间质性肺炎)、心脏(心包炎、心肌炎)、肾脏(蛋白尿、肾衰竭)、血管(血管炎)等,这时就构成了“在其他方面的风湿性病变”,治疗起来将更加复杂和困难。

    自身免疫性疾病(如类风湿关节炎和系统性红斑狼疮)患者发生缺血性中风的发病机制阐述如下。首先,动脉粥样硬化是一种免疫介导的炎症过程[21]。自身免疫性疾病发病机制中的系统性炎症与血管动脉粥样硬化相互作用并加速其进程[22]。这一机制与我们观察到的现象一致,即自身免疫性疾病病程较长的患者中风发生率更高[23]。其次,内皮功能障碍是早期动脉粥样硬化发生的关键病理过程。系统性自身免疫性疾病患者的内皮功能受损[24,25]。第三,传统心血管危险因素在系统性自身免疫性疾病患者中更为普遍[25]。最后,用于治疗自身免疫性疾病的药物可能在增加动脉粥样硬化风险中起到一定作用。非甾体抗炎药与心血管风险和中风增加相关[26,27]。糖皮质激素已被证明与较高的心血管风险有关,这可能是体重增加、血脂不良改变、胰岛素抵抗和糖尿病所导致的结果[28]。
    与Sodergren等人(比值比=2.6)和Semb等人(比值比=1.6)关于类风湿关节炎患者中风风险的研究相比,我们的研究揭示了较低的风险比(1.38)[12,13]。除种族差异外,较低的风险可能源于我们的研究设计在风险比分析中控制了混杂因素。类风湿关节炎的全身性炎症对内皮有直接影响,并使患者易出现加速的动脉粥样硬化[24,29]。既往研究表明,细胞因子、趋化因子、自身抗体(如氧化低密度脂蛋白)和基质金属蛋白酶是动脉粥样硬化的致病因素[30,31,32,33,43]。此外,吸烟是类风湿关节炎和中风的共同危险因素。而且,类风湿关节炎可累及心脏瓣膜结构并导致房颤,而房颤是中风的一个有充分证据的危险因素[34]。

    Liou, TH., Huang, SW., Lin, JW.等.风湿病患者卒中风险:一项全国性纵向人群研究. Sci Rep 4 , 5110 (2014). https://doi.org/10.1038/srep05110

    类风湿关节炎作为代表性风湿病,全球患病率估计在 0.24%-1% 。其发病是遗传易感性与环境、生活方式等多因素共同作用的结果

    风湿病流行病学 UpToDate

    主流治疗途径

    1. 抑制炎症(治标,快速控制症状)

    糖皮质激素:如泼尼松。强效抗炎,但长期使用副作用多,通常作为桥梁过渡。

    非甾体抗炎药(NSAIDs):如布洛芬、塞来昔布。快速减轻疼痛和炎症,但不改变病程。

    2. 免疫抑制与调节(治本,控制病情发展)

    传统改善病情抗风湿药(csDMARDs):如甲氨蝶呤、来氟米特。它们是治疗的基石。它们能广泛抑制免疫细胞的增殖和活化(包括T细胞、B细胞),从而从上游减少抗体的产生和炎症因子的释放。甲氨蝶呤是许多风湿病的锚定药。

    3. 靶向生物制剂和小分子药物(精准打击)

    • B细胞靶向治疗:
      • 利妥昔单抗:这是一种直接针对B细胞表面标志CD20的单克隆抗体。它能精准地清除成熟的B细胞,从而大幅减少自身抗体的产生。主要用于治疗类风湿关节炎、血管炎等。
    • 细胞因子靶向治疗:
      • TNF-α抑制剂(如依那西普、阿达木单抗)、IL-6抑制剂(如托珠单抗)等。这些抗体不直接攻击B细胞,而是中和B细胞等产生的致病性炎症因子,阻断炎症信号的传递。
    • 针对T/B细胞共刺激信号:
      • 阿巴西普:能阻断T细胞和B细胞之间的“第二信号”(共刺激信号),没有这个信号,T细胞无法有效激活B细胞,从而抑制B细胞产生抗体。
    • 小分子靶向药:
      • JAK抑制剂(如托法替布、巴瑞替尼):在细胞内部阻断炎症信号的通路,作用更广泛但仍有针对性。

    兴趣研究方向

     核心靶点:抗原递呈细胞与T细胞的相互作用

    在非感染(即自身免疫)情况下,自身抗原被抗原递呈细胞(主要是树突状细胞、巨噬细胞、B细胞)处理并递呈给T细胞,这是启动异常免疫应答的关键第一步。这个过程主要涉及两个信号:

    • 第一信号:抗原递呈细胞表面的MHC-Ⅱ类分子-自身抗原肽复合物与T细胞受体(TCR)结合。
    • 第二信号(共刺激信号):抗原递呈细胞表面的CD80/CD86与T细胞表面的CD28结合。

    如果只有第一信号而没有第二信号,T细胞不会被激活,反而会进入失能(anergy) 状态。这正是干预的黄金节点。


    靶向共刺激信号

    代表药物:阿巴西普

    机制:它是一种CTLA-4-Ig融合蛋白。CTLA-4与CD28结构相似,但亲和力更高。阿巴西普会“冒充”CTLA-4,抢先与抗原递呈细胞上的CD80/CD86结合,从而阻断了CD28与CD80/CD86的结合。

    效果:相当于在T细胞和抗原递呈细胞之间“拆CP”。即使第一信号(MHC-TCR)正常发生,由于缺少了第二信号,T细胞无法被完全激活,进而导致下游的B细胞活化和抗体产生等一系列反应被抑制。

    定位:这是在抗原递呈环节进行阻滞的典范,主要用于类风湿关节炎等。


    我的见解

    价格水平:在中国,阿巴西普(商品名:恩瑞舒®)上市初期,年治疗费用通常在数万元至十数万元人民币不等,具体取决于用药剂量和频率。这个价格对于普通家庭而言是沉重的负担。甲氨蝶呤是全球公认的治疗类风湿关节炎的锚定药,性价比高,能有效调节免疫和抗炎。但其作用机制:它通过抑制二氢叶酸还原酶,干扰细胞内DNA和RNA的合成,从而抑制增殖活跃的免疫细胞。所带来副作用:正因为上述机制,它可能带来骨髓抑制(白细胞、血小板减少)、肝毒性、口腔炎、腹泻等副作用。长期用药还需关注咳嗽、气短甚至肺纤维化等肺损伤风险。不过,在医生严密监测下,多数副作用是可防可控的。能否有一种药物药效又好,价格又亲民呢?这是我正在试图探究的问题。

    未来探究方向

    重点关注以下几个方面,这些领域可能会在未来改变风湿病的临床实践:

    1. 关注细胞疗法的转化医学:特别是CAR-Treg疗法,它代表了从“抗炎”到“免疫重置”的范式转变。
    2. 深入学习AI在临床决策中的应用:了解AI如何帮助医生在复杂的症状和检查结果中做出更准确的判断。
    3. 理解共病管理的重要性:未来的治疗会更加强调全身健康,例如,通过管理体重和代谢问题来改善风湿病本身。

    结语

    我仅作为一名大二学生理解是浅薄的,尽最大可能去理解这方面内容,我的内容大抵是抛转引玉了吧。这方面我还需要学习和走很长的路。谢谢你能完整读完我的鄙见。

    让科技改善生活!
  • 火杖&刀戈

    在前往王都的宽阔驿道上,坦纳伯斯伯爵的马车与几位行色匆匆的边陲领主并驾而行。出于搜集见闻的癖好,他饶有兴致地聆听着邻车的讨论。

    召集人是一位名叫奥特朗的贵族,他声名显赫的唯一原因,便是与国王陛下那微薄至近乎象征的血缘关系。

    他召开了一次路边的会议,手持国王的谕令,高声宣布:“诸位!陛下需要一种魔法般的武器,一种能改变战争规则的造物!我们必须通力合作,方能不负圣望。”

    然而,会议也仅止于这声高昂的宣告。奥特朗子爵并未提出任何具体方案,便沉浸在众人对他血统的恭维之中。

    此时,坦纳伯斯注意到其中一位沉默寡言的莱恩纳德领主。他来自一个以边陲贸易闻名的家族,只见他小心翼翼地取出一件奇特的造物:一根镶嵌着复杂金属机括的木管。

    莱恩纳德将其命名为“雷吼”,并解释道,此物能借用药剂与火星之力,于百步之外雷鸣作响,洞穿最坚固的板甲。“诸位,它的力量不在于劈砍,而在于来自远方的审判。

    ”莱恩纳德的眼中闪烁着理性的光芒。可惜,这光芒迅速被同僚们的疑虑所淹没。

    一位枪术大师掂量着“雷吼”,鄙夷道:“莱恩纳德,你被骗了。这不过是根结实些的烧火棍。”

    他尤其鄙夷那个激发机构,“这个钩子,怕是防止脱手的花哨装饰吧?”在一种自以为是的、热烈的讨论中,他们一致决定“完善”它。

    他们认为这“铁头木棍”缺乏致命锋锐,于是找来铁匠,将一柄寒光闪闪的阔刃战刀,牢牢绑在了枪口之上。

    “完美!”他们赞叹道,“这才是一件真正的武器!既有铁棍的坚固,又有战刀的锋锐,远近兼备!”坦纳伯斯伯爵在一旁默默看着,将莱恩纳德脸上那混合着绝望与愤怒的隐忍神情,悉数记录在了他的羊皮纸上。

    数日后,国王大会。

    当这个顶着战刀的“改良版雷吼”被呈上时,国王仅试用了一下,便对它不伦不类的形态和糟糕的实战性能皱起了眉头,随手将其搁置一旁。霎时间,失败的阴云笼罩了那个小组。

    坦纳伯斯伯爵清晰地听见,方才还一团和气的领主们瞬间开始了相互指责。

    “我早就说过,这个古怪的管子不靠谱!”枪术大师首先发难。

    “是绑刀的方式不对!影响了平衡!”

    另一位急忙推诿。而那位血统高贵的奥特朗子爵,则高声抱怨:“是你们的技艺玷污了我伟大的构想!”

    在一片喧哗的推卸声中,无人再看一眼那被绑上战刀的“雷吼”,也无人记得莱恩纳德最初的解释。

    只有莱恩纳德本人,面如死灰,他沉默地望了一眼那件被亵渎的造物,最终悻然转身,独自离开了喧闹的会场。。

    坦纳伯斯伯爵的结语

    据沼泽女巫解读内脏卦象所言:世间绝大多数合作,其本质并非为了创造新物,而是为了在失败时,能公平地分摊诅咒。血统与名声是召唤合作的咒语,而旧时代的经验,则是他们唯一听得懂的语言。那个试图引入未来之人,注定要独自品尝全部的愤怒,以及被整个过去所背弃的孤独

  • wordpress 简码-文字展示

    AI真的太好用了你知道吗?

    源码


    <?php
    // 在主题的functions.php文件中添加以下代码
    
    // 注册所有文字效果简码
    function register_text_effects_shortcodes() {
        // 渐变色文字 - 支持嵌套版本
        add_shortcode('gradient_text_n', 'gradient_text_nested_shortcode');
        
        // 打字机效果 - 支持嵌套版本
        add_shortcode('typewriter_text_n', 'typewriter_text_nested_shortcode');
        
        // 文字阴影效果 - 支持嵌套版本
        add_shortcode('shadow_text_n', 'shadow_text_nested_shortcode');
        
        // 霓虹灯文字 - 支持嵌套版本
        add_shortcode('neon_text_n', 'neon_text_nested_shortcode');
        
        // 3D立体文字 - 支持嵌套版本
        add_shortcode('text_3d_n', 'text_3d_nested_shortcode');
        
        // 文字高亮效果 - 支持嵌套版本
        add_shortcode('highlight_text_n', 'highlight_text_nested_shortcode');
    }
    add_action('init', 'register_text_effects_shortcodes');
    
    // 渐变色文字简码(嵌套版本)
    function gradient_text_nested_shortcode($atts, $content = null) {
        $atts = shortcode_atts(array(
            'color1' => '#ff0000',
            'color2' => '#0000ff',
            'size' => '24px',
            'align' => 'center'
        ), $atts);
        
        $id = 'gradient-text-' . uniqid();
        
        $output = '<style>
            #' . $id . ' {
                font-size: ' . $atts['size'] . ';
                font-weight: bold;
                background: linear-gradient(45deg, ' . $atts['color1'] . ', ' . $atts['color2'] . ');
                -webkit-background-clip: text;
                -webkit-text-fill-color: transparent;
                text-align: ' . $atts['align'] . ';
                margin: 10px 0;
                display: inline-block;
            }
        </style>';
        
        $output .= '<span id="' . $id . '">' . do_shortcode($content) . '</span>';
        
        return $output;
    }
    
    // 打字机效果简码(嵌套版本)
    function typewriter_text_nested_shortcode($atts, $content = null) {
        $atts = shortcode_atts(array(
            'color' => '#333',
            'size' => '24px',
            'cursor' => 'true'
        ), $atts);
        
        $id = 'typewriter-' . uniqid();
        
        $output = '<style>
            #' . $id . ' {
                font-size: ' . $atts['size'] . ';
                color: ' . $atts['color'] . ';
                font-family: monospace;
                overflow: hidden;
                border-right: ' . ($atts['cursor'] == 'true' ? '3px solid ' . $atts['color'] : 'none') . ';
                white-space: nowrap;
                margin: 0;
                letter-spacing: 2px;
                animation: typing 3.5s steps(40, end), blink-caret .75s step-end infinite;
                display: inline-block;
            }
            
            @keyframes typing {
                from { width: 0 }
                to { width: 100% }
            }
            
            @keyframes blink-caret {
                from, to { border-color: transparent }
                50% { border-color: ' . $atts['color'] . '; }
            }
        </style>';
        
        $output .= '<span id="' . $id . '">' . do_shortcode($content) . '</span>';
        
        return $output;
    }
    
    // 文字阴影效果简码(嵌套版本)
    function shadow_text_nested_shortcode($atts, $content = null) {
        $atts = shortcode_atts(array(
            'color' => '#333',
            'shadow_color' => '#aaa',
            'size' => '32px',
            'blur' => '10px'
        ), $atts);
        
        $id = 'shadow-text-' . uniqid();
        
        $output = '<style>
            #' . $id . ' {
                font-size: ' . $atts['size'] . ';
                color: ' . $atts['color'] . ';
                text-shadow: 2px 2px ' . $atts['blur'] . ' ' . $atts['shadow_color'] . ';
                font-weight: bold;
                margin: 0;
                display: inline-block;
            }
        </style>';
        
        $output .= '<span id="' . $id . '">' . do_shortcode($content) . '</span>';
        
        return $output;
    }
    
    // 霓虹灯文字简码(嵌套版本)
    function neon_text_nested_shortcode($atts, $content = null) {
        $atts = shortcode_atts(array(
            'color' => '#fff',
            'glow_color' => '#0ff',
            'size' => '40px'
        ), $atts);
        
        $id = 'neon-text-' . uniqid();
        
        $output = '<style>
            #' . $id . ' {
                font-size: ' . $atts['size'] . ';
                color: ' . $atts['color'] . ';
                text-shadow: 0 0 5px ' . $atts['color'] . ', 0 0 10px ' . $atts['color'] . ', 0 0 20px ' . $atts['glow_color'] . ', 0 0 40px ' . $atts['glow_color'] . ', 0 0 80px ' . $atts['glow_color'] . ';
                font-weight: bold;
                margin: 0;
                display: inline-block;
                animation: neon-flicker 2s infinite alternate;
            }
            
            @keyframes neon-flicker {
                0%, 18%, 22%, 25%, 53%, 57%, 100% {
                    text-shadow: 0 0 5px ' . $atts['color'] . ', 0 0 10px ' . $atts['color'] . ', 0 0 20px ' . $atts['glow_color'] . ', 0 0 40px ' . $atts['glow_color'] . ', 0 0 80px ' . $atts['glow_color'] . ';
                }
                20%, 24%, 55% {
                    text-shadow: none;
                }
            }
        </style>';
        
        $output .= '<span id="' . $id . '">' . do_shortcode($content) . '</span>';
        
        return $output;
    }
    
    // 3D立体文字简码(嵌套版本)
    function text_3d_nested_shortcode($atts, $content = null) {
        $atts = shortcode_atts(array(
            'color' => '#3498db',
            'depth' => '5',
            'size' => '36px'
        ), $atts);
        
        $id = 'text-3d-' . uniqid();
        
        $output = '<style>
            #' . $id . ' {
                font-size: ' . $atts['size'] . ';
                color: ' . $atts['color'] . ';
                font-weight: bold;
                text-transform: uppercase;
                position: relative;
                margin: 0;
                display: inline-block;
                letter-spacing: 2px;
                transform: perspective(500px) rotateX(25deg);
            }
            
            #' . $id . ':before {
                content: "' . esc_attr(do_shortcode($content)) . '";
                position: absolute;
                top: ' . $atts['depth'] . 'px;
                left: 0;
                color: rgba(0,0,0,0.2);
                z-index: -1;
                transform: skewX(45deg) translateZ(-10px);
                filter: blur(2px);
                width: 100%;
            }
        </style>';
        
        $output .= '<span id="' . $id . '">' . do_shortcode($content) . '</span>';
        
        return $output;
    }
    
    // 文字高亮效果简码(嵌套版本)
    function highlight_text_nested_shortcode($atts, $content = null) {
        $atts = shortcode_atts(array(
            'color' => '#ffeb3b',
            'text_color' => '#000',
            'padding' => '5px 10px'
        ), $atts);
        
        $id = 'highlight-text-' . uniqid();
        
        $output = '<style>
            #' . $id . ' {
                background-color: ' . $atts['color'] . ';
                color: ' . $atts['text_color'] . ';
                padding: ' . $atts['padding'] . ';
                border-radius: 4px;
                display: inline-block;
                font-weight: bold;
                position: relative;
                overflow: hidden;
            }
            
            #' . $id . ':after {
                content: "";
                position: absolute;
                top: 0;
                left: -100%;
                width: 100%;
                height: 100%;
                background: linear-gradient(90deg, transparent, rgba(255,255,255,0.4), transparent);
                animation: shine 3s infinite;
            }
            
            @keyframes shine {
                0% { left: -100%; }
                100% { left: 100%; }
            }
        </style>';
        
        $output .= '<span id="' . $id . '">' . do_shortcode($content) . '</span>';
        
        return $output;
    }
    PHP

    使用指南


    WordPress文字效果演示

    WordPress文字效果简码演示

    基本效果展示

    渐变色文字

    这是渐变色文字效果
    [gradient_text_n color1=”#ff0000″ color2=”#0000ff”]这是渐变色文字效果[/gradient_text_n]

    打字机效果

    这是打字机效果文字
    [typewriter_text_n]这是打字机效果文字[/typewriter_text_n]

    霓虹灯效果

    霓虹灯文字
    [neon_text_n color=”#fff” glow_color=”#0ff”]霓虹灯文字[/neon_text_n]

    嵌套效果示例

    渐变色 + 高亮嵌套

    这是渐变色文字,里面包含高亮效果
    [gradient_text_n color1=”#ff0000″ color2=”#0000ff”]这是渐变色文字,里面包含[highlight_text_n]高亮效果[/highlight_text_n][/gradient_text_n]

    阴影 + 打字机嵌套

    阴影文字中的打字机效果
    [shadow_text_n shadow_color=”#aaa”]阴影文字中的[typewriter_text_n]打字机效果[/typewriter_text_n][/shadow_text_n]

    多重嵌套效果

    渐变色中的霓虹灯和高亮效果
    [gradient_text_n color1=”#ff0000″ color2=”#0000ff”]渐变色中的[neon_text_n]霓虹灯[/neon_text_n]和[highlight_text_n]高亮[/highlight_text_n]效果[/gradient_text_n]

    使用说明

    • 将PHP代码添加到主题的functions.php文件中
    • 在文章或页面中使用相应的简码
    • 所有嵌套版本简码名称以”_n”结尾
    • 支持任意层次的嵌套组合
    • 每个效果都有可自定义的参数
  • 个人题库-更新日志

    “All my friends are toxic”

    现在可以直接从下方输入栏输入答案,不用一次次点击选项了。
    新增的用户界面也是一个摆设而已,但请你记住你上册登录时用的名字。
    优化了部分代码。

    更新简述 V2.01.6.4

    • 兼容了含图片选择题
    • 更新了选择题输入逻辑
      现在可以从下方直接输入回答
    • 添加了一个没用的登录界面
    • 优化了部分代码
    • #已知BUG
      移动版无法兼容图片加载

    未来更新目标

    V2.01.6.5

    更新随机选择下连续选择题的支持

    V2.01.7

    可以通过服务器空中下载最新题库
    题库加密处理

    我很懒的

    Any idiot can face a crisis; it’s this day-to-day living that wears you out.

    任何傻瓜都能应对危机,真正折磨人的是日复一日的日常生活。

    —— 安东·契诃夫

    源码


    func pic_show(options_text):
    	var IMG_NODE = $Label_list/IMG
    	var start_index = options_text.find("img")  # 找到 "img" 的起始位置
    	if start_index != -1:
    		var IMGname = options_text.substr(start_index+3).strip_edges()  # 从img开始截取并去除空白
    		#print(IMGname)  # 输出
    		var IMG_path = exe_get_IMG()
    		IMG_path = IMG_path.path_join(IMGname)
    		if not FileAccess.file_exists(IMG_path):
    			print("文件不存在: ", IMG_path)
    			return null
    		# 直接加载纹理
    		var image = Image.new()
    		var error = image.load(IMG_path)
    		if image.get_width()/image.get_height() <0.95:
    			# 旋转90度
    			image.rotate_90(CLOCKWISE)  # 或者使用 COUNTERCLOCKWISE 取决于需求
    		texture = ImageTexture.new()
    		texture.set_image(image)
    		
    		if not texture:
    			print("无法加载纹理: ", IMG_path)
    			return
    		$Label_list/IMG/IMG.texture = texture
    		IMG_NODE.visible = true
    		IMG_path = exe_get_IMG()
    		#依旧屎山挪用,找到标注的文件位置。然后进行调取,新建一个图片显示器。
    GDScript

  • 专升本分析

    专升本


    以下解读仅属于我个人观点,肯定比不过专升本机构的专业分析,仁者见仁智者见智,我也最多是抛砖引玉,希望你们有更好的观点和解读跟我讨论。授人以鱼不如授人以渔,右边连接可以跳转至官方链接。

    辽宁招生考试之窗

    2025专升本改革后由改为分大类进行志愿填报,相较于2024年:
    总体缩招:2025年护理学总招生计划比2024年减少了581人,降幅约18%。
    公办名额急剧萎缩:这是最核心的变化。公办院校名额从2036人锐减至737人,减少了近三分之二。
    锦州医科大学和辽宁中医药大学这两所重要的公办院校在2025年计划中停止了护理学专升本招生。
    民办成为主力:民办院校招生名额大幅增加,承担了超过70%的招生任务。其中新增的辽宁医药学院一所
    学校就招生1800人,成为绝对主力。
    “公缩民扩”趋势明显:这一减一增,清晰地表明了辽宁省专升本招生计划在向民办院校倾斜,这对追求低成本、高质量公办教育的考生来说,竞争将更加激烈。

    一、 基础数据概览
    总考生人数:约 3876人(是所有专业组中人数第二多的组别,仅次于管理组)
    最高分:679分
    最低分:206分
    分数分布范围极广,跨度达473分,说明考生基础差异巨大。
    二、 分数段分布与竞争格局
    为了更直观地理解,我们可以将考生划分为四个梯队:

    竞争梯队分数段累计人数累计占比竞争分析
    第一梯队(高分核心区)500分以上约1057人前27.3%竞争白热化。此区间考生是冲击优质公办本科(如中国医科大学、锦州医科大学等)的主力军。分数密度大,每1分都可能影响最终录取院校层次。
    第二梯队(中等竞争区)400-499分约1190人累计至58.0%关键争夺区。此分数段考生处于公办院校末尾和优质民办院校头部的位置。志愿填报策略至关重要,需要精准定位。
    第三梯队(过线机会区)300-399分约946人累计至82.4%压力适中。这个区间的考生主要目标是民办本科院校。只要过线,有较大机会被录取,但需要关注学费和院校地理位置。
    第四梯队(低分风险区)299分以下约683人后17.6%存在落榜风险。虽然最低分数线为206分,但此分数段考生数量依然庞大,如果招生计划紧张,他们将处于不利地位。

    核心发现:


    • “两头小,中间大”:护理组的考生主体集中在300-500分这个广阔的区间内(累计约2136人,占总人数的55%),这是竞争最激烈、最焦灼的地带。
      高分段集中:前27%的考生分数都在500分以上,说明头部竞争异常激烈。想要考入一流的医学院校,需要极高的分数。
      低分考生基数不容忽视:尽管最低分很低,但300分以下的考生仍有近700人,他们需要为保住录取资格而战。
      三、 核心竞争指标解读
      “一分一段”密集区:
    • 高分段:在550分左右,每1分通常聚集着15-25名考生。例如,从数据看,某一分可能对应20人,下一分对应22人,竞争呈“锯齿状”上升。
      中分段:在450分左右,每1分聚集的考生人数更多,可能达到25-35人。这是决定能否考上公办院校的关键分数段。
      关键分数线与位次参考:
    • 500分:约排在1057名。这是冲击优质公办院校的“入场券”。
      450分:约排在1900名。处于公办与民办院校录取的“分水岭”。
      400分:约排在2650名。在这个位次以上,选择较好民办院校的机会较大。
      350分:约排在3250名。在这个位次以上,有较大概率被民办院校录取。

    个人见解:


    现在处于大二上,专升本的分水岭,也是人生的分水岭。机构说的没错,2025年专升本改革后公办名额大幅跳水,在未来不确定的情况下确实需要一个人引领着我们过河,虽然辽宁专升本即使是往届生也能参加但是工作了真的有时间吗?这件事要趁早。而且学习是件磨人的事情,没有坚强的意志力根本坚持不下来,所以需要一个有学习氛围的环境。大三我也不清楚是边实习边自行升本还是其他,走一步看一步吧,大家都是摸着石头过河。
    希望我的见解能有助于你们更好的选择自己的未来!

    “每一个看似微不足道的决定,每一个全力以赴的瞬间,都在静悄悄地改变着你命运的走向。”

    We are not rich by what we possess but by what we can do without.

    我们的富有不是因为我们拥有的,而是因为我们能没有的。

    —— 康德

    循此苦旅,以抵繁星。

    我们顶峰相见