PHP 資訊安全 - 資料消毒

荀子-性惡篇第二十三: 人之性惡,其善者僞也。

永遠不要相信任何來源不明的資料

不可信資料來源

只要不是系統產出組合之資料,皆不可信。

如下:

1
2
3
4
5
6
7
8
9
10
$_GET
$_POST
$_REQUEST
$_COOKIE
$argv
php://stdin
file_get_contents()
遠端資料庫
遠端 API
來自客戶端的資料

只要是外部來源資料都有可能是攻擊的源頭(XSSCSRF等…)

怎麼說呢?

您的網站允許使用 HTML 下評論,那將有可能受到 <script> 隱碼攻擊。

1
2
3
4
5
<p>This is good!!!</p>

<script>
window.location.href='https://hank7891.github.io/';
</script>

您的登入帳號密碼被如此輸入,即會遭受 SQL Injection

1
2
3
4
5
6
7
8
9
10
11
account: ' OR 1=1 #
password: 1234



$account = $_GET['account']; // '' OR 1=1 #
$password = $_GET['password'];

$query = "SELECT * FROM user WHERE account = '$account' AND password = '$password'";

產生指令: SELECT * FROM user WHERE account = '' OR 1=1 #AND password = '1234';

如此一來是不是令您毛骨悚然呢?

所以呢?

想要開發安全的 Web 應用程式,最重要的是正確掌握資料的用途狀態。

  • 一般正規化消毒→一般處理用資料

    • 例如:trim、magicquotesgpc、NUL、強制轉型、大小寫轉換、值域範圍檢查、白名單檢查、RegExp規則檢查

  • HTML輸出用消毒→HTML輸出用資料

    • 例如:htmlspecialchars, strip_tags, htmlentities

  • SQL輸出用消毒→SQL輸出用資料

    • 例如:mysqlrealescape_string, addslashes

最重要的是,這些用途的資料,應明確加以區別,不要混淆使用,一定要明確配合用途進行轉換。

所有資料的交換,都應使用一般處理用資料來進行,再依資料用途進行消毒,避免混用而造成遺忘或重複消毒。


Author

LinYoYo

Posted on

2020-11-27

Updated on

2020-12-01

Licensed under