Php html表单选择器安全漏洞

Php html表单选择器安全漏洞,php,html,forms,security,selector,Php,Html,Forms,Security,Selector,如果我有下面这个简单的表单选择器: <form id="myform" class="form" role="form" accept-charset="utf-8" method="post" action="/mypage.php"> <select id="gender" name="gender"> <option selected="" value=""></option> <option value="

如果我有下面这个简单的表单选择器:

<form id="myform" class="form" role="form" accept-charset="utf-8" method="post" action="/mypage.php">
    <select id="gender" name="gender">
     <option selected="" value=""></option>
     <option value="man">man</option>
     <option value="women">women</option>
    </select>
    <button type="submit" name="insert"> Send </button>
</form>

男人
女人
发送
下面是检索数据的php代码:

    if (isset($_POST['insert'])) {
        if(!isset($_POST['gender']) || strlen($_POST['gender'])<3)
        {
                        header('location:'.$_SERVER['PHP_SELF'].'?error');
                        exit;
        }

        $gender = ($_POST['gender']);
     ...
    // INSERT INTO DATABASE
    }
if(isset($\u POST['insert'])){

如果(!isset($_POST['gender'])| strlen($_POST['gender'])没有给出您的数据库部分,那么我不能确切地保证什么解决方案对您来说是完美的。不过,在这种情况下,最好使用PDO绑定系统以及一些简单的if-else逻辑检查

像这个例子:

$this->db_connection = new PDO('mysql:host='. DB_HOST .';dbname='. DB_NAME . ';charset=utf8', DB_USER, DB_PASS);

$query_new_user_insert = $this->db_connection->prepare('INSERT INTO users (user_name, user_password_hash, user_email, user_activation_hash, user_registration_ip, user_registration_datetime, usertype, user_fname, user_lname) VALUES(:user_name, :user_password_hash, :user_email, :user_activation_hash, :user_registration_ip, now(), :usertype, :user_fname, :user_lname)');
                
                $query_new_user_insert->bindValue(':user_name', $user_name, PDO::PARAM_STR);
                $query_new_user_insert->bindValue(':user_password_hash', $user_password_hash, PDO::PARAM_STR);
                $query_new_user_insert->bindValue(':user_email', $user_email, PDO::PARAM_STR);
                $query_new_user_insert->bindValue(':user_activation_hash', $user_activation_hash, PDO::PARAM_STR);
                $query_new_user_insert->bindValue(':user_registration_ip', $_SERVER['REMOTE_ADDR'], PDO::PARAM_STR);
                $query_new_user_insert->bindValue(':usertype', $usertype, PDO::PARAM_STR);
                $query_new_user_insert->bindValue(':user_fname', $user_fname, PDO::PARAM_STR);
                $query_new_user_insert->bindValue(':user_lname', $user_lname, PDO::PARAM_STR);
                $query_new_user_insert->execute();
现在你可以看到这里我们是绑定值。他在这里永远不会知道你的变量。而且,你可以使用生成的形式,而不是直接编码一个。 另外,使用数组传递数据也是一种很好的做法!
看看这个:

就像@Joshua说的,你必须清理你的输入,你可以这样做,(这不是检查变量有效性的唯一方法)

if($\u POST['insert']=“漏洞”){
//刷新页面并通知
}
如果(isset($_POST['insert'])){

如果(!isset($_POST['gender'])| | strlen($_POST['gender'])因为您已经定义了一组可能的值,所以很容易验证提交的值:

$options = array('', 'man', 'woman');
if (!in_array($_POST['gender'], $options)) {
    // invalid value
}

你会清理你的输入。检查这个:可能是我需要“简单的if-else逻辑检查”要匹配仅有的两个值选项吗?不,这与转义放在选择框中的某些值有关。看看@Doctor在下面发布的内容。这将帮助你很多:如果你使用PDO prepare(),就不需要真正的转义字符串,正如我上面所示。PDO是现代PHP基础,而不是另一种选择(你可以使用PDO::quote())@user3436403
$options = array('', 'man', 'woman');
if (!in_array($_POST['gender'], $options)) {
    // invalid value
}