2

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

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

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

这种代码运行良好,但我意识到问题是人们可以输入如下内容:

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

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

有没有一种简单的方法可以确保不会发生这种情况?我对这些技术相当陌生,所以不知道一切是如何工作或组合在一起的,但我学得很快,所以任何指针都会非常有用。

4

3 回答 3

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 注入这样的坏事。

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

于 2012-06-04T12:41:21.020 回答
0

$.post 的正确语法是

$.post(url,data_to_send,callback_function)

通过使用这种方法,您的用户将永远无法损坏您的网站。使用类似

$.post('http://myURL.com/vote.php',{"personID":personID,"eventID":123);
于 2012-06-04T12:34:00.533 回答
0

无论您使用的是 POST 还是 GET,您始终可以考虑使用hash_hmac. 这可以防止人们通过添加其他人无法猜测的签名来更改其值而不被发现。

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

以下函数将盐和签名添加到给定的人员 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()or中作为数据传递$.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
}
于 2012-06-04T13:07:48.307 回答