2015-03-09 2 views
1

У меня есть переключатель со многими корпусами. Все они работают по одной схеме: case -> с тем же именем и поместите результат в результат var.Корпуса выключателей общего назначения

switch ($_POST["field"]) { 
    case "keyword1": $result = keyword1(); break; 
    case "keyword2": $result = keyword2(); break; 
    case "keyword3": $result = keyword3(); break; 
} 

Можно ли это сделать с помощью общего кода или я должен сделать это - как показано выше - для каждого случая вручную?

ответ

1

Если имена так же, как это, а также имена функций вы могли бы сделать что-то вроде этого:

$result = $_POST["field"](); 

И проверить, если функция существует или отозваны вы можете использовать: is_callable() и function_exists().

Кроме того, чтобы пользователь не мог вызывать каждую функцию, вы могли бы просто создать белый список, в который будут включены имена функций, которые пользователь может вызвать.

+2

OMG, представьте себе возможности внедрения кода. –

+0

Вы имеете в виду 'if (function_exists (is_callable ($ _ POST ['field']))) $ antwort = $ _POST ['field']();'? – user3142695

+0

@ user3142695 Еще как: 'if (function_exists ($ _ POST ['field']) && is_callable ($ _ POST ['field']))' Также не забудьте проверить его с помощью белого списка, который функционирует пользователем. – Rizier123

1

Вы можете использовать имя переменной, но убедитесь, что вы проверяете формат значения $ _POST перед его использованием, иначе вы создаете утечку безопасности.

$functionName = $_POST['field']; 

if(!preg_match("/^keyword\d+$/", $functionName) { 
    die('Invalid value for POSTDATA entry "field"'); 
} 

$functionName(); 
1

call_user_func() было бы намного приятнее. Проверьте это в руководстве: http://php.net/manual/en/function.call-user-func.php

Но все-таки вы должны фильтровать входящие значения или Ваш код будет очень небезопасно ... Например, Вы можете предоставить множество допустимых функций и проверить, если данный $_POST['field'] значение в этом массиве.

0

Вы можете использовать call_user_func с белым списком имен функций:

$funcs = ['func1','funct2'...]; 
if(in_array($_POST['key'], $funcs) 
    $result = call_user_func($_POST['key']); 

Хотя я склонен думать, дело переключателя более читаемый

Смежные вопросы