2010-01-05 155 views

回答

5

正是出于这种情况下的安全,但更普遍的做法,我宁愿结合使用mysql_real_escape_string型铸造:

$query = "SELECT * FROM products WHERE product_id='" . (int)mysql_real_escape_string($_GET['id']) . "'"; 

在最坏的情况下,这将导致0和意志也逃脱所有恶意输入。 mysql_real_escape_string可用于各种数据,以确保查询的安全性,从而使其成为所有逃生/卫生功能中最通用的。

没有去尽可能使用准备好的语句,你可以用sprintf来创建你的SQL和自动处理的类型转换:

$query = sprintf("SELECT * FROM products WHERE product_id = '%d'", mysql_real_escape_string($_GET['id'])); 

请参阅从PHP手册sprintf条目的语法。

,如果你使用array_map逃避所有$_GET$_POST变量变得更加简单,那么你可以将它们用作是:

$_GET = array_map('mysql_real_escape_string', $_GET); 
$_POST = array_map('mysql_real_escape_string', $_POST); 

$query = sprintf("SELECT * FROM products WHERE product_id = '%d'", $_GET['id']); 
+0

+1,也有更好的支持,因为filter_var只适用于PHP 5.2或更高版本。 – 2010-01-05 09:51:27

+0

谢谢你的彻底解答。 – Evenz495 2010-01-05 10:37:18

1

我通常只使用intval

$product_id = intval($_GET['id']); 
$query = "SELECT * FROM products WHERE product_id='" . $product_id . "'"; 
0

可能这对你有用......!

$query=query("SELECT * FROM products WHERE product_id= ". escape_string($_GET['id']) . " "); 
+1

尽管此代码片段可能会解决问题,但[包括解释](http://meta.stackexchange.com/questions/114762/explaining-entirely-code-based-answers)确实有助于提高帖子的质量。请记住,您将来会为读者回答问题,而这些人可能不知道您的代码建议的原因。 – 2017-02-21 07:05:27