# Web I by DU
:::danger
請愛惜共筆,勿進行惡意刪減
:::
:::success
課前可先下載sublime:https://www.sublimetext.com/
:::
:::success
[簡報](https://slides.com/d/WoO21sY/live)
:::
## what is web
- 全球資訊網 **W**orld **W**ide **W**eb
- Web Security
## 課程內容
- 怎麼看到一個網頁
- URL、HTTP 協定、Server
- cookies
- robots.txt
- 網頁三兄弟(HTML、CSS、JavaScript)
> 下午的 XSS 非常有趣,推薦大家一定要聽
> 絕對沒有給下午的講師壓力 owO <!--我要怒你-->
> [name=Du]
## 怎麼看到一個網頁
- 網路的世界並沒有跳脫世界的規則
- 一樣要知道他的位置(URL、統一資料定位符)
> 類似經緯度
- 一樣需要知道他長怎樣(HTML、超文本標記語言)
- 一樣需要知道怎麼拿回來(HTTP、超文本傳輸協議)
## what is URl
- 統一資料定位符(Uniform Resource Locator)
> 網址
- 格式:
- \[協定類型\]:\[伺服器位置\]:\[埠號\]/\[檔案路徑\]?\[查詢\]\#\[片段id\]
- 範例:
- https://nisra.net:443/tmp/test.php?q=1#1
>假的
- 靜態網站
- 不具備互動功能(會員登入...)
- ex: 會員購物車
- 動態網站
- 會跟使用者產生互動
- 查詢功能
- :::spoiler 差別?
- 靜態跟動態的區別其實並沒有特別的官方定義,不過依照一般的大眾定義來講,只要是能夠跟使用者互動的(比如使用者按一個按鈕,然後畫面上會出現一隻貓貓)這樣的就算是動態網頁,一般的靜態網頁就是你點進去只能看,然後其他操作都沒有。所以一般有 js 的,然後 js 是有內容的話,通常都會是動態網頁
- 更準確來說應該是有沒有跟伺服器互動,如果那隻貓貓是網頁實時向伺服器要的那就是動態,如果是一開始就跟網頁一起傳過來、然後用本地 JS 去判斷該顯示哪隻喵就是靜態
## what is HTTP
- 超文本傳輸協定(HyperText Transfer Protocol)
> 用來做網頁前端與後端溝通
- 一種用來傳輸超媒體文件(like HTML)的應用層協定
- 特性:無狀態協定
- 請求後不會在伺服器保留狀態
- 前後請求不具關連性
- 所以怎麼請求(Request)
| 方式 | 說明 |
|:--------:|:------------------------------------:|
| GET | 取得目標資源 |
| HEAD | 取得標頭 |
| POST | 提交指定資源的實體 |
| PUT | 替換目標資源,更新目標資源 |
| CONNECT | 和指定資源標明的伺服器之間,建立隧道 |
| DELETE | 刪除目標資源 |
| OPTIONS | 取得資源通訊方式 |
| TRACE | 用於測試或診斷 |
<!-- 強迫症會發作ㄟ -->
## GET
- 可以想像成是要向網頁查詢資料
- 方式是透過告訴伺服器你需要的資料相關參數
- 格式
- 網址?參數名稱1=參數內容1&參數名稱2=參數內容2
> 多個參數使用 & 去做間隔
- 就像寫明信片
> 缺點 網址會有最大長度 [IE:2083](https://support.microsoft.com/zh-tw/topic/internet-explorer-%E4%B8%AD-url-%E9%95%B7%E5%BA%A6%E4%B8%8A%E9%99%90%E7%82%BA-2-083-%E5%80%8B%E5%AD%97%E5%85%83-174e7c8a-6666-f4e0-6fd6-908b53c12246)
> 提供資訊會直接裸露在網址內容
- 如果今天傳送的東西是密碼呢?
- https://nisra.net/login?username=admin&password=root
- ~~裸奔~~
## POST
- 將資料放在 message-body 進行傳送
- 可以想成把資料寫在一張紙上,再塞進信封內在送
- 傳遞上比較安全且傳遞的資訊可以比較多
- 彈性也比較高
- 封包攔截仍然能查詢到相關資訊
>至少不是裸奔
## HTTP 狀態碼
| 狀態碼 | 說明 |
|:------:|:----------:|
| 1xx | 訊息提示 |
| 2xx | 請求成功 |
| 3xx | 重新導向 |
| 4xx | 用戶端錯誤 |
| 5xx | 伺服器錯誤 |
## HTTP vs. HTTPS
- HTTP
- 明文傳輸
- 就是裸奔
- HTTPS
- https = http + SSL/TLS
- 內容加密、身分驗證、數據完整...
## server
- Server運作的作業系統
- 負責接收處理 HTTP 協定的 HTTP Server
- 負責邏輯判斷的後段程式語言
- 負責儲存結構化資料的資料庫
## cookies
- 紀錄使用者狀態資料
- ex. 網購的購物車
- 類似便條紙
- 儲存在用戶端
> :::spoiler 登入時的「記住我」
> 記憶體 cookies:關閉瀏覽器就不見(AKA:非持久性)
> 硬碟 cookies :儲存於硬體當中,除非使用者刪除,否則將永遠儲存在硬體中(AKA:持久性)
- Cookie 安全嗎?
- 會被攔截偽造修改
- 有管理者cookie就可以變成管理者
## Session
- :::spoiler 把資料存在Server
- 把含有session id 的cookie發送給伺服器,再由伺服器查詢相對應的session id身份
- 認證不認人
- 透過 session ID 跟 Server 要資料
> 如何避免被竊取
> 透過 HTTPS 連線以避免被外洩,並加上時效性
## robots.txt
- 網站根目錄下的文字檔
- 控管搜索引擎可存取的檔案
- 放一些機密資料,讓爬蟲爬不到
> Disallow:爬蟲基本上就爬不到
- 並非絕對標準,而是大家習慣的用法
- 不希望被看到,就不會被看到嗎?
> 惡意使用者可以看到 Disallow,就是一個攻擊面向
> 此地無銀三百兩
### robots.txt的問題
- 可以看到 disallow
>User-agent:*
>Disallow:/you_will_nver_nver_see_me
- :::spoiler 避免方法
> User-agent: *
> Disallow:/you_will_never
> 路徑匹配,間接防止惡意使用者查到原本網址本身
### 老師補充
- 現象=>原理
- 術語的闡述不同
### 前端與後端
使用者->前端
1.使用者留言
前端->後端
2.把留言丟給後端儲存
後端->前端
3.把留言傳回前端
前端->使用者
4.資料放上網頁
## 網頁三兄弟
### HTML
- :::spoiler 網頁架構
- 骨架
- .html
- 超文本標記語言
- 讓瀏覽器讀取
- 是標記語言**not programming language**
> 各位現在在打得 94 一種標記語言
```html=
<!DOCTYPE html>
<html>
<head>
<title></title> <!-- 分頁標題-->
</head>
<body>
<p>Hello World!</p>
<!-- This is a comment -->
</body>
</html>
```
#### 常用標籤
- 標籤基本上是成雙成對的出現
- `<!DOCTYPE html>`
- 讓瀏覽器以 HTML5 渲染
- `<head></head>`
- 給瀏覽器看得或是導入外掛和文件
- `<title></title>`
- 網頁的標題
- `<body></body>`
- 主要部分
- `<!-- This is comment -->`
- 註解
- `<div></div>`
- 獨立區塊
- `<h1></h1>` ... `<h6></h6>`
- 標題大小(h1最大,h6最小)
- `<br>` `</br>`
- 換行
- 可以單獨存在
- `<img src="圖片網址" alt="替代文字" width="" height="">`
- 插入圖片
> alt="替代文字" 為圖片顯示不出來時的替代文字
- `<a href="網址" target="_blank">文字</a>`
- 超連結
> target="_blank" 為在新分頁開啟連結
- 段落
> <p>
> 前後會空一行
</p>
#### 文字效果標籤
- `<b></b>`
- <b>粗體</b>
- `<i></i>`、`<em></em>`
- <i>斜體</i>
- `<u></u>`
- <u>底線</u>
#### Attribute 屬性
- 用來敘述元素的相關性質
- class
- 用來命名,方便 CSS 與 JS 來選取特定的元素
- 類似於身分(學生、老師),可以有多個元素是同一個 class
- id
- 一個元素可以有多個class但只能有一個id
##### 常用標籤
- `<img src="圖片網址" alt="替代文字" width="" height="">`
- 當圖片顯示不出來的時候就會顯示替代文字
- `<a href="網址" target="_blank">文字</a>`
- 超連結
- target:在指定的地方開啟連結
- _blank:在新窗口開啟連結
```HTML=
<img src="圖片網址" alt="替代文字" width="" height="">
插入圖片
<a href="網址" target="_blank">文字</a>
超連結
```
#### 列表
- 無序列表
- Coffee
- Milk
```html=
<ul>
<li> Coffee </li>
<li> Milk </li>
</ul>
```
- 有序列表
1. Coffee
2. Milk
```html=
<ol>
<li> Coffee </li>
<li> Milk </li>
</ol>
```
#### 表單
- `<form action="" method=""></form>`
- 建立表單
- `action`
- 指定發送到伺服器網址,空白表示自己url
- `method`
- 指定傳輸時要用哪種方式(HTTP method)
- `<input type="" value="顯示的文字" name="" >`
- type:text, password, button......
- `<input type="button" value="顯示的文字" onclick="動作" >`
```html=
<form>
<input type="text" name="account">
<input type="password" name="password">
<input type="button" value="Submit" name="btn">
</form>
```
`<input type="button" value="顯示的文字" onclick="動作" >`
- [input 更多玩法](https://www.fooish.com/html/input-tag.html)
- name和id差在哪邊
>name用在GET伺服器取得參數
>id用在js或css操作
- Submit按下去怎麼沒反應
>因為type 為button,需要自己去定義
### CSS
- Cascading Style Sheets
- 要記得打分號(單個時不打依舊能用但不太好)
- :::spoiler 網頁外觀
- 外表衣服美妝品
:::
- .css
- inline style
- `<h2 style="color:red;">Red Text</h2>`
- 寫在裡面
- external style
```html=
<head>
<link rel="stylesheet" type="text/css" href="./css/XXX.css">
</head>
```
```css=
body {
background: black;
}
```
- selector
- 負責找尋特定元素
- html中寫css 必須用\<style\>\</style\>包圍(inner style)
```css=
<style type="text/css">
body {
background-color: black;
/* body tag 中的背景會變黑 */
}
.class-name {
color: red;
/* class-name 中的文字會變紅 */
}
#id-name {
color: blue;
/* id-name 中的文字會變藍 */
}
</style>
```
- 常見 CSS
- color : 文字顏色
- rgb(255,255,255)
- hsl(0,100%.50%)
- text-align:文字對齊(center, left, right...)
- font-size:文字大小
- px 絕對單位 瀏覽器預設16 px
- em 相對單位 每個子元素*父元素的相對大小
- background-color : 背景顏色
- background-img: url("圖片網址")
- [google (css property)](https://www.google.com/search?q=css+property&rlz=1C5CHFA_enTW729TW729&oq=css+property&aqs=chrome..69i57j69i64.1144j0j7&sourceid=chrome&ie=UTF-8)
### JS
- :::spoiler 網頁功能
- 皮膚肌肉血液
- .js
- 高階直譯式語言
- **不是JAVA**
#### 寫在哪
- 寫在 HTML 裡
- 另外寫一個 .js 檔
#### 宣告變數
- ```var num = 666;```
- 數字
- ```var str="666"// or '666';```
- 字串
- ```var arr = \[123 "apple"\];```
- 陣列
- 可以把它想像成是一疊的盒子
- ex: 取index 0: arr[0]
- ```var bool = true // or false;```
- 布林
#### 運算子
- `+ - * /`
- `==, !=, >, >=, <, <=`
- `&& , ||`
- `%` 取餘數 ex. 5%3=2
- `**` 次方
- `===, !==` 嚴格比較
- 除了比較值還比較型態
#### 自訂函數
```javascript=
<script>
function add(x,y){
return x+y ;
}
</script>
```
#### 註解(comment)
- 單行註解以 `//` 開頭
- 多行註解以 ``/*`` 開頭,以 ``*/`` 結尾
#### 輸出
- `console.log()`
- F12 開發者工具->Console顯示
- `alert()`
- 彈出視窗顯示
#### DOM 文件物件模型
- Document Object Model
- 抓取元素
-
##### DOM 文件物件模型
- 操作
```javascript=
document.getElementById("id-name");
document.getElementByClassName("class-name");
document.getElementByTagName("tag-name");
```
```javascript=
var test = document.getElementById("id-name");
// 用 test 去接物件
var value = test.value;
test.innerText = "I've been changed"
// 最常使用,獲取或設置元素內的文字
test.innerHTML
// 獲取或設置元素包含的 HTML 標籤
```
```javascript=
function Get_Date(){
document.getElementById('time').innerText = Date();
}
```
:::spoiler lab answer
```html=
<script type="text/javascript">
function call(){
var height = document.getElementById("height").value;
var weight = document.getElementById("weight").value;
var BMI =weight/ (height*0.01^2);
alert(BMI);
}
</script>
身高:<input id="height" type="text" value="168">
<br>
體重:<input id="weight" type="text" value="65">
<br>
<input type="button" value="Submit" name="btn" id="submit" onclick="call()">
```
:::spoiler 另一種寫法
```javascript=
addEventListener(
'click',function(){
blahblahblah....
})
```
[extra lab](https://drive.google.com/file/d/1Y_3-tg5bMp46fYois6BYAFSI68MfZjBw/view)
### CSRF
- 跨站請求偽造(Cross Site Request Forgery)
- 讓使用者發出惡意請求
<!-- 共筆歡迎大家>< -->
<!--好耶-->
<!-- 你好啊 ~ 歡迎加入共筆 -->
<!-- Magus was here -->
<!-- hello minasun -->
---
###### tags: `Enlightened` `NISRA` `2022`
<style>
.navbar-brand:before {
content: ' NISRA × ';
padding-left: 1.7em;
background-image: url(https://i.imgur.com/ue2XHqP.png);
background-repeat: no-repeat;
background-size: contain;
}
.navbar-brand > .fa-file-text {
padding-left: 0.1em;
display: none;
}
</style>