Какой смысл этой строки кода? - PullRequest
3 голосов
/ 16 января 2009

Я нашел эту строку кода в плагине Virtuemart для Joomla в строке 2136 в administrator / components / com_virtuemart / classes / ps_product.php

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

Ответы [ 9 ]

9 голосов
/ 16 января 2009

Откажитесь от моего предыдущего ответа.

Причина, по которой этот 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()

4 голосов
/ 16 января 2009

Этот код кажется плохим способом заставить $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 являются только внутренней переменной или содержат уже проверенный контент, угрозы безопасности нет. Но все равно это плохой способ преобразования переменной в строку, потому что есть более очевидные и безопасные способы сделать это.

2 голосов
/ 16 января 2009

Я предполагаю, что это забавный способ заставить $ text_include_tax быть строкой, а не числом.

1 голос
/ 19 января 2012

Вам понадобится eval, чтобы получить налоговую ставку на выходе. Просто перенес это на новый сервер и по какой-то причине эта строка вызвала ошибку сервера. В качестве быстрого исправления я изменил его на:

//eval ("\$text_including_tax = \"$text_including_tax\";");
$text_including_tax = str_replace('$tax', $tax, $text_including_tax);
1 голос
/ 16 января 2009

Возможно, это попытка преобразовать переменную в строку? Просто предположение.

0 голосов
/ 14 декабря 2009

Я просматривал эту кодовую базу раньше. Это один из худших PHP, которые я видел.

Я полагаю, вы бы поступили таким образом, чтобы скрыть ошибки, которые вы сделали где-то еще.

0 голосов
/ 16 января 2009

Как уже отмечали другие, это код, написанный кем-то, кто не знает, что они делают на земле.

У меня также был быстрый просмотр кода, чтобы найти полное отсутствие экранирования текста при добавлении HTML / URI / и т. Д. все вместе. Вероятно, здесь есть много отверстий для инъекций, помимо проблем с eval, если вы можете потрудиться проверить его должным образом.

Я бы не хотел, чтобы этот код работал на моем сервере.

0 голосов
/ 16 января 2009

Нет, он делает это:

Скажите $text_including_tax = "плоский". Этот код оценивает строку:

$ flat = "flat";

Это не обязательно хорошо, но я однажды использовал такую ​​технику, чтобы высосать все переменные MySQL в массиве, например так:

    while ($row = mysql_fetch_assoc($result)) {
        $var = $row["Variable_name"];
        $$var = $row["Value"];
    }
0 голосов
/ 16 января 2009

Оценивает строку как код PHP.

Но похоже, что переменная равна себе? Weird.

...