1. Este site usa cookies. Ao continuar a usar este site está a concordar com o nosso uso de cookies. Saber Mais.

Jogo da Moeda

Discussão em 'Web Development' iniciada por Loppersy, 1 de Setembro de 2012. (Respostas: 70; Visualizações: 3837)

  1. Loppersy

    Loppersy Power Member

    Boas,

    Tenho 15 anos e como estou de férias da escola e sempre me interessei por programação, nos últimos dois dias, como não tinha nada para fazer decidi criar um pequeno jogo em PHP e JavaScript e jQuery.
    Eu queria pedir ao programadores experientes que visitam este fórum que avaliassem o meu trabalho numa escala de 1 a 20 e que se encontrassem algum erro me avisassem.

    Podem aceder ao jogo pelo meu IP externo: http://jogodamoeda.no-ip.org
    Se não conseguirem aceder é porque eu desliguei o meu portátil ou qualquer coisa do género porque o jogo está hospedado num pequeno servidor que montei.

    O jogo consiste no tradicional jogo da moeda (cara ou coroa) e o objetivo é conseguir ganhar o máximo dinheiro possível.
    Uma das coisas interessantes em que ando a trabalhar é no fato de podermos arrastar os elementos do jogo dentro da página.
    Por padrão quando alguém se regista recebe 10€ para começar a jogar.

    02-09-2012
    -Adicionado ajax em quase todo o jogo (obrigado pela dica ImAnAlcoholic);
    -Desactivada a opção "banco" (existe um bug mas já estou a tratar disso).

    04-09-2012
    -Adicionada protecção contra SQL Injection (se encontrarem alguma falha que avise);
    -Adicionado espaço com utilizadores online.
    -Adicionados efeitos fadeIn() fadeOut() e toggle();

    06-09-2012
    -Registo em Ajax e PopUp de registo;
    -Pequenas alterações de segurança no código (agora guardo o IP dos utilizadores).
    -Pequenas alterações na aparência.
    Abraço!
     
    Última edição: 9 de Setembro de 2012
  2. ImAnAlcoholic

    ImAnAlcoholic Power Member

    - Quando aumentamos o numero da aposta o slider devia acompanhar automaticamente
    - Se preenchermos o utilizador e password e carregarmos em registar, nao deviamos ser redireccionados para outra página (neste caso especifico não há necessidade disso) e o registo podia ser feito na hora.
    - Todo o jogo pode ser feito em Javascript, o que permite evitar o pedido de paginas novas, pelo menos as mensagens de aviso deviam ser mesmo em Javascript... esperar um reload para ver somente uma frase nova, é extremamente chato.
    - Poder arrastar as secções das paginas é giro, mas inutil... So porque o podes fazer, nao quer dizer que tenhas de fazer
    - Separa o codigo. Javascript deve estar em ficheiros de Javascript e não misturado com HTML, o mesmo com o CSS que tens espalhado pelo HTML
    - Todos os teus icones são literalmente tags de imagem. Ha formas mais elegantes de fazer isso... pesquisa por sprites e css
    - Não há necessidade de teres as horas a serem mostradas no site. Toda a gente tem relogios no sistema operativo

    Se tens 15 anos, e fizeste isto so por brincadeira, eu diria que estás no bom caminho. Consegues por as coisas a funcionar bem... o que já é mais do que muita gente neste forum consegue. Falta-te agora aprender os bons princípios da programação... mas com alguma pesquisa e tempo vais lá, alias... uma hora de pesquisa e percebes o conceito, mais um dia, e refazes o código de forma a ficar limpo e organizado...

    Pessoalmente gostava de te lançar o desafio de fazeres todo o jogo em Javascript, e usares o XMLHttpRequest ou WebSockets (mais difícil) para comunicares com o servidor, dessa forma evitas carregar novas páginas so para mostrar mensagens de erro =)
     
  3. Loppersy

    Loppersy Power Member

    Boas ImAnAlcoholic,

    Tudo o que aprendi sobre programação foi no manual do php.net, no site da jQuery e na W3schools. Eu já tentei utilizar o XMLHttpRequest e consigo criar uma ligação assíncrona com o servidor, mas não consegui que o servidor enviasse uma resposta de volta para o utilizador. Se entenderes do assunto podes-me dar uma ajudita com o AJAX (não quero que cries nada por mim, mas sim que me expliques sff.)?

    Quanto ao assunto dos sprites, vou pesquisar.

    Abraço!
     
  4. ImAnAlcoholic

    ImAnAlcoholic Power Member

    Acho que mais facil que explicar é mostrar-te onde e que podes ir buscar informação sobre Javascript:

    https://developer.mozilla.org/en-US...irectlocale=en-US&redirectslug=XMLHttpRequest => Página sobre XMLHttpRequest, embora um bocado técnica, tens links que te levam a exemplos mais acessíveis.

    http://developer.mozilla.org é o equivalente ao php.net mas para Javascript (também contem HTML e CSS, embora não tão detalhado)

    Faz um ficheiro PHP em que dentro do ficheiro tenhas algo tão simples como:

    Código:
    <?php 
        echo 'Hello World';
    ?>
    
    Depois tenta fazer um pedido AJAX (XMLHttpRequest) em que o URL do pedido aponta para esse ficheiro... e observa as respostas do lado do javascript.
     
  5. Loppersy

    Loppersy Power Member

    Já consegui criar um pequeno sistema em ajax, mas não consigo fazer com que a resposta seja dada em HTML, ou seja se eu pedir uma página HTML ela é trazida pelo servidor mas as tags não são lidas.

    Repara:http://82.155.210.163/ajax/ajax.php

    Sabes como posso fazer para o HTML ser reconhecido?
    Já agora obrigado pela ajuda que me tens dado.
     
    Última edição: 1 de Setembro de 2012
  6. Ryu^

    Ryu^ Power Member

    Já agora... Tens questões de segurança que precisas de trabalhar. Eu sou um noob em SQL injection mas lá consegui...
    A conta de administrador chama-se "daniel", por alguma razão a conta do "xpto" também ficou como administrador (menu de administração deixa a desejar já agora :p), o nome da base de dados inclui o nome "jogo" e o nome da tabela dos jogadores é "players".

    Facilmente conseguia apagar a base de dados toda. E se não fosse noob podia ter aumentado o meu dinheiro para a quantia que quisesse.

    Php tem ferramentas para combater estas fraquezas, procura por SQL injection.
     
    Última edição: 1 de Setembro de 2012
  7. ImAnAlcoholic

    ImAnAlcoholic Power Member

    [​IMG]

    Loppersy, tal como te disse na PM tens de ganhar conhecimentos nas validações de dados, para evitar essas coisas.

    Desliga o teu servidor web e compoe essas coisas =)

    PS. se o Ryu^ conseguiu fazer isso tudo, então há boas probabilidades de seres vitima de XSS atacks.

    Imagina que eu conseguia incluir um script de Javascript em vez do Username, enquanto o meu nome aparecesse na top list, seria possível roubar as cookies aos utilizadores, registar tudo o que eles escreviam (incluindo passwords) e mandar toda essa informação para um servidor meu, para guardar isso tudo num ficheiro... se eu ficasse com uma lista de usernames e password, e fosse ao google pesquisar pelo username, provavelmente encontraria outros serviços usados por essas pessoas e com sorte a password era a mesma...
     
    Última edição: 1 de Setembro de 2012
  8. Ryu^

    Ryu^ Power Member

    Acho que não tem buracos para XSS visto que nada que possas introduzir no GET é mostrado.
    Mas nunca aprofundei XSS.

    Estou-me a referir aos que não são persistentes... viste que tem sql injection dá para criar XSS persistente na base de dados.
     
    Última edição: 1 de Setembro de 2012
  9. ImAnAlcoholic

    ImAnAlcoholic Power Member

    A ideia é mesmo essa... alias nem me lembro de algum XSS não persistente que seja realmente perigoso (por outro lado ainda não tomei cafe hoje, por isso…)
    Se ele nao validar o que vai para a base de dados, é facil incluir um script. Esse script é depois convertido como uma tag de HTML normal quando mostra aos utilizadores... Uma falha de segurança destas é estar assumir que não está a proteger de todo os dados de entrada e saida. Por outro lado o site parece estar em baixo agora, pelo que não consigo testar, ainda assim é algo que sei que é possível por experiência.
     
  10. maxperformance

    maxperformance Power Member


    Isto seria o que se devia fazer a 95% das empresas da área ^^.
    Mas não te preocupes começaste agora ainda vais a tempo de aprender, a quem faça disto vida e..
     
  11. Loppersy

    Loppersy Power Member

    Obrigado pelas vossas dicas, eu fechei a porta no router para o meu pc, agora estou a trabalhar na validação de dados com PHP, tal como sugeriste na PM, ImAnAlcoholic .
    Estou também a preparar o site para carregar todo com ajax. Penso que consigo acabar amanha à tarde, depois volto a colocar o servidor online e aviso-vos aqui no tópico e por PM.

    Abraço e obrigado pelas dicas!
     
  12. Ryu^

    Ryu^ Power Member

    Nota: Utiliza encriptação, sabe-se lá se alguém fez uma query e as passwords estavam em plain-text... uma coisa simples como sha ou mesmo md5 (acho que este já não é considerado muito seguro).

    Eu não fiz nenhuma query que devolve-se strings btw. Só fiz verificações de true/false para as tabelas que existiam.
     
  13. Loppersy

    Loppersy Power Member

    Podias ter aumentado o teu dinheiro no painel de administração xD
     
  14. Ryu^

    Ryu^ Power Member

    Sim eu sei... o menu "dar dinheiro ao jogador" onde depois se colocava o nome. Mas se soubesse a coluna e a tabela exacta simplesmente fazia um update... muito mais fashion.
     
  15. Loppersy

    Loppersy Power Member

    Estou com um pequeno problema:
    Eu consigo actualizar automaticamente o atributo "max" dos input's do tipo "number" com javascript, mas como faço o mesmo para o slider da biblioteca jQuery eu tentei
    Código:
    <script>
    						$(function() {
    							$( "#slider" ).slider({
    								value:0,
    								min: 0,
    								max: document.getElementById("amount").max,
    								step: 1,
    								slide: function( event, ui ) {
    									$( "#amount" ).val(ui.value );
    								}
    							});
    							$( "#amount" ).val($( "#slider" ).slider( "value" ) );
    						});
    					</script>
    
    Mas não funcionou.
     
    Última edição: 2 de Setembro de 2012
  16. ImAnAlcoholic

    ImAnAlcoholic Power Member

    Em vez de:

    Código:
    $( "#amount" ).val($( "#slider" ).slider( "value" ) );
    Código:
    $('#amount').on('change', function (evt) {
        $('#slider').slider('option', 'value', this.value);
    });
    
    Assim de repente penso que será isso, mas não tenho a certeza se não irás criar um loop infinito =\
    Visto que esse codigo está dentro do HTML e não num ficheiro de JS aparte, não consigo alterar directamente no Chrome para experimentar =(
    Experimenta e vê o que acontece
     
    Última edição: 2 de Setembro de 2012
  17. Ryu^

    Ryu^ Power Member

    Ainda estás 100% vulnerável a sql injection. Agora a única coisa que se tem que fazer é modificar o javascript para não fazer a validação. Tudo o que é javascript/ajax corre no cliente, logo o cliente pode modificar o código que lhe apetecer.

    Devias estar a fazer as queries com prepared statements no mysql.

    Como prova, por alguma razão qualquer, o utilizador xpto tem 696969€ de gita e ficou como administrador e tenho aqui a localização do ficheiro que chama a função para contar o número de linhas quando se faz login: C:\Servidor\Apache\htdocs\functions.php
     
    Última edição: 2 de Setembro de 2012
  18. ImAnAlcoholic

    ImAnAlcoholic Power Member

    Calma aí... O Javascript TEM de fazer validações, nem que seja por bons costumes de avisar os utilizadores sem os fazer esperar por uma pagina nova...Ele não pode é contar somente com o Javascript.... Seja como for... Ele está vulnerável a XSS também... comprovei isso à bocado... =\Seja como for... aprender a tornar segura a aplicação dele é algo que ainda lhe vai levar algum tempo...Eu continuo a dar os parabéns pelo trabalho que fez... agora só lhe falta pesquisa para melhorar o sistema.
     
    Última edição: 2 de Setembro de 2012
  19. Ryu^

    Ryu^ Power Member

    Eu nunca disse que o javascript não tinha que fazer validações nem nada do género. Eu só disse o que fiz "modificar o javascript para não fazer a validação" e expliquei a razão de ter sido possível.
    Javascript é importante para ter uma interface mais rápida e poupar processamento do servidor.
     
  20. Loppersy

    Loppersy Power Member

    Eu sei que tenho de validar o conteúdo das variáveis também no PHP, e estou a tratar disso, agora só não estou a ver como vou actualizar o atributo "max" do slider com AJAX. Alguma sugestão?
     

Partilhar esta Página