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');

$qweが文字列の場合を想像してみてください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

次のように、2つではなく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_*関数を使用しないでください。それらは非推奨であり、それらに依存することは非常に推奨されていません。MySQLiまたはPDOのいずれかを使用する

  2. 上記のクエリは次のように書き直すことができます

    SELECT file_url_thumb FROM virtuemart_medias where virtuemart_media_id =(SELECT virtuemart_media_id FROM virtuemart_product_medias wherevirtuemart_product_id='。$id。'LIMIT1)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そして、それが存在する場合file_url_thumb

クエリにも問題があり、文字列mysql_real_escape_stringをエスケープするだけです。クエリで$ 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 に答える