在PHP 開發中,構建URL 查詢字符串是一項非常常見的任務。 http_build_query()是一個強大的工具,可以快速地將數組轉換為URL 編碼的查詢字符串。但在實際應用中,我們通常需要從用戶輸入中獲取參數,為了安全地處理這些輸入, filter_input()是一個不可或缺的函數。將兩者結合使用,可以在保證效率的同時,大幅提升安全性,防止XSS 和注入等問題。
http_build_query()接收一個數組,並將其轉換為符合RFC 3986 編碼格式的URL 查詢字符串。例如:
<code> $params = [ 'search' => 'php', 'page' => 2 ]; $queryString = http_build_query($params);
// 輸出: search=php&page=2
</code>
該函數非常適合拼接查詢字符串,配合路徑使用可以快速構造跳轉鏈接:
<code> $url = 'https://m66.net/search.php?' . $queryString; </code>在處理用戶輸入時,不能直接使用$_GET或$_POST ,因為未經過濾的輸入可能攜帶惡意內容。 filter_input()提供了一個標準的接口來獲取並過濾輸入數據:
<code> $search = filter_input(INPUT_GET, 'search', FILTER_SANITIZE_STRING); $page = filter_input(INPUT_GET, 'page', FILTER_VALIDATE_INT); </code>上述代碼中, search參數被清洗為純文本, page參數則被驗證為整數。
假設我們想基於用戶輸入構造一個重定向鏈接。我們希望從URL 中提取參數,驗證和清洗後,再拼接為安全的查詢字符串。這時,我們可以這樣做:
<code> $params = []; $search = filter_input(INPUT_GET, 'search', FILTER_SANITIZE_STRING);
if ($search !== null && $search !== false) {
$params['search'] = $search;
}
$page = filter_input(INPUT_GET, 'page', FILTER_VALIDATE_INT);
if ($page !== null && $page !== false) {
$params['page'] = $page;
}
$queryString = http_build_query($params);
$redirectUrl = ' https://m66.net/results.php ?' . $queryString;
// 執行重定向(示例,不要在實際生產環境中未驗證直接跳轉)
header('Location: ' . $redirectUrl);
exit;
</code>
通過這種方式,我們確保只有合法、安全的參數才會被拼接進URL 中。
用戶輸入的不可信內容可能包含惡意腳本,例如<script>alert(1)</script> 。通過filter_input()結合FILTER_SANITIZE_STRING 、 FILTER_VALIDATE_*系列,我們可以過濾掉潛在的危險字符或拒絕不符合預期的數據類型,從而防止這些攻擊的發生。
此外,通過只將驗證後的參數傳遞給http_build_query() ,進一步降低了注入風險。
使用http_build_query()構造查詢字符串雖然便捷,但前提必須是參數已被充分驗證。將其與filter_input()結合,不僅可以提升代碼質量,還可以有效提高Web 應用的安全性。特別是在需要拼接用戶輸入生成鏈接時,這種組合方式應成為開發者的標準實踐。