我是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;
答案 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)
答案 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