2011-03-21 75 views
1

有人可以教我如何清理查询吗?我是否应该净化$ 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'"); 
+0

在这种情况下,“净化”意味着什么? – deceze 2011-03-21 05:36:39

+0

对PDO进行消毒以防止sql注入 – Abby 2011-03-21 05:37:26

回答

2

使用PDO和参数像这样绑定:

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

“消毒” 是不一定相同的 “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) . "'"); 
0

我建议使用的preg_match语句来限制字符类型。我也建议使用PHP PDO并准备SQL语句。我在手机上,或者我会张贴链接。

1

如果你想使用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'"); 


注:

:作为 Overview of the mysqli extension (报价)

什么是PHP的MySQL扩展?

这是原来的扩展 设计,让你开发PHP应用 与一个 MySQL数据库进行交互。
mysql扩展 提供了一个程序接口,并且是 ,旨在仅用于版本低于4.1.3的MySQL 版本。
这个 扩展可以使用版本 MySQL 4.1.3或更新版本,但不是全部的 最新的MySQL服务器功能将 可用。

注:如果你正在使用MySQL版本4.1.3或更高版本,强烈 建议您使用 的mysqli扩展来代替。


另一解决方案是停止使用mysql_* familly的功能,并切换到eiter mysqliPDO,使用预处理语句 - 它们是不是由mysql_*支持新功能之一:

这些,你将不得不逃避你的数据:它会自动绑定它们的值时完成。

+0

+1,但值得更多关注:) – Kevin 2011-03-21 05:55:34

0

使用PDO等现代数据库功能,并使用参数化查询。