このコード行は、administrator/components/com_virtuemart/classes/ps_product.php の 2136 行目の Joomla 用 Virtuemart プラグインで見つかりました。
eval ("\$text_including_tax = \"$text_including_tax\";");
このコード行は、administrator/components/com_virtuemart/classes/ps_product.php の 2136 行目の Joomla 用 Virtuemart プラグインで見つかりました。
eval ("\$text_including_tax = \"$text_including_tax\";");
私の以前の答えをスクラップします。
この 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()
$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
が内部変数のみであるか、すでに検証済みのコンテンツが含まれている場合、セキュリティリスクはありません。ただし、変数を文字列に変換する方法は、より明白で安全な方法があるため、依然として悪い方法です。
$text_include_tax を数字ではなく文字列に強制するのは、ファンキーな方法だと思います。
おそらく、変数を文字列としてキャストしようとしているのでしょうか? 推測です。
税率を出力に入れるには eval が必要です。これを新しいサーバーに移動したところ、何らかの理由でこの行がサーバーエラーを引き起こしました。簡単な修正として、次のように変更しました。
//eval ("\$text_including_tax = \"$text_including_tax\";");
$text_including_tax = str_replace('$tax', $tax, $text_including_tax);
他の人が指摘しているように、それは自分が何をしているのかわからない誰かによって書かれたコードです。
また、コードをざっと見て、HTML/URI などを配置するときにテキスト エスケープがまったくないことを確認しました。一緒。適切に監査することができれば、eval の問題に加えて、おそらく多くのインジェクション ホールがここで見つかるはずです。
このコードをサーバーで実行したくありません。
文字列を PHP コードとして評価しています。
しかし、変数をそれ自体と等しくしているようですか?変。
私は以前にそのコードベースを見てきました。これは、私が見た中で最悪の PHP の一部です。
どこかで犯した間違いを隠すために、そのようなことをするだろうと思います。
いいえ、それはこれをやっています:
$text_including_tax
=「フラット」と言います。このコードは次の行を評価します。
$flat = "フラット";
必ずしも良いとは限りませんが、私は一度このような手法を使用して、次のような配列内のすべての MySQL 変数を吸い込みました。
while ($row = mysql_fetch_assoc($result)) {
$var = $row["Variable_name"];
$$var = $row["Value"];
}