【发布时间】:2013-05-25 19:21:06
【问题描述】:
如果用户推荐朋友,我想奖励他们。我一直在使用以下代码来执行此操作,但我担心它可能不安全(用户制作虚假帐户来进行游戏)。我可以改进这段代码吗?还有其他替代脚本可以做得更好吗?
if (isset($_GET['refer']) || isset($_GET['r'])) {
global $database, $session;
if (!$session->logged_in) {
$username = mysql_safe($_GET['refer']);
if($database->usernameTaken($username)) {
$userip= getRealIP();
$q="SELECT uname FROM " . TBL_USERS . " WHERE ipad = '$userip'";
$result=mysql_query($q, $database->connection);
$result = mysql_numrows($result);
if ($result == 0) {
$_SESSION['referer'] = $username;
}
}
}
function getRealIP()
{
if (!empty($_SERVER['HTTP_CLIENT_IP'])) //check ip from share internet
{
$ip=$_SERVER['HTTP_CLIENT_IP'];
}
elseif (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) //to check ip is pass from proxy
{
$ip=$_SERVER['HTTP_X_FORWARDED_FOR'];
}
else
{
$ip=$_SERVER['REMOTE_ADDR'];
}
return $ip;
}
【问题讨论】:
-
您可以先使用
mysqli或PDO而不是mysql_*来避免sql 注入 -
您使用什么方法生成推荐链接?它是用某种随机令牌或其他东西生成的吗?如果它是随机生成的令牌,那么您应该没问题,因为推荐链接(令牌)必须与数据库中存在的链接匹配。人们几乎不可能猜出正确的推荐令牌来匹配您数据库中的那个,否则,它将被拒绝。
-
我使用他们的用户名。 ?refer=用户名
-
我希望
mysql_safe不是在做mysql_real_escape_string的工作的自定义尝试。 -
需要注意的一点:即使您使用了一组返回IP地址的方式,在NAT之后的用户可能仍然返回相同的IP。假设特定公司的每个人都开始互相推荐。相同的 IP,但您可能永远不会给予任何信任。我见过有组合方法的代码:IP 地址、用户代理(这可能因用户而异,但并非总是如此)、Cookie 和节流(即,它可能不会起飞这么快,所以信用是仅在每个请求相隔超过 5 分钟时才知道)。一般来说,很难阻止用户玩游戏。 :-/