2011-05-12 54 views
1

这是使用mysql_real_escape_string的正确方法吗?我用$GET但一个朋友告诉我,使之与real_escape_string更安全:我正在使用mysql_real_escape_string吗?

$id = intval($_GET['id']); 

$result = mysql_query("SELECT * 
         FROM products 
         WHERE id = $id") or die("err0r"); 

if(!$result) mysql_real_escape_string($id); { 
+0

忘记mysql_real_escape_string并只使用参数化查询。 – Kibbee 2011-05-12 23:38:44

回答

6

不,您通常使用mysql_real_escape_string准备在查询中使用的变量,但在你的情况:

  1. 你已经使用intval;
  2. 你在错误的地方使用它。

在你的例子中你不需要它。

+0

好吧,mysql_real_escape_string是完全不必要的,除非它是一个字符串?当id是数字时,intval是否有窍门? – MstrQKN 2011-05-12 23:36:14

+0

@Jaoza Media正好。 – jeroen 2011-05-12 23:36:44

1

NO,你需要quering之前转义

$id = intval($_GET['id']); 

$result = mysql_query("SELECT * 
         FROM products 
         WHERE id = '" . mysql_real_escape_string($id) . "'") or die("err0r"); 

if(!$result) { 
} 
1

用途:

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

$result = mysql_query($query) or die("err0r"); 

您使用mysql_real_escape_string之前值在查询中使用,否则你无法处理SQL注入攻击。

2

不,这完全是错误的,我不明白你打算做什么。

mysql_real_escape_string的目的是为了避免SQL injection,这是网站最大的安全风险之一。它会阻止您的用户提供以恶意方式操纵SQL的输入。例如:

$sql = "SELECT FROM users WHERE username = '" . $_GET['username'] . "'"; 

如果我把lonesomeday' or 'a' = 'a$_GET['username'],查询变得

SELECT FROM users WHERE username = 'lonesomeday' or 'a' = 'a' 

,显然任意的SQL然后可以执行。 mysql_real_escape_string转义不安全字符(例如该例中的'),以便它们不能以这种方式使用。

$sql = "SELECT FROM users WHERE username = '" . mysql_real_escape_string($_GET['username']) . "'"; 
// SELECT FROM users WHERE username = 'lonesomeday\' or \'a\' = \'a' 

引号现在已被转义。所以查询不能被用来做恶事。

综上所述,在这种情况下,intval可以满足您的所有需求。它还确保没有任何非整数可以在$id之内,所以您的代码在SQL注入中是安全的。

+0

mysql_real_escape_string的目的是为了使输入符合MySQL DB特殊字符,并且有人可以通过注入准备好的语句来调整查询的事实是'邪恶的头脑')+1注意到这一点的结果。 – Igor 2011-05-12 23:47:55

1

在将其粘贴到查询中之前(在它与数据库进行交互以避免注入)之前,您希望将其转义。

// check if your $_GET is not empty otherwise you 
// will run into "undefined variable" 
if(!empty($_GET['id'])){ 
    $id = intval($_GET['id']); 

    // to simplify you can escape here, 
    // or to be a bit more complex, you can escape in the query line. 
    $id = mysql_real_escape_string($id); 

    $result = mysql_query("SELECT * 
         FROM products 
         WHERE id = '$id'") or die("err0r"); 
} 
else 
    print 'No ID'; 
+0

什么是36字节的浪费。 – 2013-03-29 21:04:39