1

我是 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;
4

5 回答 5

3

我不知道您提供的特定代码中是否存在安全漏洞 - 这取决于您的程序其他地方存在哪些其他验证,以及您认为什么是安全漏洞。但是您编码的方式意味着肯定存在安全漏洞让我们看看您的第一个查询:

$id = mysql_real_escape_string($qwe);

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

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

mysql_real_escape_string()调用 MySQL 的库函数 mysql_real_escape_string,该函数将反斜杠添加到以下字符:\x00\n\r\\'和."\x1a

我上面提到的字符串0 OR 1=1 --不包含任何这些字符,因此它根本不会受到mysql_real_escape_string. 代入 的值后$id,生成的 SQL 查询将如下所示:

SELECT *
FROM virtuemart_product_medias
WHERE virtuemart_product_id = 0 OR 1=1 -- LIMIT 1

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

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

有关的

于 2012-08-25T15:39:50.453 回答
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
于 2012-08-25T15:36:46.210 回答
1
  1. 首先,永远不要使用这些mysql_*功能。它们已被弃用,并且非常不鼓励依赖它们。使用MySQLiPDO

  2. 上面的查询可以重写为

    SELECT file_url_thumb FROM meadowmart_medias where practicemart_media_id = (SELECT meadowmart_media_id FROM practicemart_product_medias where practicemart_product_id = ' . $id . ' LIMIT 1) LIMIT 1

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

于 2012-08-25T15:39:09.920 回答
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如果它存在,那将始终为您提供and file_url_thumb

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

于 2012-08-25T15:44:11.417 回答
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
于 2012-08-25T15:45:28.880 回答