2015-02-24 19 views
-2

我希望用户能够通过提供HTML中的值来执行PHP中的if语句当前我被困在这里如何处理$expression如果用户输入形式例如“2 + 3 = 5”?如果前端的HTML表单中的IF语句参数通过,会传递?

<form method="post" action="test.php"> 
    Evaluate <input type="text" required="required" name="expression" /><br /> 
    True <input type="text" required="required" name="returnOnTrue" /><br /> 
    False <input type="text" required="required" name="returnOnFalse" /><br /> 
    <input type="submit" name="submit" value="Run" /> 
</form> 

然后在PHP中我有一些像

function if_statement($expression, $true, $false) { 

    try { 

     if ( !empty($expression) 
      && !empty($true) && ctype_digit($true) 
      && !empty($false) && ctype_digit($false) 
     ) { 

      if ($expression) { 
       return $true; 
      } else { 
       return $false; 
      } 

     } 

     return; 

    } catch (Exception $e) { 
     return; 
    } 

} 

$expression = $POST["expression"]; 
$onTrue  = $POST["returnOnTrue"]; 
$onFalse = $POST["returnOnFalse"]; 

echo call_user_func_array("if_statement", array($expression, $onTrue, $onFalse)); 

有使IF语句拿用户输入,以避免注射和/或致命错误其它更安全的方式。

+1

你可以控制“表达式”的长度 – Hann 2015-02-24 17:20:38

+0

正如Hann所说,你需要验证你的输入,关键字在那里;) – britter 2015-02-24 17:41:30

+0

你可以详细了解我如何验证它,这几乎是我的问题。我应该使用变量,正则表达式等? – 2015-02-24 18:01:20

回答

0

我会说你需要逐字解析输入字符来确定他们正在检查的内容。如果不使用eval()或数据库交互,就不会有真正的安全问题。如果总是期待相同类型的简单表达式,那么可以使用正则表达式来获取部分而不是解析。如果你想确保零件的数字,你可以强制转换为整数像

$expression = (int)$_POST['expression']; 

顺便说一句,如果这样做,如果($表达式),它应始终除非输入为空返回true,或小于1的数字(0,0.5,-7)。所以需要一些解析或正则表达式。

+0

问题的一部分是如何避免如果($表达式)始终显示为真,并对其​​进行评估。我想我应该评估外部的$表达式,如果只是给予表达式的结果,我认为这是更安全的。 我也希望允许用户使用像这样的表达式'不只是数字。 – 2015-02-24 17:53:18

+0

要允许更多的指令,比如stristr,你需要使用eval($ expression)(非常不安全),或者解析函数的输入,如果不是很多函数,这些函数不应该很难。 – Xeridea 2015-02-24 20:44:05