2014-02-22 39 views
0

我有這樣的代碼對某些圖像,像這樣:更新數據庫按鏈接

<img src="../images/woods/oak.png" onclick="loadXMLDoc(this), add_items_oak(this), add_skills_oak(this)" class="a" name="oak"/> 
<img src="../images/woods/oak.png" onclick="loadXMLDoc(this), add_items_oak(this), add_skills_oak(this)" class="b" name="oak" /> 

當按下其中的一個,一個Ajax調用運行:

function loadXMLDoc(h) 
    { 
    var xmlhttp; 
    if (window.XMLHttpRequest) 
     {// code for IE7+, Firefox, Chrome, Opera, Safari 
     xmlhttp=new XMLHttpRequest(); 
     } 
    else 
     {// code for IE6, IE5 
     xmlhttp=new ActiveXObject("Microsoft.XMLHTTP"); 
     } 
    xmlhttp.onreadystatechange=function() 
     { 
     if (xmlhttp.readyState==4 && xmlhttp.status==200) 
     { 
     var getEle = document.getElementsByClassName('woods1')[0]; 
     var imagePath ="../images/woods/oak_cut.png"; 
      h.src = imagePath + xmlhttp.responseText; 
     } 
     } 
    xmlhttp.open("POST","../database/update.php",true); 
    xmlhttp.send(); 
    } 

,然後更新該數據庫使用此文件:

<?php 
     require('../includes/db_connect.php'); 

      /* Register a prepared statement */ 
      if ($stmt = $mysqli->prepare('  

      UPDATE items_woods t1 JOIN skills_woodcutting t2 
      ON t1.id = t2.id 
      SET t1.oak = oak+1, 
       t2.exp = exp+13 
     WHERE t1.id = ?; 

      ')) { 
       /* Bind parametres */ 
       $stmt->bind_param('i', $id); 

       /* Insert the parameter values */ 
       $id = 1; 

       /* Execute the query */ 
       $stmt->execute(); 

       /* Close statement */ 
       $stmt->close(); 

      } else { 
       /* Something went wrong */ 
       echo 'Something went terrible wrong' . $mysqli->error; 
      } 
?> 

現在的問題是,人們可以使用網址來模擬點擊一個點擊e圖像。就像寫這樣的東西:www.examplepage.com/database/update.php

我需要update.php來檢查是否一個圖像被點擊。

我試過一些代碼,它的<img>標記的值設置爲true,並且只有在update.php處的值爲真時,它纔會執行代碼。這並沒有幫助,因爲我試圖找到一個不能被欺騙的解決方案,所以我想在這裏問。任何建議或建議?提前致謝。

回答

1

可以測試POST請求

if ($_SERVER['REQUEST_METHOD'] === 'POST') { 
    // … your database code 
} 

這至少會停止更新,如果用戶僅訪問過的網址,因爲這將構成一個GET請求

+0

謝謝!通過使用這個,以及Collin Grady的回答,我可以成功地製作一個非常安全的樹形圖像:) – user3287771

+0

但是請注意,對於真正想欺騙虛假帖子的人來說,這是微不足道的。你可以加載jquery到一個頁面,只需要$ .post(「someurl」)' –

2

你想要什麼是不可能通過任何標準的方法。沒有辦法要求有人點擊鏈接直接訪問URL。

您必須執行一些操作,例如生成一次性散列,只能在短時間內運行,並且只允許腳本在鏈接中傳遞時使用。

所以,如果用戶點擊一個帶有該散列的鏈接,它將工作一次,但將來使用該散列的點擊將不會。他們必須再次找到該圖像,然後再次用新哈希點擊以觸發相同的功能。

編輯:

如果你正在做什麼樣子,使一種瀏覽器的遊戲,用戶可以看到資源,然後單擊要求他們,你能不能先產生一個地圖,併發送X/Y COORDS他們點擊,然後跟蹤資​​源被刪除?

然後,如果他們試圖再次「削減」相同的x/y座標,它將不起作用,因爲他們已經收穫了它。

+0

哦聰明發生的事情,我會存儲這些數據庫中的哈希值? – user3287771

+0

檢查我的更新;我沒有注意到它看起來像什麼,所以我添加了一個替代想法:) –

+0

我喜歡這兩個想法,但我認爲第二個想法對我來說有點太複雜,我寧願創建哈希,並檢查是否這是一個「合法」的點擊。這聽起來不錯 – user3287771