我想阻止我的脚本被淹没 - 如果用户点击F5,它每次都在执行脚本。
我想阻止这种情况并允许每2秒执行一次脚本,是否有任何解决方案?
答案 0 :(得分:16)
您可以使用memcache来执行此操作..
简单演示脚本
$memcache = new Memcache ();
$memcache->connect ( 'localhost', 11211 );
$runtime = $memcache->get ( 'floodControl' );
if ((time () - $runtime) < 2) {
die ( "Die! Die! Die!" );
}
else {
echo "Welcome";
$memcache->set ( "floodControl", time () );
}
这只是一个示例代码..还有其他需要考虑的事项,如
一个。更好的IP
地址检测(代理,Tor)
B中。当前行动
℃。每分钟最大执行次数......
d。最大洪水等后禁止用户
编辑1 - 改进版本
用法
$flood = new FloodDetection();
$flood->check();
echo "Welcome" ;
类
class FloodDetection {
const HOST = "localhost";
const PORT = 11211;
private $memcache;
private $ipAddress;
private $timeLimitUser = array (
"DEFAULT" => 2,
"CHAT" => 3,
"LOGIN" => 4
);
private $timeLimitProcess = array (
"DEFAULT" => 0.1,
"CHAT" => 1.5,
"LOGIN" => 0.1
);
function __construct() {
$this->memcache = new Memcache ();
$this->memcache->connect ( self::HOST, self::PORT );
}
function addUserlimit($key, $time) {
$this->timeLimitUser [$key] = $time;
}
function addProcesslimit($key, $time) {
$this->timeLimitProcess [$key] = $time;
}
public function quickIP() {
return (empty ( $_SERVER ['HTTP_CLIENT_IP'] ) ? (empty ( $_SERVER ['HTTP_X_FORWARDED_FOR'] ) ? $_SERVER ['REMOTE_ADDR'] : $_SERVER ['HTTP_X_FORWARDED_FOR']) : $_SERVER ['HTTP_CLIENT_IP']);
}
public function check($action = "DEFAULT") {
$ip = $this->quickIP ();
$ipKey = "flood" . $action . sha1 ( $ip );
$runtime = $this->memcache->get ( 'floodControl' );
$iptime = $this->memcache->get ( $ipKey );
$limitUser = isset ( $this->timeLimitUser [$action] ) ? $this->timeLimitUser [$action] : $this->timeLimitUser ['DEFAULT'];
$limitProcess = isset ( $this->timeLimitProcess [$action] ) ? $this->timeLimitProcess [$action] : $this->timeLimitProcess ['DEFAULT'];
if ((microtime ( true ) - $iptime) < $limitUser) {
print ("Die! Die! Die! $ip") ;
exit ();
}
// Limit All request
if ((microtime ( true ) - $runtime) < $limitProcess) {
print ("All of you Die! Die! Die! $ip") ;
exit ();
}
$this->memcache->set ( "floodControl", microtime ( true ) );
$this->memcache->set ( $ipKey, microtime ( true ) );
}
}
答案 1 :(得分:4)
答案 2 :(得分:2)
你可以使用cookies(可以被禁用)所以不是一个好主意,或者你可以使用他的IP地址存储在数据库中,所以如果更多然后X尝试从相同的IP地址然后不执行代码,只是一个if else语句,你需要一个具有ip地址请求时间,尝试次数
的表如果您不想使用数据库,则可以使用以下代码
$file = "file.txt";
$file_content = file_get_contents($file);
$fh = fopen($file, 'w') or die("could not open file");
$now = time();
if($now - $file_content > 60){
// your code here
fwrite($fh, $now);
}else{
echo "Try again later";
}
fclose($fh);
但是在这种情况下,它不是针对每个访问者而是针对所有访问者(因此说用户A来执行脚本,用户B将无法执行它直到60秒通过。
答案 3 :(得分:0)
最好的方法是将时间存储在服务器端。如果您将信息留在客户端,则很容易通过。
我会将时间戳保存在表格中。输入和检查垃圾邮件您的脚本。并且容易设置容忍度。
答案 4 :(得分:0)
使用apc cache或mencache存储存储到数据库的信息或从文件中读取我认为耗费时间/资源