使用JQuery ajax.Post()更新数据库

时间:2012-06-04 12:30:09

标签: php jquery mysql security

帮助!我正在编写一些代码来更新mySQL数据库,类似于下面的代码: -

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

vote.php代码获取查询字符串值并将记录插入到包含其中值的数据库中。

这种代码工作正常,但我意识到问题是人们可以输入类似的东西:

  

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

进入他们的地址栏并基本上垃圾邮件应用程序...

是否有一种直截了当的方式可以确保不会发生这种情况?我对这些技术有了新的认识,所以不知道一切是如何工作的,也不是很合适,但我学得很快,所以任何指针都会非常有用。

3 个答案:

答案 0 :(得分:3)

对于转到数据库的数据使用GET参数不是一个好主意。通常,您希望使用URL中不可见的POST参数。所以而不是:

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

你会这样做:

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

在PHP脚本中,您可以使用$_POST数组访问您的数据,如下所示:

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

但是,在保存到数据库之前不要忘记正确过滤输入,以防止SQL Injection之类的错误。

这不是灵丹妙药:垃圾邮件仍然可能,因为任何HTTP客户端都可以向您的网站发送邮件请求。您可以看到的另一件事是Security Tokens,使其更不容易受到垃圾邮件的攻击。或者实现一个限制请求/分钟/用户数量的系统......但是我离原始问题太远了。

答案 1 :(得分:0)

$ .post的正确语法是

$.post(url,data_to_send,callback_function)

使用此方法,您的用户将永远无法破坏您的网站。请使用

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

答案 2 :(得分:0)

无论您使用的是POST还是GET,都可以考虑使用hash_hmac在页面中签署重要字段。这可以防止人们通过添加其他人无法猜到的签名来检测其值。

这也使得CSRF更加困难,但由于固定技术并非不可能。这只是另一种技术,可以让“小提琴手”变得更加困难。

以下函数将salt和signature添加到给定的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()中的数据传递;建议发布btw。

提交表单后,您的人员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
}