【八个月网安课程】第三周·周三:JavaScript 基础事件——onclick、onsubmit 与表单拦截

【八个月网安课程】第三周·周三:JavaScript 基础事件——onclick、onsubmit 与表单拦截 以下是第三周周三学习内容的详细展开聚焦 JavaScript 事件与表单拦截。今天的目标不是让你变成 JavaScript 开发者而是通过亲手拦截并绕过前端验证彻底理解**“前端不可信”**这一 Web 安全第一定律。第三周·周三JavaScript 基础事件——onclick、onsubmit 与表单拦截 今日学习目标达成效果能说出JavaScript 在浏览器中的核心作用响应用户操作、动态修改页面内容、与服务器异步通信能解释onclick和onsubmit事件的作用与触发时机知道onsubmit是拦截表单提交的主要手段能独立写出一段 JavaScript 代码利用event.preventDefault()阻止表单的默认提交行为并在控制台输出自定义消息如“提交被拦截”能使用浏览器开发者工具或抓包软件绕过前端验证成功提交被脚本拦截的表单数据从而验证“前端拦截形同虚设”能从安全角度阐述客户端的所有验证JS 校验、输入长度限制、按钮禁用等都不可信任必须由服务器端再次执行相同的校验能初步接触fetch/XMLHttpRequest的基本概念知道表单还可以通过异步方式提交而不引起页面跳转。 一、JavaScript 与安全的关系JavaScript 是运行在浏览器中的编程语言它让网页“动起来”。对于安全学习者而言JavaScript 扮演着双重角色防御方经常用 JS 做输入格式校验、限制提交频率、动态加载安全控件但这些都是客户端的第一道过滤网绝对不能作为最终防线。攻击方利用 JS 实现 XSS 攻击、窃取 Cookie、进行 CSRF 自动化利用、发起探测扫描等。你要理解攻击者的武器才能更好地防御。今天仅接触最基础的事件机制为后续学习 XSS 时深入操纵 DOM 埋下伏笔。 二、HTML 事件与 JavaScriptHTML 元素可以通过事件属性绑定 JavaScript 代码当特定操作发生时自动执行。最常用的两个事件1.onclick点击事件当用户点击某个元素按钮、链接、图片等时触发。buttononclickalert(按钮被点击了)点我/button可以调用自定义函数或直接写简短语句。2.onsubmit表单提交事件今天核心onsubmit是form元素的专属事件在表单即将提交到服务器之前触发。formonsubmitreturnvalidateForm()如果onsubmit绑定的函数返回false表单的提交动作就会被阻止。如果返回true表单正常提交。这是最常用的前端表单验证模式。但请记住攻击者可以轻易禁用 JavaScript 或直接拦截请求从而完全绕过此验证。安全启示你会在今天的实验中亲眼看到即使前端拦截了提交用 curl 或 BurpSuite 依然能把数据发送过去。这就是为什么 SQL 注入、XSS 等漏洞常能在有前端验证的网站上依然成功。 三、拦截表单提交的核心代码document.getElementById(myForm).addEventListener(submit,function(event){event.preventDefault();// 阻止默认提交行为console.log(提交被拦截);// 在控制台输出信息// 这里可以写自定义验证逻辑但无论如何拦截都无法阻止直接发包});解释document.getElementById(myForm)获取表单元素。.addEventListener(submit, ...)绑定 submit 事件监听器。event.preventDefault()这是阻止表单提交的核心方法告诉浏览器不要执行默认的 GET/POST 跳转。console.log()在浏览器控制台F12 → Console打印调试信息。同样的效果也可以使用onsubmit内联属性实现formonsubmitevent.preventDefault();console.log(提交被拦截);returnfalse;今天我们将使用两种方式分别实验加深理解。✍️ 四、动手实践在登录页面上拦截表单并绕过你需要上周创建的login.html文件。我们将分三步走先添加前端拦截并验证拦截有效然后用浏览器开发者工具临时解除拦截最后用 curl 直接发包证明绕过成功。实践 1添加 onsubmit 拦截修改login.html在form标签中添加onsubmit属性formaction/loginmethodpostonsubmitevent.preventDefault();console.log(提交被拦截);!-- 表单项保持不变 --labelforusername用户名/labelinputtypetextidusernamenameusernamebrlabelforpassword密码/labelinputtypepasswordidpasswordnamepasswordbrinputtypesubmitvalue登录/form保存文件在浏览器中打开如果使用 Python http.server确保重启或强制刷新忽略缓存。验证拦截效果按 F12 打开开发者工具切换到Console控制台面板。在页面表单中随意输入用户名和密码点击“登录”按钮。你会看到控制台输出“提交被拦截”页面没有跳转也没有产生网络请求Network 面板无任何新记录。证明前端 JavaScript 成功阻止了提交。实践 2使用开发者工具绕过 JS 拦截现在我们要不修改源代码直接在浏览器中解除限制让表单正常提交。方法一临时移除 onsubmit 属性F12 → Elements 面板。找到form标签右键点击 → 选择“Edit as HTML”。删除onsubmit...整个属性点击空白处完成编辑。再次点击登录按钮表单将正常提交会看到 Network 面板出现 POST 请求并可能返回 404因为本地没有 /login 路径。方法二在 Console 中覆盖事件切换到 Console 面板。输入以下命令并回车document.querySelector(form).onsubmitnull;这将彻底移除 onsubmit 绑定。再次点击登录表单将正常提交。结论前端 JavaScript 验证对于任何具备基本调试技能的人来说都是可以瞬间绕过的纸糊防线。实践 3使用 curl 直接发包绕过终极证明即使没有浏览器攻击者也可以使用命令行工具直接发送 POST 请求完全无视前端验证。启动你的 Python HTTP 服务或任何简单的接收端然后在终端执行curl-XPOST http://127.0.0.1:8080/login-dusernameadminpassword123如果后端真实存在数据就被成功提交了。不管前端 JS 写了多少拦截逻辑curl 根本不会执行 JavaScript这百分之百地证明了安全逻辑必须建立在服务器端。 五、课后测试题与解析测试题写一段 JS 代码阻止表单默认提交并在控制台输出“提交被拦截”。参考答案内联方式formonsubmitevent.preventDefault();console.log(提交被拦截);returnfalse;参考答案事件监听方式scriptdocument.addEventListener(DOMContentLoaded,function(){document.querySelector(form).addEventListener(submit,function(e){e.preventDefault();console.log(提交被拦截);});});/script两种方式均可。代码核心e.preventDefault()或event.preventDefault()阻止浏览器默认的提交动作。console.log(提交被拦截)向控制台输出指定文本。return false在内联方式中等效于同时调用了preventDefault和stopPropagation。常见错误拼写错误preventDefault拼错导致函数未执行。忘记在onsubmit中加上return仅写onsubmitmyFunc()而不加return即使函数返回false也无法阻止提交。✅ 今日学习效果自检清单我能说出onclick和onsubmit的触发时机与区别我知道event.preventDefault()是阻止默认动作的关键方法我在自己的登录页面上成功拦截了表单提交并看到控制台输出“提交被拦截”我使用开发者工具删除 onsubmit 或执行 JS 命令成功绕过了拦截让表单提交我使用 curl 命令直接发送 POST 请求无视了所有前端 JS我深刻理解了“前端验证不可信”的含义并能举出至少一个安全场景如输入校验绕过⚠️ 阶段避坑重点不要相信任何来自客户端的数据浏览器可以被完全控制JS 可以被禁用或修改HTTP 请求可以被拦截器重放。所有输入必须在服务端重新校验。不要把onsubmit验证当作安全措施它只是提升用户体验即时反馈绝不能用于防注入、防越权。不要混淆preventDefault和stopPropagation前者阻止默认动作如表单提交后者阻止事件向父元素冒泡两者在安全绕过中经常搭配但作用不同。不要跳过 curl 发包实验亲手用命令行绕过前端验证会让你对“客户端不可信”有肌肉记忆这是后续所有 Web 漏洞学习的基石。明天周四我们将学习数据流转的全过程前端 → HTTP 请求 → 后端处理 → 数据库存储 → 响应返回。你将画出一次登录请求的完整数据流向图并在自己搭建的简易留言板中观察前后端交互正式迈入理解 Web 应用全栈的第一步。