當前位置: 首頁> 最新文章列表> http_build_query 與filter_input 結合,生成符合安全要求的查詢字符串

http_build_query 與filter_input 結合,生成符合安全要求的查詢字符串

M66 2025-06-22

在PHP 開發中,構建URL 查詢字符串是一項非常常見的任務。 http_build_query()是一個強大的工具,可以快速地將數組轉換為URL 編碼的查詢字符串。但在實際應用中,我們通常需要從用戶輸入中獲取參數,為了安全地處理這些輸入, filter_input()是一個不可或缺的函數。將兩者結合使用,可以在保證效率的同時,大幅提升安全性,防止XSS 和注入等問題。

1. http_build_query()簡介

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>

2. filter_input()的作用

在處理用戶輸入時,不能直接使用$_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參數則被驗證為整數。

3. 將兩者結合使用

假設我們想基於用戶輸入構造一個重定向鏈接。我們希望從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 中。

4. 防禦XSS 與註入攻擊

用戶輸入的不可信內容可能包含惡意腳本,例如<script>alert(1)</script> 。通過filter_input()結合FILTER_SANITIZE_STRINGFILTER_VALIDATE_*系列,我們可以過濾掉潛在的危險字符或拒絕不符合預期的數據類型,從而防止這些攻擊的發生。

此外,通過只將驗證後的參數傳遞給http_build_query() ,進一步降低了注入風險。

5. 小結

使用http_build_query()構造查詢字符串雖然便捷,但前提必須是參數已被充分驗證。將其與filter_input()結合,不僅可以提升代碼質量,還可以有效提高Web 應用的安全性。特別是在需要拼接用戶輸入生成鏈接時,這種組合方式應成為開發者的標準實踐。