---
# System prepended metadata

title: LeetCode讀書會（8/05~8/11) XSS & 物件導向語法的使用和好處

---

# LeetCode讀書會（8/05~8/11) XSS & 物件導向語法的使用和好處

## XSS

-- 宇軒 --
### XSS主要利用可以輸入的欄位（網址、網站中任何可進行編輯區域）輸入JS語法對網站或網站的使用者造成攻擊行為。XSS可以分為以下三種常見類別：
1. stored XSS：就是將惡意JS程式存在後端資料庫的行為。例如在留言板輸入```<script>alert('你的電腦中毒了’)</script>```。這段文字若完全沒有進行處理就被存入資料庫，當網頁留言版被其他使用者載入時，就會跳出'你的電腦中毒了'這個alert訊息。


2. reflect XSS：將script藏在URL網址中，透過GET將使用者的資訊(帳號密碼、cookie)等資訊傳送到攻擊者指定的伺服器中，且通常URL會經過URL encoding導致網址看起來與一般網址沒有太大的差別，攻擊者通常會將這些URL透過郵件或發布在論壇誘使使用者點擊，藉此竊取資訊，並冒充使用者進行其他網站操做（匯款、購物等）。


3. DOM Based XSS：只要網頁使用如innerHTML等語法，攻擊者就有機會將JS程式注入網頁中，例如攻擊者可以放入一個img element，src則是一個「攜帶cookie資訊」的請求，攻擊者又能拿到使用者的cookie了。

二、防範XSS攻擊可以分為以下幾個要點，分層防守XSS的攻擊：


1. 凡是有輸入的地方，都對內容進行驗證，永遠不相信使用者的輸入，當輸入不被信任的資料(例如``` " ' <>```)都做escape再儲存，在畫面看到的依然是相同的字符，但不會被當作HTML解析，目前許多程式語言或framework都以做到這件事。但有些網頁需要允許內容有部分HTML(例如部落格)，將內文存成HTML再以 DOMPurify 或 js-xss 等套件將不合法的標籤或屬性過濾。


2.假如攻擊者繞過了驗證程序，成功在網站中插入JS程式，可以利用``` response header ```或```<meta> ```tag 制定CSP(Content Security Policy)阻止未知來源的JS被瀏覽器載入，確保瀏覽器載入的程式碼都是網站所認可的，避免繞過驗證程序的JS程式在網頁中橫行。


3.假設攻擊者依然繞過了CSP成功在網頁執行惡意JS，則可以思考如何避免攻擊者登入受害者身分，以及避免攻擊者藉由XSS做出重要的操作(例如付款)。
在預防攻擊者登入的部分，由於攻擊方式通常是偷取cookie，故驗證使用者身分的cookie應該要設定Httponly，使前端無法用document.cookie取得cookie，避免攻擊者登入。
由於攻擊者還是可以直接透過受害者打後端API，對於重要操作應設置第二道關卡，例如更改密碼要輸入原密碼、付款的時候要用手機接收驗證碼等等，這樣一來就算被打出XSS，攻擊者也會因為沒有這些認證手段而無法順利執行預設的攻擊操作。

-- 宇軒--

Stored XSS
Reflected XSS
DOM Based XSS


## 物件導向
### 類別(Class)
類別定義了資料的屬性以及針對裡面屬性操作的方法，例如人的身高體重和取得個人資料的方法等。

### 物件(Object)
物件就是類別的實例

#### 物件導向設計方法可以讓各種物件獨立存在且互相呼叫，且各自有各自的功能，每一個物件都會有資料或者方法，讓整個程式碼可以更加靈活且易於擴充

### 物件導向三大特性
#### 1、封裝：

你不需要知道我怎麼做的，請透過interface來跟我溝通
    
```python=

class DOG:
    def __init__(self):
        self.__name = "Kiki"
    def get_name(self):
        return self.__name


new_dog = DOG()
print(new_dog.get_name()) ### Kiki

```

#### 2、繼承：

我擁有父親的所有東西

```python=
class DOG:
    def __init__(self):
        self.__name = "Kiki"
    def get_name(self):
        return self.__name

class new_dog(DOG):
    pass

aaa = new_dog()
print(aaa.get_name()) ### Kiki 
```

#### 3、多型

相同的方法，可以傳入不同參數，也可以整個覆寫

```python=
class DOG:
    def __init__(self):
        self.__name = "Kiki"
    def get_name(self):
        return self.__name

class new_dog(DOG):
    def get_name(self,another):
        return super().get_name()+" ---> "+another

aaa = new_dog()
print(aaa.get_name("Hello")) ### Kiki ---> Hello
```


資料來源：(承翰)

XSS
https://medium.com/starbugs/%E8%BA%AB%E7%82%BA-web-%E5%B7%A5%E7%A8%8B%E5%B8%AB-%E4%BD%A0%E4%B8%80%E5%AE%9A%E8%A6%81%E7%9F%A5%E9%81%93%E7%9A%84%E5%B9%BE%E5%80%8B-web-%E8%B3%87%E8%A8%8A%E5%AE%89%E5%85%A8%E8%AD%B0%E9%A1%8C-29b8a4af6e13

物件導向
https://zh.wikipedia.org/wiki/%E9%9D%A2%E5%90%91%E5%AF%B9%E8%B1%A1%E7%A8%8B%E5%BA%8F%E8%AE%BE%E8%AE%A1
https://totoroliu.medium.com/%E7%89%A9%E4%BB%B6%E5%B0%8E%E5%90%91-object-oriented-programming-%E6%A6%82%E5%BF%B5-5f205d437fd6

劉逸的留意世界「論物件導向」系列文


## leetcode區