2014-03-19 85 views
0

如果我有下面这个简单的表格选择:HTML表格选择安全漏洞

<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 
    } 

,现在有人用萤火虫从修改的选项值“man”改为“漏洞”,点击提交,这个新值将被插入到我的数据库中而不是前一个。

我的问题是:我怎样才能防止这与PHP语言?

谢谢。

+1

你会净化你的投入。检查了这一点:http://stackoverflow.com/questions/1637275/simple-html-sanitizer-in-javascript –

+1

可能是我需要“简单的if-else逻辑检查”匹配只有两个值选项可能? –

+0

不,它与转义某些值并将其放入您的选择框有关。看看医生在下面发布了什么。 –

回答

1

既然你有一组定义的可能值,很容易验证提交值:

$options = array('', 'man', 'woman'); 
if (!in_array($_POST['gender'], $options)) { 
    // invalid value 
} 
+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/

+0

real_escape_string不需要,如果您使用PDO准备( )如上所示。 PDO是比其他替代方案更现代的PHP基础(您可以使用PDO :: quote())@ user3436403 – abmmhasan

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"。这将删除您的表中的所有数据(用户,密码等)。