Node.js
原生態的js運行在前端。
Node.js:他與原生態JS最大的不同,就是前端只能看到輸出的代碼,而看不到jS文件
?req接收,res回顯
?dirname獲取絕對路徑
提交表單?:
?“Post路由” 到底是什么。
?
這是一個非常核心的Web開發概念。我們可以把它拆成兩部分來理解:“路由” 和 “POST方法”。
?
---
?
1. 首先,什么是“路由”?
?
想象一下現實世界中的郵局:
?
· 地址:比如“北京市海淀區中關村大街27號”。這個地址唯一地指定了一個位置。
· 路由:郵局的工作人員看到這個地址,就知道應該把這封信交給“北京市海淀區中關村大街27號”的收發室。
?
在Web服務器里,這個“收發室”就是一段處理函數。
?
所以,路由 就是一套映射規則。它告訴服務器:
?
“當有人訪問 這個URL(地址)并使用 這種HTTP方法(比如GET或POST)時,你就應該把請求交給 這段代碼(處理函數)來負責。”
?
一個路由由三個關鍵部分組成:
?
1. HTTP方法:GET, POST, PUT, DELETE等。
2. URL路徑:例如 /login, /users, /articles/123。
3. 處理函數:一段具體的服務器端代碼。
?
---
?
2. 然后,什么是“POST方法”?
?
HTTP協議定義了幾種不同的“動作”來表達客戶端的意圖,最主要的就是GET和POST。
?
· GET:意思是“獲取”。主要用于向服務器索取數據(比如請求一個網頁、查詢信息)。數據通過URL參數傳遞。
· POST:意思是“發送”或“提交”。主要用于向服務器提交數據(比如提交登錄表單、上傳文件)。數據放在請求的主體(Body) 里,不會顯示在URL中,更安全,也能傳輸更多內容。
?
---
?
3. 所以,“Post路由”到底是什么?
?
Post路由就是一條專門處理HTTP POST請求的映射規則。
?
它本質上是一條指令,告訴服務器:
?
“嘿,如果有人向 /login 這個地址發送(POST) 數據過來,你別管別人,就把這個請求交給我指定的這個函數來處理。”
?
它的工作流程如下圖所示,清晰地展示了從客戶端提交數據到服務器返回響應的完整過程:
?
```mermaid
flowchart TD
A[客戶端 Client<br>如瀏覽器] -->|1. 發送POST請求<br>URL: /login<br>Body: 用戶名、密碼| B[服務器 Server]
?
subgraph B[服務器 Server]
? ? B1[接收請求]
? ? B2{路由匹配?}
? ? B2 -- 是 --> B3[POST路由<br>路徑: /login<br>方法: POST]
? ? B3 --> B4[處理函數<br>1. 從Body提取數據<br>2. 查詢數據庫驗證<br>3. 創建會話]
? ? B2 -- 否 --> B5[返回404錯誤]
end
?
B4 -->|4. 返回響應<br>重定向到/home或返回錯誤信息| A
```
?
一個具體的例子(Node.js + Express 框架)
?
```javascript
// 1. 引入Express框架
const express = require('express');
const app = express();
?
// 允許解析JSON格式的請求體
app.use(express.json());
?
// 2. 定義一個處理 GET 請求的路由
// 當用戶用瀏覽器訪問 /login 時,返回一個登錄表單頁面
app.get('/login', (req, res) => {
? res.send(`
? ? <form action="/login" method="POST">
? ? ? <input type="text" name="username" placeholder="Username">
? ? ? <input type="password" name="password" placeholder="Password">
? ? ? <button type="submit">Login</button>
? ? </form>
? `);
});
?
// 3. 定義的就是一個 【POST路由】!
// 當用戶提交上面的表單時,表單數據會以POST方式發送到 /login
app.post('/login', (req, res) => { // 注意這里的方法是 `post`
? // 處理函數開始工作:
? // 1. 從請求Body中提取客戶端發送過來的數據
*路由就是看每個Http發送過來的地址與方法,并將它送到相應的處理軌道。
post提交,get收
req query獲取urL查詢參數的字符串(get)
Post參數,把數據存儲在數據體中
Get才是URL
如果這個東西要用post傳的話,那就得要引用一個庫:
?安全問題
黑盒測試:
?這張圖片展示的是HTTP請求的響應頭信息,其中能明確的實體信息有:
?
- Web應用的技術棧:通過 ?X-Powered-By: Express? 可知,這個Web應用是用 Express框架(Node.js生態中常用的Web開發框架)開發的。
- 請求結果:狀態碼為 ?404 Not Found?,表示客戶端請求的資源在服務器上“未找到”。
- 其他響應頭細節:還包含一些安全、連接相關的配置(如 ?Content-Security-Policy? 用于安全策略限制,?Keep-Alive? 用于長連接保持等)。
這玩意兒黑盒測試可以看框架↑
?
?
SQL注入:
?
?*通過用戶端DIR傳遞,所以容易注入。
在 Node.js 的 Express 框架(或類似 Web 開發場景)中:
?
- ?req? 是 ?request? 的縮寫,代表請求對象,包含客戶端向服務器發送的所有請求信息(如請求參數、請求頭、請求方法等)。
- ?res? 是 ?response? 的縮寫,代表響應對象,用于服務器向客戶端返回響應(如設置響應內容、響應頭、結束請求等)。
?
簡單說:?req? 管“收請求”,?res? 管“發響應”。
?
原型鏈污染:
?先找自身,再找邏輯鏈:
let foo={bar:1}
此時,foo.bar值等于1
Foo.__proto__.bar=2,修改foo原型的bar的屬性為2
因為查找順序,foo→bar(已被占用,已經擁有自己的bar屬性),Foo.bar依然是1
當我們再創造一個新的對象zoo
zoo.bar=2了,因為公共原型被污染,而他自己也是空的,所以變成了2
Foo.proto.bra是從foo中查找bra這個最終原型,并把公共的bra(公共原型)進行修改。
就是通過foo直接用那啥函數直接查你老祖宗是誰并且進行修改。
?