Почему большие рамки игнорируют предварительные проверки? - PullRequest
4 голосов
/ 26 мая 2011

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

public function sum($input1, $input2) {
if (!is_int($input1)) throw new Exception('Input must be a integer');

Однако после просмотра исходного кода Zend / Codeigniter я не вижу таких проверок очень часто. Есть ли причина для этого?

Ответы [ 3 ]

3 голосов
/ 26 мая 2011

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

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

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

$username=get('username', 'string');
$a=get('a', 'int');
...

$ _ ЗАПРОС и тому подобное никогда не должны использоваться (или даже быть доступны) напрямую.

Кроме того, при выводе HTML вы всегда должны использовать это:

echo html($username); // replaces '<' with '&lt;' - uses htmlentities

Чтобы избежать атак с использованием SQL-инъекций, можно использовать MeekroDB, но, к сожалению, это очень ограничивает (только MySQL, только одна БД, ...). У него хороший API, который способствует безопасности, поэтому я бы порекомендовал проверить его. Для себя я создал небольшую библиотеку БД, основанную на PDO и использующую подготовленные операторы. YMMV.

2 голосов
/ 26 мая 2011

Указывать такие строгие предварительные условия ни в коем случае не обязательно и не нужно для динамического типизированного языка.

$sum = sum("1", "2");

Почему это нужно запретить? Дополнительно, если вы выбрасываете исключение, каждый пытается его избежать. Это значит, что он проверит и разыграет себя

function sum ($a, $b) {
  if (!is_int($a)) throw new Exception('Input must be a integer');
  if (!is_int($b)) throw new Exception('Input must be a integer');
  return $a + $b;
}

if (!is_int($value1)) { $value1 = (int) $value1; }
if (!is_int($value2)) { $value2 = (int) $value2; }
$sum = sum($value1, $value2);

Каждое is_int() происходит несколько раз, чтобы избежать ненужных исключений.

Этого достаточно для проверки значений, когда вы их получаете, не во всем приложении.

0 голосов
/ 26 мая 2011

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

public function preDispatch(Zend_Request_Http $request)

, что достаточно хорошо.Также в критических местах, где требуются целые / строки, есть некоторые проверки работоспособности.Но в основном не в виде is_string(), а скорее как isValidLocale(), который вызывает некоторый другой класс для проверки правильности.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...