3

このコード行は、administrator/components/com_virtuemart/classes/ps_product.php の 2136 行目の Joomla 用 Virtuemart プラグインで見つかりました。

eval ("\$text_including_tax = \"$text_including_tax\";");
4

9 に答える 9

9

私の以前の答えをスクラップします。

この eval() がここにある理由は、php eval docsに示されています

これが起こっていることです:

$text_including_tax = '$tax <a href="...">...</a>';

...

$tax = 10;

...

eval ("\$text_including_tax = \"$text_including_tax\";");

これの終わりには、次の$text_including_taxようになります。

"10 <a href="...">...</a>"

一重引用符$taxは、文字列の元の定義に含まれないようにします。これを使用eval()すると、強制的に文字列が再評価され、文字列に値が含ま$taxれます。

私はこの特定の方法のファンではありませんが、正しいです。代わりに使用することができますsprintf()

于 2009-01-16T02:10:58.277 に答える
4

$text_including_taxこのコードは、文字列にするのに悪い方法のようです。

これが悪い理由は、ユーザーが入力したデータを含めることができれば、ユーザーが任意のコードを実行できる可能性があるためです。 $text_including_tax

たとえば、$text_include_taxが等しいに設定されている場合:

"\"; readfile('/etc/passwd'); $_dummy = \"";

評価は次のようになります。

eval("$text_include_tax = \"\"; readfile('/etc/passwd'); $_dummy =\"\";");

悪意のあるユーザーにpasswdファイルのダンプを提供します。

これを行うためのより正しい方法は、変数を文字列にキャストすることです。

$text_include_tax = (string) $text_include_tax;

または単に:

$text_include_tax = "$text_include_tax";

データ$text_include_taxが内部変数のみであるか、すでに検証済みのコンテンツが含まれている場合、セキュリティリスクはありません。ただし、変数を文字列に変換する方法は、より明白で安全な方法があるため、依然として悪い方法です。

于 2009-01-16T01:52:00.060 に答える
2

$text_include_tax を数字ではなく文字列に強制するのは、ファンキーな方法だと思います。

于 2009-01-16T01:18:46.447 に答える
1

おそらく、変数を文字列としてキャストしようとしているのでしょうか? 推測です。

于 2009-01-16T01:20:15.367 に答える
1

税率を出力に入れるには eval が必要です。これを新しいサーバーに移動したところ、何らかの理由でこの行がサーバーエラーを引き起こしました。簡単な修正として、次のように変更しました。

//eval ("\$text_including_tax = \"$text_including_tax\";");
$text_including_tax = str_replace('$tax', $tax, $text_including_tax);
于 2012-01-19T18:09:17.873 に答える
0

他の人が指摘しているように、それは自分が何をしているのかわからない誰かによって書かれたコードです。

また、コードをざっと見て、HTML/URI などを配置するときにテキスト エスケープがまったくないことを確認しました。一緒。適切に監査することができれば、eval の問題に加えて、おそらく多くのインジェクション ホールがここで見つかるはずです。

このコードをサーバーで実行したくありません。

于 2009-01-16T02:21:09.050 に答える
0

文字列を PHP コードとして評価しています。

しかし、変数をそれ自体と等しくしているようですか?変。

于 2009-01-16T01:18:29.787 に答える
0

私は以前にそのコードベースを見てきました。これは、私が見た中で最悪の PHP の一部です。

どこかで犯した間違いを隠すために、そのようなことをするだろうと思います。

于 2009-12-14T14:30:53.337 に答える
-4

いいえ、それはこれをやっています:

$text_including_tax=「フラット」と言います。このコードは次の行を評価します。

$flat = "フラット";

必ずしも良いとは限りませんが、私は一度このような手法を使用して、次のような配列内のすべての MySQL 変数を吸い込みました。

    while ($row = mysql_fetch_assoc($result)) {
        $var = $row["Variable_name"];
        $$var = $row["Value"];
    }
于 2009-01-16T01:28:10.373 に答える