<?php
$var_a = 'var_b';
$$var_a = 'test'; // 等同於 $var_b = 'test';
echo $var_b; // 輸出 test
<?php
foreach (['_COOKIE', '_POST', '_GET'] as $_request) {
foreach ($$_request as $_key => $_value) {
// 略過以 _ 開頭的鍵(防止覆蓋系統變數)
if ($_key[0] !== '_') {
$$_key = addslashes($_value); // 簡單過濾
}
}
}
// 現在可以直接使用 $name, $pwd 等變數
// 對應網址:test.php?name=John&pwd=secret
echo $name; // John
echo $pwd; // secret
| 風險 | 說明 | 緩解 |
|---|---|---|
| 變數覆蓋 | 惡意傳入 _SESSION[admin]=1 覆蓋權限判斷 | 略過 _ 開頭鍵、白名單機制 |
| SQL Injection | addslashes() 不足以防禦所有注入 | 改用 Prepared Statement |
| XSS | 直接輸出未跳脫變數 | 輸出時 htmlspecialchars() |
| 命名空間汙染 | 大量變數汙染區域作用域 | 封裝在函式/類別中 |
<?php
// 輸入過濾器類別
class Input {
public static function get($key, $default = null, $filter = FILTER_SANITIZE_STRING) {
return filter_input(INPUT_GET, $key, $filter) ?? $default;
}
public static function post($key, $default = null, $filter = FILTER_SANITIZE_STRING) {
return filter_input(INPUT_POST, $key, $filter) ?? $default;
}
public static function request($key, $default = null) {
return $_REQUEST[$key] ?? $default; // 不建議常用
}
}
// 使用
$name = Input::get('name', '', FILTER_SANITIZE_FULL_SPECIAL_CHARS);
$age = Input::post('age', 0, FILTER_VALIDATE_INT);
$email = Input::post('email', '', FILTER_VALIDATE_EMAIL);
$request->input('name'), $request->validated()$request->get('name'), 表單元件自動綁定驗證Yii::$app->request->get('name'), 模型 load() + validate()$request->getParsedBody()['name']變數變數技巧雖簡潔,但不建議在現代專案使用。顯式存取、輸入驗證、型別轉換才是可維護、安全的寫法。僅適用於快速原型、舊代碼維護或深度理解 PHP 變數機制的教學場合。