2012-06-04 76 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

请提供更多关于如何使用这段代码的细节,以及它如何帮助解决这个问题。就目前而言,它绝对没有价值。 –