Параметрированный запрос И проверка ввода - это путь. Существует множество сценариев, в которых может произойти 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 (при эвакуации Недостаточно)
Используя new Some::Class
назван "косвенным" вызовом метода, и это плохо, потому что это вводит некоторую неоднозначность в синтаксис.
Одна причина, которую это может привести к сбою, состоит в том, если у Вас есть массив или хеш объектов. Вы могли бы ожидать
dosomethingwith $hashref->{obj}
быть равными [1 110]
$hashref->{obj}->dosomethingwith();
, но это на самом деле анализирует как:
$hashref->dosomethingwith->{obj}
, который, вероятно, не является тем, что Вы хотели.
Другая проблема состоит в том, если, оказывается, существует функция в Вашем пакете с тем же именем как метод, Вы пытаетесь звонить. Например, что, если некоторый модуль, что Вы use
'd экспортировали функцию, вызванную dosomethingwith
? В этом случае, dosomethingwith $object
неоднозначно, и может привести к озадачивающим ошибкам.
Используя ->
синтаксис исключительно устраняет эти проблемы, потому что метод и на что Вы хотите, чтобы метод работал, является всегда четким компилятору.
См. Синтаксис Косвенного дополнения в perlobj документации для объяснения ее ловушек. ответ freido покрытия один из них (хотя я склонен избегать этого с явным parens вокруг моих вызовов функции).
Larry однажды шутил, что это было там, чтобы заставить C++ чувствовать себя счастливым [приблизительно 113], и хотя люди скажут Вам не когда-либо использовать его, Вы, вероятно, делаете все это время. Рассмотрите это:
print FH "Some message";
Вы когда-либо задавались вопросом мой, там не была никакая запятая после дескриптора файла? И нет никакой запятой после имени класса в нотации косвенного дополнения? Это - то, что продолжается здесь. Вы могли переписать это как вызов метода на печати:
FH->print( "Some message" );
Вы, возможно, испытали некоторую странность в print
, если Вы делаете это неправильно. При помещении запятой после того, как явный дескриптор файла превращает его в аргумент:
print FH, "some message"; # GLOB(0xDEADBEEF)some message
К сожалению, у нас есть эта глупость в Perl. Не все, что вошло в синтаксис, было лучшей идеей, но это - то, что происходит, когда Вы вытягиваете из такого количества источников для вдохновения. Некоторые идеи должны быть плохими.
Синтаксис косвенного дополнения осужден на серьезных основаниях, но это не имеет никакого отношения к конструкторам. Вы почти никогда не собираетесь иметь новое () функция в пакете вызова. Скорее необходимо ли использовать Пакет-> новый () для два другого (лучше?) причины:
, Поскольку Вы сказали, все другие методы класса берут Пакет формы-> метод (), таким образом, непротиворечивость является Хорошей Вещью
, Если Вы предоставляете аргументы конструктору, или Вы берете результат конструктора и сразу вызывающих методов для него (если, например, Вы не заботитесь об имении в наличии объекта), более просто сказать, например,
$foo = Foo->new(type => 'bar', style => 'baz'); Bar->new->do_stuff;
, чем [1 110]
$foo = new Foo(type => 'bar', style => 'baz'); (new Bar)->do_stuff;
Другая проблема состоит в том, что new Some::Class
происходит во время выполнения. Если существует ошибка, и Вы тестирующий никогда не переходите к этому оператору, Вы никогда не знаете это, пока этого не происходит в производстве. Лучше использовать Some::Class->new
, если Вы не делаете динамическое программирование.