Что является различием между новым Некоторые:: Класс и Некоторые:: класс-> новый () в Perl?

Параметрированный запрос И проверка ввода - это путь. Существует множество сценариев, в которых может произойти SQL-инъекция, хотя используется mysql_real_escape_string().

Эти примеры уязвимы для SQL-инъекции:

$offset = isset($_GET['o']) ? $_GET['o'] : 0;
$offset = mysql_real_escape_string($offset);
RunQuery("SELECT userid, username FROM sql_injection_test LIMIT $offset, 10");

или

$order = isset($_GET['o']) ? $_GET['o'] : 'userid';
$order = mysql_real_escape_string($order);
RunQuery("SELECT userid, username FROM sql_injection_test ORDER BY `$order`");

В обоих случаях вы не можете использовать ' для защиты инкапсуляции.

Источник : Непредвиденная инъекция SQL (при эвакуации Недостаточно)

27
задан Ether 17 September 2010 в 21:51
поделиться

4 ответа

Используя new Some::Class назван "косвенным" вызовом метода, и это плохо, потому что это вводит некоторую неоднозначность в синтаксис.

Одна причина, которую это может привести к сбою, состоит в том, если у Вас есть массив или хеш объектов. Вы могли бы ожидать

dosomethingwith $hashref->{obj}

быть равными [1 110]

$hashref->{obj}->dosomethingwith();

, но это на самом деле анализирует как:

$hashref->dosomethingwith->{obj}

, который, вероятно, не является тем, что Вы хотели.

Другая проблема состоит в том, если, оказывается, существует функция в Вашем пакете с тем же именем как метод, Вы пытаетесь звонить. Например, что, если некоторый модуль, что Вы use 'd экспортировали функцию, вызванную dosomethingwith? В этом случае, dosomethingwith $object неоднозначно, и может привести к озадачивающим ошибкам.

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

26
ответ дан friedo 28 November 2019 в 05:12
поделиться

См. Синтаксис Косвенного дополнения в perlobj документации для объяснения ее ловушек. ответ freido покрытия один из них (хотя я склонен избегать этого с явным parens вокруг моих вызовов функции).

Larry однажды шутил, что это было там, чтобы заставить C++ чувствовать себя счастливым [приблизительно 113], и хотя люди скажут Вам не когда-либо использовать его, Вы, вероятно, делаете все это время. Рассмотрите это:

print FH "Some message";

Вы когда-либо задавались вопросом мой, там не была никакая запятая после дескриптора файла? И нет никакой запятой после имени класса в нотации косвенного дополнения? Это - то, что продолжается здесь. Вы могли переписать это как вызов метода на печати:

FH->print( "Some message" );

Вы, возможно, испытали некоторую странность в print, если Вы делаете это неправильно. При помещении запятой после того, как явный дескриптор файла превращает его в аргумент:

print FH, "some message";     # GLOB(0xDEADBEEF)some message

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

21
ответ дан Community 28 November 2019 в 05:12
поделиться

Синтаксис косвенного дополнения осужден на серьезных основаниях, но это не имеет никакого отношения к конструкторам. Вы почти никогда не собираетесь иметь новое () функция в пакете вызова. Скорее необходимо ли использовать Пакет-> новый () для два другого (лучше?) причины:

  1. , Поскольку Вы сказали, все другие методы класса берут Пакет формы-> метод (), таким образом, непротиворечивость является Хорошей Вещью

  2. , Если Вы предоставляете аргументы конструктору, или Вы берете результат конструктора и сразу вызывающих методов для него (если, например, Вы не заботитесь об имении в наличии объекта), более просто сказать, например,

$foo = Foo->new(type => 'bar', style => 'baz');
Bar->new->do_stuff;

, чем [1 110]

$foo = new Foo(type => 'bar', style => 'baz');
(new Bar)->do_stuff;
4
ответ дан Sam Kington 28 November 2019 в 05:12
поделиться

Другая проблема состоит в том, что new Some::Class происходит во время выполнения. Если существует ошибка, и Вы тестирующий никогда не переходите к этому оператору, Вы никогда не знаете это, пока этого не происходит в производстве. Лучше использовать Some::Class->new, если Вы не делаете динамическое программирование.

-3
ответ дан 28 November 2019 в 05:12
поделиться
Другие вопросы по тегам:

Похожие вопросы: