验证表单数据是否为当前的选择输入选项


Validate if form data is a present select input option

我有一个选择输入:

<label for="gender">Gender:</label>
<select id="gender" name="gender">
    <option value="Male">Male</option>
    <option value="Female">Female</option>
</select>

如何验证提交的数据是否属于选择输入?

我试过:

<?php
if ($_POST['gender'] !== 'Male' || $_POST['gender'] !== 'Female') {
      // perform redirect
}

是一种更清洁的方法

$options = array( 'Male', 'Female' ); 
if( !in_array( $_POST['gender'], $options  ) )  // if Male or Female are not in $_POST 
    // redirect 
if ($_POST['gender'] != 'Male' && $_POST['gender'] != 'Female') {
      // perform redirect
}

如果两个选项都未选中,则以上内容将重定向。但就我个人而言,我更喜欢做一个"--选择--"选项,并简单地对照它进行检查

<label for="gender">Gender:</label><select id="gender" name="gender">
<option value="0" selected=selected>--Choose--</option>
<option value="Male">Male</option>
<option value="Female">Female</option>
</select>
if ($_POST['gender'] != '0') {
      // perform redirect
}

此外,您的原件将适用于:

if ($_POST['gender'] == 'Male' || $_POST['gender'] == 'Female') {
      // perform redirect
}

您也可以使用此方法。

<?php
if ( isset($_POST['submit']) ) {
    $_POST = array_map( 'stripslashes', $_POST );
    extract( $_POST );
    if ( !isset($Male) && !isset($Female) ) {
    // redirect
    }
}
?>

当文本值在已知范围/域中时,应避免完全传递这些值。

表格可以使用索引值生成,例如

<?php
$options = [];
$options['gender'] = [1 => 'Male', 2 => 'Female'];
?>
<label for="gender">Gender:</label>
<select id="gender" name="gender">
    <?php foreach ($options['gender'] as $i => $name):?>
    <option value="<?=$i?>"><?=$name?></option>
    <?php endforeach;?>
</select>

然后,您的输入验证逻辑将简单地检查$options数组中是否存在值,例如

<?php
if (isset($options['gender'][$_POST['gender']])) {
    // 
}

此外,考虑使用现有的表单生成工具(例如。https://github.com/gajus/dora)和输入验证库(https://github.com/gajus/vlad)。我是这两个图书馆的作者,每个图书馆都会向您介绍现有的备选方案。使用现有库生成表单和处理输入验证的目的是避免重新发明轮子,并保护自己免受处理表单时经常被忽视的愚蠢安全漏洞的影响,例如XSS。