html表单选择器安全漏洞

时间:2014-03-19 07:40:25

标签: 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="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
    }

现在有人使用Firebug将选项值从“man”修改为“漏洞”并单击“提交”这个新值将插入到我的数据库而不是前一个。

我的问题是:如何使用php语言来防止这种情况?

感谢。

3 个答案:

答案 0 :(得分:1)

您的数据库部分未给出,因此我无法确定哪种解决方案最适合您。但是,如果你在这种情况下使用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();

现在你可以在这里看到我们是绑定值。他永远不会知道你的变量。此外,您可以使用生成的表单而不是直接编码。 使用数组传递数据也是另一个好习惯! 看看这个:http://blog.stackoverflow.com/2008/06/safe-html-and-xss/

答案 1 :(得分:1)

由于您有一组已定义的可能值,因此很容易验证提交的值:

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

答案 2 :(得分:0)

像@Joshua所说的那样你必须对你的输入进行消毒,你可以这样做,(这不是检查变量有效性的唯一方法)

if($_POST['insert'] == "vulnerability"){
//refresh the page and notify
}
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
}

一旦确定变量是安全的或者是预期的,你只想将变量插入到数据库中,即如果在插入数据库之前php代码中没有有效性检查,则用户可以使用用于删除表或更改数据的mysql语句,即"TRUNCATE TABLE MY_AWESOME_TABLE"。这将删除表中的所有数据(用户,密码等)。