簡體   English   中英

如何清理以下查詢?

[英]How do i sanitize the query below?

有人可以教我如何清理查詢嗎? 我也應該清理$ first_word嗎?

$question_text = sanitize($_POST['question_text']);

list($first_word) = explode(' ', $question_text);

$qStuff=mysql_query("SELECT c.field_name,t.category_name, d.domain_name FROM category_fields c, taxonomy_category t, taxonomy_domain d WHERE c.category_id = t.category_id AND t.domain_id = d.domain_id AND c.field_name = '$first_word'");

像這樣使用PDO和參數綁定:

$sql = "INSERT INTO table (field) VALUES (?)";
$sth = $dbh->prepare($sql); 
$sth->execute(array($value));

如果要繼續使用mysql_*函數,則必須使用mysql_real_escape_string()來轉義字符串數據:

$first_word_escaped = mysql_real_escape_string($first_word);
$qStuff=mysql_query("SELECT c.field_name,t.category_name, d.domain_name FROM category_fields c, taxonomy_category t, taxonomy_domain d 
     WHERE c.category_id = t.category_id 
           AND t.domain_id = d.domain_id 
           AND c.field_name = '$first_word_escaped'");


注意:如mysqli擴展概述 (引用)中所述

什么是PHP的MySQL擴展?

這是最初的擴展,旨在允許您開發與MySQL數據庫交互的PHP應用程序。
mysql擴展提供了一個過程接口,僅適用於4.1.3之前的MySQL版本。
該擴展可以與MySQL 4.1.3或更高版本一起使用,但並非所有最新的MySQL服務器功能都可用。

注意:如果使用的是MySQL 4.1.3或更高版本,則強烈建議您改用mysqli擴展名。


另一種解決方案是停止使用mysql_*函數,並使用Prepared Statements切換到eiter mysqliPDO ,這是mysql_*不支持的新功能之一:

有了它們,您將不得不轉義數據:綁定它們的值時,它將自動完成。

“清除”與“ SQL轉義”不一定相同。 要使用MySQL的SQL轉義值,請在要放入查詢中的值上使用mysql_real_escape_string

$first_word = current(explode(' ', $_POST['question_text']));

// sanitize $first_word here if you want to to remove certain things

mysql_query("SELECT … '" . mysql_real_escape_string($first_word) . "'");

我建議使用preg_match語句限制字符類型。 我還建議使用PHP PDO和准備好的SQL語句。 我正在使用手機,否則我會發布鏈接。

使用PDO等現代數據庫功能,並使用參數化查詢。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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