отсутствие default в switch

417
05 февраля 2017, 14:30

Я сделал калькулятор

<?php error_reporting(-1);
ini_set('display_errors', 'On');
header('Content-Type: text/html; charset=utf-8');
?>  
<form action="" method="POST" style="border: 1px solid red; width: 400px; float: left;">
    <div style="width: 300px;">Введите число 1 <input type="text" name="number1"></div>
    <div style="width: 300px;">Введите число 2 <input type="text" name="number2"></div>
    <div class="operator" style="padding: 10px 0;">
        Выберите знак оператора<br>
        <label>плюс <input type="radio" name="op" value="+"></label> |
        <label>минус <input type="radio" name="op" value="-"></label> |
        <label>умножить <input type="radio" name="op" value="*"></label> |
        <label>разделить <input type="radio" name="op" value="/"></label> |
    </div>
    <input type="submit" name="submit" value="Получить результат">
</form>
<div class="result" style="width: 200px; height: 100px; border: 1px solid red; float: left;">
<span style="display: block; padding: 10px 0;">Результат</span>
<?php
function calc($num1,$num2,$action = '+'){
    if(is_numeric($num1) && is_numeric($num2)){
        switch($action){
            case '+':
                return $num1 . ' + '. $num2 . ' = ' . ($num1 + $num2);
                break;
            case '-':
                return $num1 . ' - '. $num2 . ' = ' . ($num1 - $num2);
                break;
            case '*':
                return $num1 . ' * '. $num2 . ' = ' . ($num1 * $num2);
                break;
            case '/':
                if($num2 == 0){
                    return 'На 0 делить нельзя';
                }
                else{
                    return $num1 . ' / '. $num2 . ' = ' . ($num1 / $num2);
                }
                break;
            }   
        }
    else{
        return 'Введите число';
    }
}
if(isset($_POST['number1'], $_POST['number2'])){
    if(isset($_POST['op'])){
        echo calc($_POST['number1'], $_POST['number2'], $_POST['op']);
    }
    else{
        echo calc($_POST['number1'], $_POST['number2']);
    }
}
?>
</div>

И мне говорят, то, что не указал default из-за этого есть уязвимости для хакеров.

Цитирую: Допустим я отправлю action="aaa" и произойдет логическая ошибка, так как у тебя отсутствует default. default стоит добавлять, чтобы предусмотреть разное поведение. Твой вопрос: зачем хакеры подделывают формы? Ну для того, чтобы взламывать сайты. Как раз default бы это исправил

А что можно написать в default, я не знаю.

////////////////////////////////

Ещё мне пишут

В данном случае отсутствие default приводит к тому, что функция ничего не возвращает, то есть возвращает NULL. И ты делаешь echo NULL, а это нехорошо.

//////////////////////////////////////////

Ну так если передавать action="blabla" у тебя необработанная ситуация!

тут вот какая ситуация, когда ты пишешь код, то всегда ты должен контроллировать варианты, что возвращает функция. Либо это текст ошибки, либо число, либо NULL, NULL возвращается когда передаёшь blabla.

1) Когда ты обрабатываешь событие передачи 'blabla' ты понимаешь, что любой человек включая тебя может отредактировать любую форму и отправить желаемые данные 2) Обрабатывая подобное поведение ты себя сразу учишь грамотно писать код, когда у тебя под контролем есть все варианты поведения скрипта.

/////////////////////////

Но я не понимаю, как она может возвращать NULL, если результат выводится?

Я всё равно не понял, как сделать правильно.

Ну вот в конце напишу

default: return "Некорректный ввод";

И что дальше?

Answer 1

Вообще, как я вижу, ничего страшного не случится. Я хоть и не мастер php, но все же. Однако существуют стандарты оформления кода (PSR-0, PSR-1, PSR-2, PSR-3, PSR-4) - почитайте. Они есть и на русском. Так вот, касательно switch указано следующее:

  • При наличии соответствующего комментария допускаются блоки, передающие управление вниз;
  • Рекомендуется всегда ставить блок default, который бы сообщал об ошибке в случаях, когда попадание на него должно быть исключено, но тем не менее имело место;
  • Если вам нужно создать какие-либо переменные, то весь соответствующий код ставьте внутри блоков case.

Пример:

switch (...)
{
    case 1:
        ...
      // УПРАВЛЕНИЕ ПЕРЕДАЁТСЯ ВНИЗ
    case 2:
    {
        $v = get_week_number();
         ...
    }
    break;
    default:
}

Источник https://www.opennet.ru/docs/RUS/php_code_standart/format.switch.html Но лучше гуглить именно PSR-0, PSR-1, PSR-2, PSR-3, PSR-4.

Таким образом, полагаю, что в каких-то случаях это от чего-то защитит (хоть и сложно придумать такую ситуацию в конкретном случае). Понимаю, что хочется вообще полностью всё понять и иметь полное представление.

Гораздо большую опасность представляет приём переменных из формы без защиты от SQL инъекций (но это тоже не для этого случая).

Answer 2

Вам при неизвестном действии нужно возвращать num1, т.е с логики калькулятора вводное значение так и осталось неизменным. При default - return $num1;

READ ALSO
Как определить нажатие одной формы из нескольких, но при этом использовать 1 функцию(общую для всех форм)

Как определить нажатие одной формы из нескольких, но при этом использовать 1 функцию(общую для всех форм)

Как определить нажатие и запустить функцию но при этом использовать одну функцию для множество повторяющихся формСейчас поймете о чем я

429
Белый экран при развертке на полную

Белый экран при развертке на полную

Когда я использую в ckeditor кнопку раскрыть на весь экран то у меня страница становится белой и только справа вверху есть пара ссылок и все, для...

550
как вывести правильно ссылку ng-click или ui-sref

как вывести правильно ссылку ng-click или ui-sref

Есть функция она работает с сервисами, но в другом месте мне нужно вывести конкретный сервисего айди _configs

546
Как добавлять на свою карту JavaScript плагины?

Как добавлять на свою карту JavaScript плагины?

Добрый день,допустим я имею стандартный каркас google Maps javascript API3

453