【问题标题】:Generate random string variable and update MySQL field with it. [duplicate]生成随机字符串变量并用它更新 MySQL 字段。 [复制]
【发布时间】:2015-06-17 05:54:15
【问题描述】:

我遇到了一个问题,有人正在使用机器人来利用我的网站。从日志中可以看出,在代码能够从他的余额中扣除所请求的金额之前,他能够非常快速地发送多个请求。

我曾考虑在每次执行时声明一个随机值,然后将其放入他的帐户行并与自身进行比较。这样每次运行都会有所不同。

下面是代码的头部:

$player=mysql_fetch_array(mysql_query("SELECT `id`,`time`,`ex`,`btc`,`string` FROM `players` WHERE `hash`='".prot($_GET['_unique'])."' LIMIT 1"));
$random = base64_encode(openssl_random_pseudo_bytes(10));
$setstring = $random;
mysql_query("UPDATE `players` SET `string` = $setstring WHERE `id`=$player[id] LIMIT 1");
$playersec=mysql_fetch_array(mysql_query("SELECT `string` FROM `players` WHERE `hash`='".prot($_GET['_unique'])."' LIMIT 1"));

 if (!is_numeric($_GET['amount']) || (double)$_GET['amount']>$player['btc'] || (double)$_GET['amount']< 0 || $setstring != $playersec['string'] ) {
$error='yes';
$con=1;
} 

我很确定这是问题所在,因为它在执行时没有在string 字段中添加任何内容,即它是空的。

mysql_query("UPDATE `players` SET `string` = $setstring WHERE `id`=$player[id] LIMIT 1");

但当我跑步时:

<?php

$random = base64_encode(openssl_random_pseudo_bytes(10));
$setstring = $random;
echo $setstring;
?>

它输出正常:IAXUqtKraNDb1Q==

有人有什么想法吗?

谢谢

【问题讨论】:

  • 将 $setstring 括在引号中。
  • or die(mysql_error()) 添加到mysql_query()。 MySQL 会告诉你语法错误在哪里。
  • @Abovestand 做到了,谢谢!

标签: php mysql passwords bots


【解决方案1】:

此时您正在创建一个变通方案。为了防止这种滥用,最好从根本上阻止它,并使用数据库事务来做到这一点。

步骤:

1) 使用 INNODB

2) 在php上使用事务封装。

更新并从数据库中检索您的总数。由于它们现在处于一个事务中,因此下一个事务必须等待第一个事务,结果只能检索到真正的可用值。

【讨论】:

  • 感谢建议,一定会考虑的。
猜你喜欢
  • 2018-01-06
  • 1970-01-01
  • 1970-01-01
  • 2015-05-11
  • 2014-02-09
  • 2010-12-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多