2013-07-19 89 views
0

我有一個方案。比方說,有人在我的網站,有它增加了一個事件,例如一個形式,有一個字段,如下所示:編輯HTML然後通過PHP發佈

<input type="text" name="title" id="title"> 

比方說,某人使用了F12的開發工具和改變ID =「標題」來id =「whatever」,甚至刪除id屬性,那麼我將如何讓我的PHP腳本停止運行,以便沒有任何內容發佈到MySQL?

下面是一個例子了書籤功能,我有:(前端形式)

<form action="bookmarks.php" method="post" enctype="multipart/form-data"> 
    <div class="control-group"> 
    <label class="control-label" for="input-mini">Title*</label> 
    <div class="controls"> 
     <input class="span12" id="title" name="title" type="text" placeholder="e.g. Oliver's pet cat..."> 
    </div> 
    </div><!-- /control-group --> 
    <div class="control-group"> 
    <label class="control-label" for="input-mini">Link*</label> 
    <div class="controls"> 
     <input class="span12" id="link" name="link" type="text" placeholder="e.g. http://boopeo.com"> 
     <input type="hidden" name="parse_var" id="parse_var" value="addbookmark" /> 
     <br /><input name="submit" type="submit" class="btn btn-success span12" value="Bookmark" /></form> 

後端PHP:

if (isset($_POST['parse_var'])){ 
      $parser = $_POST['parse_var']; 
      $parser = htmlspecialchars($parser); 
    if ($parser == "addbookmark"){ 


      $title = $_POST['title']; 
      $title = htmlspecialchars($title); 
      $linkurl = $_POST['link']; 
      $linkurl = htmlspecialchars($linkurl); 

    $sqlrecentmark = $db->query("SELECT link_url FROM tablenamehere WHERE mem_id='$id' ORDER BY id DESC LIMIT 20"); 
    while($row = $sqlrecentmark->fetch(PDO::FETCH_ASSOC)) { 
     $recent_link = $row["link_url"]; 
    } 

    if ($linkurl != $recent_link){ 
     $dataact = array('mem_id' => $id, 'title' => $title, 'link_url' => $linkurl); 

    $sqlactivity = $db->prepare("INSERT INTO tablenamehere (mem_id, title, link_url) value (:mem_id, :title, :link_url)"); 
    $sqlactivity->execute($dataact); 
    } else { 
     $not_msg = '<br /><br /><div class="alert alert-error">Oops! You have added that bookmark before. Just look and you shall find!</div>'; 
    } 
    } 
    } 
+0

從不信任用戶提交的數據,總是驗證和消毒...和Don忘記你必須使用參數化查詢 – 2013-07-19 22:07:49

+0

你可以發佈你的前端形式和後端php代碼?這看起來更像是一個與後端輸入消毒有關的問題。不確定這種情況確實有害,但看起來很有趣。 – Maximus2012

+0

我將在前面的表格中使用一個不同的示例: – James

回答

1

從用戶切勿輕信數據。始終進行消毒和驗證。您正在使用準備好的語句,因此您幾乎可以免受注射。您要做的另一件事是確定用戶發送給您的數據是否與您期望的數據相匹配,如果確實如此,則繼續將其用於數據庫。 (你大部分都是這樣做的,所以誠實地說,應該沒有惡意用戶的不良影響)

+0

感謝您的回覆,真正的幫助:)但是,如果用戶要從HTML中刪除id =「title」屬性,然後通過提交表單運行PHP腳本,它會發布其他現有值,然後返回錯誤(通知:未定義的索引:/ home/jdowen/public_html/lb/edge/tools /書籤中的標題。php在第22行)顯示文件路徑等。我如何阻止這個,因爲這是一個安全風險? – James

+1

有兩件事,一是在生產代碼中,您不應該向用戶顯示錯誤(您可以更改php.ini文件中的設置)並在使用之前檢查isset? –

1

輸入字段的id不作爲發佈數據傳遞,因此無法告知後端php代碼。也許你在談論name屬性。

<input type="text" name="theTitle" id="aTitle"> 

在我上面的例子中,輸入字段將發佈爲$_POST["theTitle"]

你可以使用JavaScript來檢查這些元素提交表單前,但如果你擔心用戶操縱DOM ,那可能不會有太大的幫助。

閱讀您對未定義指數誤差關注後,你只需要檢查,如果你使用它之前的變量被設置:

if(isset($_POST["title"])) { 
    $title = $_POST['title']; 
} else { 
    //output error 
}