# 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區