帮助!我正在编写一些代码来更新mySQL数据库,类似于下面的代码: -
$.post('http://myURL.com/vote.php?personID=' + personID + '&eventID=123');
vote.php代码获取查询字符串值并将记录插入到包含其中值的数据库中。
这种代码工作正常,但我意识到问题是人们可以输入类似的东西:
进入他们的地址栏并基本上垃圾邮件应用程序...
是否有一种直截了当的方式可以确保不会发生这种情况?我对这些技术有了新的认识,所以不知道一切是如何工作的,也不是很合适,但我学得很快,所以任何指针都会非常有用。
答案 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
}