Ir para conteúdo
Fórum Script Brasil
  • 0

Proteger código PHP


tcardoso

Pergunta

Oi,

eu tenho um pedaço de código onde quero garantir que só um processo entra de cada vez.

Tentei da seguinte maneira:

$done=mysql_query('LOCK TABLES tablename');
/*código restante*/
usleep (10000000);
mysql_query('UNLOCK TABLES');

O problema é que usando sessoes diferentes (usando uma janela do firefox e outra do IE),ele ignora o LOCK e acabam no mesmo tempo. Colocando WRITE no fim, parte do código não é executado, e começa a dar erros no restante codigo dos includes.

alguém tem alguma solução como prevenir que 2 utilizadores estejam correndo o pedaço de código ao mesmo tempo (por exemplo para garantir que o ultimo bilhete é comprado por apenas uma pessoa e não duas).

Obrigado

Link para o comentário
Compartilhar em outros sites

2 respostass a esta questão

Posts Recomendados

  • 0

Só ressaltando que o lock table age somente no SGBD, logo, é a tabela no BD que fica bloqueada para acesso até haver o desbloqueio, o código PHP vai continuar sendo executado (claro que se depende de uma query na tabela, ai vai dar erro).

No caso do bilhete a solução seria uma verificação antes de executar ação, o algoritmo é simples:

1 - O operador seleciona a opção de venda

2 - Antes da venda o sistema verifica no BD se realmente o bilhete que constava como disponível ainda está

3 - Se estiver disponível confirma a venda e já altera o valor no BD, caso contrário avisa que o mesmo já foi vendido

Note que o SGBD controla a questão do acesso, mesmo que você dispare dois eventos de forma simultânea direcionados para uma mesma coluna de uma tabela o SGBD cria uma "fila" e nessa fila o problema se resolve com o que eu passei (o próprio manual do MySQL trás informações sobre isso).

Link para o comentário
Compartilhar em outros sites

  • 0

já fiz o seguinte:

1 - SELECT verificando se ainda havia disponivel

2 - UPDATE para mais ninguém entrar.

o utilizador consegue executar o select ao mesmo tempo nas duas janelas do browser, indo correr o update ao mesmo tempo tb. Isto é um caso real em que tenho um hacker "trabalhando" para mim dizendo que ainda consegue fazer ou não.

A unica melhor maneira que encontrei até agora foi:

usleep (mt_rand(1000,1000000));

antes dos updates o que faz com o a maior parte das vezes não entre ao mesmo tempo no select. Ainda assim o cara conseguiu fazer uma vez em 20 tentativas, é o suficiente para me destruir o site :(

Só ressaltando que o lock table age somente no SGBD, logo, é a tabela no BD que fica bloqueada para acesso até haver o desbloqueio, o código PHP vai continuar sendo executado (claro que se depende de uma query na tabela, ai vai dar erro).

No caso do bilhete a solução seria uma verificação antes de executar ação, o algoritmo é simples:

1 - O operador seleciona a opção de venda

2 - Antes da venda o sistema verifica no BD se realmente o bilhete que constava como disponível ainda está

3 - Se estiver disponível confirma a venda e já altera o valor no BD, caso contrário avisa que o mesmo já foi vendido

Note que o SGBD controla a questão do acesso, mesmo que você dispare dois eventos de forma simultânea direcionados para uma mesma coluna de uma tabela o SGBD cria uma "fila" e nessa fila o problema se resolve com o que eu passei (o próprio manual do MySQL trás informações sobre isso).

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,2k
    • Posts
      652,1k
×
×
  • Criar Novo...