簡體   English   中英

使用php清理搜索查詢

[英]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安全格式。 在知道對數據執行的操作之前,您無法知道要運行哪個函數。

其他人提到了參數化查詢。 是的,這些都是盡可能安全,避免意外錯誤,但不容易在一夜之間切換。

不要試圖清理您的數據。

使用參數化查詢。

有關示例,請參見http://bobby-tables.com/php.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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM