2014-03-19 121 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"。這將刪除您的表中的所有數據(用戶,密碼等)。