有没有更有效的方法来编写这个MySQL查询?

时间:2012-08-25 15:30:53

标签: mysql database joomla virtuemart

我是mysql的新手,我设法将它们拼凑在一起以获得我想要的结果。可以更好地编码吗?有安全隐患吗?它在php中输出。

$qwe = $product->virtuemart_product_id;    
$id = mysql_real_escape_string($qwe);

$result = mysql_query('SELECT * FROM virtuemart_product_medias where virtuemart_product_id = ' . $id . ' LIMIT 1');

$row = mysql_fetch_assoc($result);    
$matched = $row['virtuemart_media_id'];

$result2 = mysql_query('SELECT * FROM virtuemart_medias where virtuemart_media_id = ' . $matched . ' LIMIT 1');

$row2 = mysql_fetch_assoc($result2);    
$matched2 = $row2['file_url_thumb'];

echo $matched2;

5 个答案:

答案 0 :(得分:3)

我不知道您提供的特定代码中是否存在安全漏洞 - 这取决于程序中其他位置存在的其他验证,以及您认为是安全漏洞的内容。但是你编码的方式意味着肯定可以成为安全漏洞。让我们看看你的第一个问题:

$id = mysql_real_escape_string($qwe);

$result = mysql_query('SELECT *
    FROM virtuemart_product_medias
    WHERE virtuemart_product_id = ' . $id . ' LIMIT 1');

想象一下,如果$qwe是字符串0 OR 1=1 --mysql_real_escape_string仅转义某些字符,例如引号和反斜杠。

  

mysql_real_escape_string()调用MySQL的库函数mysql_real_escape_string,它将反斜杠添加到以下字符:\x00\n\r\\,{{1} },'"

我上面提到的字符串\x1a不包含任何这些字符,因此它不会受0 OR 1=1 --影响。在替换mysql_real_escape_string的值后,生成的SQL查询将如下所示:

$id

如您所见,这将返回所有行。

长话短说:使用PDO和参数化查询

相关

答案 1 :(得分:1)

使用一个查询而不是两个查询,并仅选择您正在使用的字段,如下所示:

SELECT `file_url_thumb` FROM virtuemart_medias where virtuemart_media_id = (SELECT `virtuemart_media_id` FROM virtuemart_product_medias where virtuemart_product_id = ' . $id . ' LIMIT 1) LIMIT 1

答案 2 :(得分:1)

  1. 首先,永远不要使用mysql_*函数。它们已被弃用,并且非常不鼓励依赖它们。使用MySQLiPDO

  2. 上述查询可以重写为

    SELECT file_url_thumb FROM virtuemart_medias其中virtuemart_media_id =(SELECT virtuemart_media_id FROM virtuemart_product_medias其中virtuemart_product_id ='。$ id。'LIMIT 1)LIMIT 1

  3. 永远不要做SELECT *。只在查询中包含您在代码中需要的字段。

答案 3 :(得分:0)

您可以随时使用加入;

SELECT a.virtuemart_media_id, b.file_url_thumb 
FROM virtuemart_product_medias a
LEFT JOIN virtuemart_medias b
  ON a.virtuemart_media_id = b.virtuemart_media_id
WHERE virtuemart_product_id = $id
LIMIT 1

这将永远为您提供virtuemart_media_id,如果它存在file_url_thumb

您的查询也存在问题,mysql_real_escape_string仅转义字符串,因为您没有在查询中引用$ id,因此不会将其作为字符串处理逃避不会帮助你。正如其他回复指出的那样,你应该使用mysqli或PDO。

答案 4 :(得分:0)

这个怎么样:

SELECT a.file_url_thumb 
FROM virtuemart_medias a 
LEFT JOIN virtuemart_product_medias b on a.virtuemart_media_id=b.irtuemart_media_id 
WHERE a.virtuemart_product_id=' . $id . ' LIMIT 1