2012-06-04 141 views
2

幫助!我正在寫一些代碼來更新使用類似於下面的代碼MySQL數據庫: -使用jQuery更新數據庫ajax​​.Post()

$.post('http://myURL.com/vote.php?personID=' + personID + '&eventID=123'); 

的vote.php代碼利用查詢字符串值,並插入一條記錄在它的值的數據庫。

這種代碼工作正常,但我已經意識到的問題是,人們可以只輸入像:

http://myURL.com/vote.php?personID=5&eventID=123

到它們的地址欄和本質垃圾郵件的應用...

有沒有一種簡單的方法可以確保不會發生?我對這些技術相當陌生,所以沒有意識到一切是如何工作的或者適合在一起的,但是我學得很快,所以任何指針都會非常有用。

+0

我想,最好的應該是始終對數據進行加密,當你收到它解密。 – jcho360

回答

3

這不是一個好主意使用GET參數傳輸到數據庫的數據。通常,您想要使用URL中不可見的POST參數。因此,而不是:

$.post('http://myURL.com/vote.php?personID=' + personID + '&eventID=123'); 

你會做這樣的:

$personID = $_POST['personID']; 
$eventID = $_POST['eventID']; 

$.post('http://myURL.com/vote.php', { "personID" : personID, "eventID" : 123 }); 

而在你的PHP腳本,你將與$_POST陣列這樣的訪問數據但是,不要忘記在保存到數據庫之前正確地過濾輸入,以防止諸如SQL Injection之類的不利因素。

這不是一個銀彈:垃圾郵件仍然是可能的,因爲任何HTTP客戶端都能夠向您的站點發送郵寄請求。你可以看到的另一件事是Security Tokens,使它更不容易受到垃圾郵件。或者實施限制請求/分鐘/用戶數量的系統......但是我離原始問題太遠了。

+0

完美答案。 A + –

0

的$。員額正確的語法是

$.post(url,data_to_send,callback_function)

通過使用這種方法,您的用戶將永遠無法損壞您的site.Use像

$.post('http://myURL.com/vote.php',{"personID":personID,"eventID":123); 
+0

這很好,看起來好多了,謝謝。然而,我的主要問題是想方設法讓某人不建立查詢字符串並將其輸入到地址欄中。 –

+0

使用get而不是post是這個更好的選擇嗎?如果我的問題看起來很愚蠢,我就說我還在挑選這些東西。 –

+0

不要忘了點擊答案左邊的複選標記 – 2012-06-04 12:38:13

0

無論您使用的是POST還是GET,您都可以考慮使用hash_hmac來爲頁面中的重要字段進行簽名。這可以防止人們通過添加別人無法猜測的簽名來改變其價值。

這也使得CSRF更加困難,雖然由於注視技術並非不可能。這只是另一種可以使「小提琴手」變得更加困難的技術。

以下函數將salt和簽名添加到給定的person id以形成安全的字符串。

define('MY_SECRET', 'an unguessable piece of random text'); 

function getSecurePersonId($personId) 
{ 
    $rnd = uniqid("$personId-", true); 
    $sig = hash_hmac('sha1', $rnd, MY_SECRET); 

    return "$rnd-$sig"; 
} 

您會傳遞的getSecuredPersonId()給JavaScript輸出通過如在$.post()$.get()數據;張貼會推薦順便說一句。

當提交表格時,根據請求方法,您的個人ID將會以$_GET['personID']$_POST['personID']結尾。爲了驗證給定值,你通過這個功能運行:

function validateSecurePersonId($securePersonId) 
{ 
    if (3 != count($parts = explode('-', $securePersonId))) { 
     return false; 
    } 
    // reconstruct the signed part 
    $rnd = "{$parts[0]}-{$parts[1]}"; 
    // calculate signature 
    $sig = hash_hmac('sha1', $rnd, MY_SECRET); 

    // and verify against given signature 
    return $sig === $parts[2] ? $parts[0] : false; 
} 

如果該值正確簽名,它會返回你開始了原始的人的ID。如果發生故障,將返回false

小測試:

$securePersonId = getSecurePersonId(123); 
var_dump($securePersonId); 

if (false === validateSecurePersonId($securePersonId)) { 
    // someone messed with the data 
} else { 
    // all okay 
} 
+0

請提供更多關於如何使用這段代碼的細節,以及它如何幫助解決這個問題。就目前而言,它絕對沒有價值。 –