繁体   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