[英]Sanitize search query with php
當用戶在我的網站上搜索時,我會獲取get請求並對其進行mysql查詢。 我的原始代碼看起來像這樣: $q = $_GET['q'];
。
現在urldecode正在為我添加斜杠,但我決定嘗試使用santize字符串過濾器過濾器。
當我使用$q = urldecode($_GET['q']);
時,這是我的sql $q = urldecode($_GET['q']);
:
SELECT * FROM item WHERE title LIKE '%you\'re%' OR description LIKE '%you\'re%' ORDER BY date DESC
當我使用時,這是我的sql: q = filter_var(urldecode($_GET['q']), FILTER_SANITIZE_STRING);
SELECT * FROM item WHERE title LIKE '%you\'re%' OR description LIKE '%you\'re%' ORDER BY date DESC
sql是完全一樣的,但我得到不同的結果,我不知道為什么? 只是使用urldecode從數據庫返回正確的結果,但filter_var什么都不返回(即使sql是相同的)。
我想我的問題是,清理和搜索查詢字符串的最佳方法是什么?
Urldecode是錯誤的函數 - PHP將自動解碼$ _GET中的任何變量,因此您不需要,而且PHP手冊說這樣做是危險的 。
人們經常談論消毒輸入,但我更願意考慮消毒輸出。
例如,清理輸入將是:
$q = urldecode($_GET['q']);
$sql = "SELECT * FROM item WHERE title LIKE '%{$q}%'"
// later
echo "These items match '$q'";
消毒產量:
$sql = "SELECT * FROM item WHERE title LIKE '%".mysql_real_escape_string($_GET['q'])."%'"
// later
echo "These items match '".htmlspecialchars($_GET['q']).'";
請注意,在后一個示例中,我使用了不同的函數 - 一個用於將數據轉換為mysql安全格式,另一個用於將數據轉換為HTML安全格式。 在知道對數據執行的操作之前,您無法知道要運行哪個函數。
其他人提到了參數化查詢。 是的,這些都是盡可能安全,避免意外錯誤,但不容易在一夜之間切換。
最好的變種是使用php Sanitize過濾器http://php.net/manual/en/filter.filters.sanitize.php ,
我會做:
$q = mysql_real_escape_string( stripslashes( $_GET['q'] ) );
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.