3

私は自分の国で投票コンテストを見つけました。多くの人が投票していることに気付いた後(4日間で6kのように)、適切な答えを見つけることなく、好奇心を満たすように努めてきました。

キャプチャなしの投票コンテストです。「投票」ボタンをクリックするだけです。しかし、1時間に同じコンピューターからの複数の投票を回避するためのJSコード(私が見る限り、IP + cookie)があります。これは、何とか回避できたと思います。また、JSONコールバックを使用してランダムを構築します。一部の人々も構築できた可能性のある確認リンク(これにより、可能な限り迅速な投票が可能になります):

http://ws.discoverybrasil.com/curiosity/concurso/altaVoto.php?jsoncallback=jQuery164036090815054306025_1321401398889&video=1327&tema=3&region=2&_=1321401584457

投票手順に関係する完全なJSは次のとおりです。

<script>
var TEMA_ELEGIDO = 0;
var DATOS = {};
$(document).ready(function(){
TEMA_ELEGIDO = getQueryVariable('tema','');
mostrar_tema();
detallar_video();
if(typeof(FB)!='undefined') FB.XFBML.parse(); // lanzo el FB JS SDK (viene en los includes de Discovery).
});
function mostrar_tema(){
$.getJSON(APPSERVER+'/listarTemas.php?jsoncallback=?', function(response){
    if(!response){ alert('Erro no envio de dados. Tente novamente, por favor.'); return };
    if(response.resultado != 1){ alert(response.errormsg); return };
    for(var i in response.lista){
        if(response.lista[i].id == TEMA_ELEGIDO){
            $('#curiosity_tema').html(response.lista[i].titulo);
            TEMA_ELEGIDO = response.lista[i].id;
        }
    }
});
}
function detallar_video(){
var id = getQueryVariable('id');
if(id=='') return;
$.getJSON(APPSERVER+'/detalleContenido.php?jsoncallback=?',{
    'id': id
}, function(response){
    if(!response){ alert('Erro no envio de dados. Tente novamente, por favor.'); return };
    if(response.resultado != 1){
        alert('Error: '+ response.errormsg);
        return;
    }
    DATOS = response;
    $('#curiosity_usuario').html( (response.nombre+' '+response.apellido).replace('<','') );
    $('#curiosity_locacion').html( (response.ciudad+', '+response.pais).replace('<','') );
    /^http\:\/\/www.youtube.com\/.*[\?&]+v[=\/]?([\w\d-_]{11})[^&#]*/.test(response.video_link);
    if(RegExp.$1 == '') /^http\:\/\/youtu.be\/([\w\d-_]{11})/.test(response.video_link);
    var embed = '<object width="854" height="510"><param name="movie" value="http://www.youtube.com/v/'+ (RegExp.$1).replace('<','') +'?version=3&rel=0"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed src="http://www.youtube.com/v/'+ (RegExp.$1).replace('<','') +'?version=3&rel=0" type="application/x-shockwave-flash" width="854" height="510" allowscriptaccess="always" allowfullscreen="true"></embed></object>';
    $('#curiosity_video').html(embed);
    $('#curiosity_votos').html(response.votos +' votos');
    if(!puede_votar(response.id)) inhabilitar_voto();
});
}
function inhabilitar_voto(){
$('#curiosity a.votar').css({opacity:0.3, cursor:'default'}).html('Votado');
}
function votar(){
if(!puede_votar(DATOS.id)){
    alert('Você só pode votar 1 vez por hora para cada vídeo.');
    return false;
}
$.getJSON(APPSERVER+'/altaVoto.php?jsoncallback=?',{
    'video': DATOS.id,
    'tema': TEMA_ELEGIDO,
    'region': REGION,
}, function(response){
    if(!response){ alert('Erro no envio de dados. Tente novamente, por favor.'); return };
    if(response.resultado != 1){
        if(response.resultado == 2){
            alert('Você só pode votar 1 vez por hora para cada vídeo.');
        }else{
            alert('Error: '+ response.errormsg);
        }
        $('#curiosity a.votar').animate({opacity:1});
        return;
    }
    recordar_voto(DATOS.id);
    inhabilitar_voto();
    $('#curiosity_votos').html( (parseInt(DATOS.votos,10)+1) +' votos' );
});
}
function puede_votar(video_id){
var puede = true;
var ahora = (new Date()).getTime();
var votos = (getCookie('votos')).split('&');
if(votos.length > 0){
    for(var i in votos){
        var pair = votos[i].split('=');
        if(pair.length != 2) continue;
        if(pair[0] != video_id) continue;
        if(parseInt(pair[1]) <= 0) continue;
        if( (1000*pair[1])+3600000 > ahora ){ puede = false; break; }
    }
}
return puede;
}
function recordar_voto(video_id){
var ahora = (new Date()).getTime() / 1000;
var existente = false;
var votos = (getCookie('votos')).split('&');
if(votos.length > 0){
    for(var i in votos){
        var pair = votos[i].split('=');
        if(pair.length != 2) continue;
        if(pair[0] != video_id) continue;
        existente = true;
        votos[i] = video_id+'='+ahora;
    }
}
if(!existente) votos.push(video_id+'='+ahora);
setCookie('votos', votos.join('&'), 365);
}
function ver_mas(){
location.href='galeria.shtml?tema='+TEMA_ELEGIDO;   
}
</script>

だから、私の質問は次のとおりです:私は気が狂いますか、それとも1時間にコンピュータごとに複数の投票を回避するコードをブロックするか、ウェブサイトが直接投票するために使用するようなランダムなJSONコールバックを作成することができます(Greasemonkeyを使用するか、ランダムを構築するFiddlerを使用してリクエストしますか?)?それとも私は何かが足りないのですか?

私は今までに終わっているコンテストにも参加していませんが、そのような大量の投票は本当にそれについて興味をそそられました-自動化ツールを使用して1時間あたり200または300の有効で高速なプロキシがあるかどうかは本当に疑わしいです( iMacrosのように)。

どうもありがとうございます!

4

2 に答える 2

2

コードを調べたところ、基本的に二重投票を防ぐための 2 つの障壁があります。

  1. と呼ばれる関数がありpuede_votar()、ビデオ ID を取得trueして、過去 60 分間にその特定のビデオに投票していないか、falseそれ以外の場合に返されます。これは Cookie に依存しているため、Cookie をクリアするだけで簡単に無効にすることができます。

  2. それを乗り越えることができれば、APPSERVER + '/altaVoto.php投票したいビデオ ID を含むリクエストが に送信されます。これにより、応答コードが返されます。失敗の可能性があります。これらの失敗の 1 つは code2で、1 時間以内に複数回投票しようとしていることを知らせます。

    これは間違いなくあなたのIPアドレスに依存しています. これはすべてサーバー側で検証されるため、唯一のオプションは新しい IP を取得することです。そうです、これを行った人は誰でも、多くの時間を手にし、多くの代理人を持っていたと思います. 彼らはTorのようなものを使用していた可能性があります。

于 2011-11-16T00:25:22.303 に答える
0

(response.resultado == 2) に関しては、サーバーが 1 時間の制限をチェックし、ブラウザーから送信された Cookie 情報を使用するため、劇的に失敗する可能性があります...

于 2011-11-17T00:49:53.567 に答える