---
# System prepended metadata

title: Week11 7-3 、  發現問題：XSS
tags: [2020十一月第二周, Lidemy心得, 進度筆記, BE101, PHP]

---

# Week11 7-3 、  發現問題：XSS  
###### tags: `BE101` `PHP` `2020十一月第二周` `進度筆記` `Lidemy心得`

***

XSS (Cross-site Scripting) ， 跨網站執行 JS ， 例如在留言板中滲入 `<script></script>` ， 使留言板被劫持。  

![](https://i.imgur.com/Oiq5uKz.png)  

- 留言內容被解析成程式碼的一部分，既然可以寫 script 就可以做更多事情。  
- 離如導到其他網站，像是釣魚網站，或是用 `alert(document.cookie)` 去抓 SESSION ID 。 
- 這樣如果把目前觀看頁面的 user cookie ， 甚至傳到有心人的 server 。  
- 知道 user cookie 就可以得知 SESSION ID ， 再來就可以偷身分、資料，非常危險。 
- 所以應該做特殊處裡，把留言的一部分作成文字，而不是可以載入的 code 。   

***
參考資料:  
[什麼是Cross-Site Scripting（XSS）攻擊| 程式前沿](https://codertw.com/%E5%89%8D%E7%AB%AF%E9%96%8B%E7%99%BC/46727/)  

[\[IS\] Cross-Site Scripting(XSS) | PJCHENder 未整理筆記](https://pjchender.github.io/2020/06/30/is-cross-site-scripting-xss/)  

[Cross Site Scripting (XSS) Software Attack | OWASP Foundation](https://owasp.org/www-community/attacks/xss/)  

[XSS攻擊範例-Cross-site scripting(跨網站指令碼攻擊) @ 史丹利 ...](http://newaurora.pixnet.net/blog/post/187351995-xss%E6%94%BB%E6%93%8A%E7%AF%84%E4%BE%8B-cross-site-scripting%28%E8%B7%A8%E7%B6%B2%E7%AB%99%E6%8C%87%E4%BB%A4%E7%A2%BC%E6%94%BB)  

***

# Week11 7-4 、 PHP 內建修正 XSS 問題   
###### tags: `BE101` `PHP` `2020十一月第二周` `進度筆記` `Lidemy心得`

***

- 修補 XSS 漏洞。
- ==`htmlspecialchars()` 可以把特殊字元編碼==，例如 `<` 是小於的符號，透過編碼後變成 `&lt;` 這字串就會被 html 解釋成小於這個符號，而不是小於的 tag 。  

***

## 首頁修正  
index.php 的部分:  
```
<section>
        <?php
          while($row = $result->fetch_assoc()) {
        ?>
          <div class="card">
            <div class="card__avatar"></div>
            <div class="card__body">
                <div class="card__info">
                  <span class="card__author">
                    <?php echo escape($row['nickname']); ?> 
                  </span>
                  <span class="card__time">
					<?php echo escape($row['created_at']); ?>
                  </span>
                </div>
                <p class="card__content"><?php echo escape($row['content']); ?></p>
            </div>
          </div>
        <?php } ?>

      </section>
```
- 把內容跳脫後再顯示出來，就可以讓 script 被當作"文字"。 
```
<p class="card__content"><?php echo escape($row['content']); ?></p>

``` 
- 暱稱和建立時間也要跳脫，不然也會有 XSS 風險。
- 只要是使用者可以控制的地方都要注意到。    

***

## 共用檔案修正  
utils.php 檔案:  
```
<?php
  require_once("conn.php");

  function generateToken() {
    $s = '';
    for($i=1; $i<=16; $i++) {
      $s .= chr(rand(65,90));
    }
    return $s;
  }

  function getUserFromUsername($username) {
    global $conn;
    $sql = sprintf(
      "select * from users where username = '%s'",
      $username
    );
    $result = $conn->query($sql);
    $row = $result->fetch_assoc();
    return $row; // username, id, nickname
  }
  
  function escape($str) {
    return htmlspecialchars($str, ENT_QUOTES); // 跳脫(傳一個字串進來)，透過這個函式的結果傳回去，成為安全的字串
  }
?>
```
- 不是在資料庫存的內容就是跳脫 `escape()` 。  
- 推薦在顯示的時候做，因為這份資料可能不只有網頁要用，可能手機 APP 也要用。  
- 應保持使用者輸入的內容，因跳脫完後如果直接存到資料庫，iOS 和 Android 會看不懂。  

***
參考資料: 
[防止 XSS 攻擊](https://tech.meituan.com/2018/09/27/fe-security.html)  

[PHP ： htmlspecialchars - PHP學習誌 - Google Sites](https://www.google.com/url?sa=t&rct=j&q=&esrc=s&source=web&cd=&ved=2ahUKEwj2we7-r7LtAhUkxosBHfgwA6QQFjAAegQIBRAC&url=https%3A%2F%2Fsites.google.com%2Fsite%2Fphplearnmark%2Fphp%2Fphp-zhi-ling-qing-dan%2Fzi-chuan-han-shi%2Fphp-htmlspecialchars&usg=AOvVaw1XblrxcteAUbc_kqZLfaES)  

[htmlspecialchars - Manual - PHP](https://www.google.com/url?sa=t&rct=j&q=&esrc=s&source=web&cd=&ved=2ahUKEwj2we7-r7LtAhUkxosBHfgwA6QQFjABegQIAxAC&url=https%3A%2F%2Fwww.php.net%2Fmanual%2Fen%2Ffunction.htmlspecialchars.php&usg=AOvVaw3jpM0KWdqpgH51-E5nzOsB)  

[PHP htmlspecialchars 函數功能與用法- 網頁設計教學站](https://www.google.com/url?sa=t&rct=j&q=&esrc=s&source=web&cd=&ved=2ahUKEwj2we7-r7LtAhUkxosBHfgwA6QQFjACegQIARAC&url=https%3A%2F%2Fwww.webtech.tw%2Finfo.php%3Ftid%3DPHP_htmlspecialchars_%25E5%2587%25BD%25E6%2595%25B8%25E5%258A%259F%25E8%2583%25BD%25E8%2588%2587%25E7%2594%25A8%25E6%25B3%2595&usg=AOvVaw0C7fTp2c0PKP9HZItTcF0t)  

[PHP htmlspecialchars() 函數 - HTML Tutorial](https://www.google.com/url?sa=t&rct=j&q=&esrc=s&source=web&cd=&ved=2ahUKEwj2we7-r7LtAhUkxosBHfgwA6QQFjAEegQIAhAC&url=http%3A%2F%2Fwww.w3big.com%2Fzh-TW%2Fphp%2Ffunc-string-htmlspecialchars.html&usg=AOvVaw09YkhqVcCJ1AJ9SalcpZCh)  



