Ir para conteúdo
🥇 [Exclusivo] Seja um Membro VIP EXTREME! ×

Pesquisar na Comunidade

Mostrando resultados para as tags ''vbulletin''.

Atualmente, o índice de pesquisa está sendo processado. Os resultados atuais podem não estar completos.
  • Pesquisar por Tags

    Digite tags separadas por vírgulas
  • Pesquisar por Autor

Tipo de Conteúdo


Fóruns

  • Anunciantes
    • Fox CHEATS
    • 🔗 store.rubiproject.com
    • WYD LOST
  • Anúncios e Feedbacks
    • Regras
    • Anúncios e Novidades
    • Área do Usuário
    • Apresente-se aqui!
    • Tutoriais WC
    • Seja um Membro Vip
  • Beta Zone - Áreas Temporárias
    • Lineage 2
    • Inteligência Artificial
    • Segurança e Investigação
    • Desenvolvimento
  • MMO Zone
    • WYD - With Your Destiny
    • Grand Chase
    • League of Legends
    • Outros MMO em Geral
    • RPG Zone - Lixão
  • Shooter Zone
    • Counter Strike
    • Blood Strike
    • Valorant
    • Cross Fire
    • Point Blank
    • Outros Shooters em Geral
    • Battle Royale
    • Shooter Zone - Lixão
  • Outros Games Zone
    • Minecraft
    • Outros Games
    • Outros Games Zone - Lixão
  • Mobile
    • Mobile - Downloads de Cheats / Utilitários
    • Mobile - Tutoriais
    • Mobile - Servidores Privados
    • Mobile - Dúvidas / Pedidos
    • Mobile - Bate Papo
  • Info Zone
    • Programação
    • Cracking
    • Tech
    • Info Zone - Lixão
  • Design Zone
    • Galeria
    • Fábricas
    • Tutoriais
    • Recursos
    • Presentes, Leilões, Vendas e Doações
    • Suporte Design
    • Bate Papo Design
    • Depósito
  • Entretenimento & Diversão
    • Serviços Pagos
    • Notícias do Mundo
    • Bate Papo
    • Discussões
    • Mangás & Animes
    • Mídia
  • MarketPlace
    • Divulgação de Serviços
    • Contrate Serviços de Freelancer
    • Contas, Skins e Cheats
    • Outros
  • Old WC's Bate Papo
  • 【FREE FIRE】▄︻┻┳═一's Fórum do Clube
  • Bug Abuser's Tópicos

Product Groups

Não há resultados para exibir.


Encontrar resultados em...

Encontrar resultados que...


Data de Criação

  • Início

    FIM


Data de Atualização

  • Início

    FIM


Filtrar pelo número de...

Data de Registro

  • Início

    FIM


Grupo


Discord


TItulo de usuário


Data de Criação

Entre e ganha o

Encontrado 2 registros

  1. Nesse tópico, irei explicar como autenticar de forma eficaz os usuários de um fórum que utiliza plataforma VBulletin. Já vi esse tipo de tutorial em vários fóruns, normalmente explicando como criar um loader ou algo do tipo. Nesses tutoriais, boa parte dos autores usam uma solução ruim, que seria: Fazer a requisição HTTP com o nome de usuário e senha; Varrer o código HTML após a requisição e procurar pelo texto "Bem-vindo(a),". Bonito, parece correto. Afinal, somente um usuário logado verá o texto "Bem-vindo(a), Fulano" no menu superior. Essa é a principal solução que esses caras usam para autenticar alguém: procurar por algo que somente um usuário autenticado conseguiria acessar/visualizar. Mas vamos supor algumas situações: E se o fórum permitir que o usuário use uma linguagem que não seja Português? Mesmo que o usuário coloque as credenciais corretas, o login irá falhar sempre. A não ser que, em algum trecho do seu código você busque por "Bem-vindo(a)," e "Welcome," mas (na minha opinião) é inviável varrer o HTML duas vezes, não acha? Dependendo do fórum, o código fonte pode ultrapassar fácil as 7 mil linhas. E se o fórum redirecionar o usuário para a homepage e lá existir um novo tópico com título "Bem-vindo(a),". Mesmo que o usuário coloque as credenciais incorretas, o login terá sucesso. Se for uma aplicação que libera recursos somente para usuários que possuem conta, seria prejuízo, certo?! Se você procurar, existem vários tutorias ensinando isso, em vários fóruns de cheats por aí. E, é capaz que muitos loaders por aí utilizem essa forma de "autenticação". Vamos melhorar isso, lendo os cookies da requisição. (o que são cookies?) Embora esse tutorial use Java, você pode adaptar essa solução para qualquer linguagem. Não tem muito segredo quanto a realizar requisições por meio de protocolo HTTP, use o Google :) Analisando os cookies do fórum Ao acessar o fórum pela primeira vez ou no caso do fórum, sem estar logado, alguns cookies podem ser criados para manter as ações realizadas por você: Acessando o fórum sem estar logado. Essa é uma das formas de guardar dados no client, afinal o HTTP é um protocolo sem estado. Em computação, um protocolo stateless é um tipo de comunicação que considera cada requisição como uma transação independente, isto é, que não está relacionada a qualquer requisição anterior. Quando você abre qualquer site, uma requisição é feita por você (client), processada e retornada pelo servidor. Após isso, seria como se o servidor tivesse uma perda de memória e esquecesse quem é você e o que ele te enviou. Por isso que existem sessões, do contrário você teria que logar novamente toda vez que fosse comentar em um tópico. Quando você faz login no VBulletin, alguns cookies de sessão e hash são criados, estes sim somente um usuário autenticado pode ter: Acessando o fórum após o login com sucesso. Eu não sei ao certo como funciona o VBulletin, às vezes é criado um cookie com nome "bb_sessionhash" mesmo acessando o fórum sem possuir uma conta, outras vezes o cookie não é criado (esse tutorial é um exemplo, ver a primeira imagem), então não recomendo usá-lo para o nosso objetivo. Opte pelo cookie com nome "bb_password", pois este sim é criado somente após o usuário estar autenticado. Obtendo parâmetros de requisição Precisamos checar quais parâmetros devem ser enviados e qual o tipo de requisição esperada, para isso use uma extensão como a HTTP Live Readers: (Firefox) (Chrome). Eu vou adiantar as coisas, mas baixe a extensão e veja funcionando na prática. O VBulletin espera por uma requisição POST contendo os seguintes parâmetros: vb_login_username: contendo o nome de usuário cookieuser: com o valor "1" (que provavelmente deve tornar-se em um booleano quando processado) vb_login_md5password: como o nome sugere, a senha do usuário hasheada com algoritmo MD5 do: com valor "login" que aponta para qual ação estamos realizando. Existem outros, mas para o login bastam esses parâmetros. O que faremos a seguir é: enviar uma requisição GET para recuperar os cookies. Em seguida, enviaremos uma segunda requisição (esta como POST) contendo os cookies da primeira e os parâmetros. Posteriormente verificaremos se o cookie "bb_password" existe. Código Vamos trabalhar com objetos. Primeiro, crie uma classe para manipularmos o nome de usuário (ou email) e senha do usuário, somente para não precisarmos trabalhar com string a todo momento. Como não utilizaremos a senha em texto puro, podemos gerar o hash logo que o usuário for instanciado: import java.math.BigInteger; import java.security.MessageDigest; public final class User { private final String username; private final String password; public User(String username, String password) { this.username = username; this.password = hashPassword(password); } public String getUsername() { return username; } public String getPassword() { return password; } private String hashPassword(String password){ try { MessageDigest digest = MessageDigest.getInstance("MD5"); digest.update(password.getBytes(), 0, password.length()); return new BigInteger(1, digest.digest()).toString(16); } catch(Exception err){} return null; } } Criaremos agora uma classe para realizarmos a ação de login. Precisamos manter uma lista de cookies, um objeto de conexão HTTP e a URL para qual iremos despachar as requisições. Aproveitamos para criar um método que recebe a URL, já que esse atributo será definido como privado: import java.net.*; import java.util.List; public class VBulletin { private List<String> cookies; private HttpURLConnection connection; private URL loginUrl; public VBulletin connect(URL url){ this.loginUrl = url; return this; } } Estou retornando o próprio objeto (return this) para fazer encadeamento (method chaining) mais tarde. Temos que criar um método para gerar a URL com os parâmetros de requisição. Estes são separados pelo caractere "&" e as atribuições de valores são feitas com o caractere "=". Usaremos um usuário (classe User) para montar essa requisição: private String setRequestParameters(User user) throws UnsupportedEncodingException { return new StringBuilder() .append("vb_login_username=") .append(URLEncoder.encode(user.getUsername(), StandardCharsets.UTF_8.displayName())) .append("&cookieuser=1") .append("&vb_login_md5password=") .append(user.getPassword()) .append("&do=login") .toString(); } OK. Precisamos criar um método para fazer uma requisição para a URL especificada no atributo "loginUrl" e armazenar a lista de cookies na nossa lista "cookies". private void retrieveCookies(){ try { // criamos a conexão connection = (HttpURLConnection) loginUrl.openConnection(); connection.setRequestMethod("GET"); connection.setUseCaches(false); connection.setRequestProperty("User-Agent", "Mozilla/5.0"); // Definimos os cookies (se houver) if (cookies != null) this.cookies.stream().forEach((cookie) -> { connection.addRequestProperty("Cookie", cookie.split(";", 1)[0]); }); // Se a resposta tiver código 200, alteramos o conteúdo da lista de cookies p/ // so que foram obtidos na última requisição. if(connection.getResponseCode() == HttpURLConnection.HTTP_OK){ this.cookies = connection.getHeaderFields().get("Set-Cookie"); this.loginUrl = new URL(loginUrl.toString().concat("login.php?do=login")); // substituímos a URL para o recurso de login do vBulletin } } catch (IOException ex){} } Precisamos agora criar o método que fará a requisição para o recurso de login e verificará se o cookie "bb_password" foi criado. Se for, podemos retornar "true" indicando que o usuário é um membro do fórum: public boolean hasAccount(User user){ try { // Obtemos os cookies por GET retrieveCookies(); // Montamos a segunda requisição (POST) connection = (HttpURLConnection) loginUrl.openConnection(); connection.setRequestProperty("User-Agent", "Mozilla/5.0"); connection.setRequestProperty("Connection", "keep-alive"); connection.setRequestMethod("POST"); this.cookies.stream().forEach((cookie) -> { connection.addRequestProperty("Cookie", cookie.split(";", 1)[0]); }); // Definimos os parâmetros da requisição String parameters = setRequestParameters(user); connection.setRequestProperty("Content-Length", Integer.toString(parameters.length())); connection.setDoOutput(true); connection.setDoInput(true); // Submetemos a requisição try ( DataOutputStream wr = new DataOutputStream(connection.getOutputStream())) { wr.writeBytes(parameters); wr.flush(); } // Se a resposta tiver código 200, alteramos a lista de cookies if(connection.getResponseCode() == HttpURLConnection.HTTP_OK) this.cookies = connection.getHeaderFields().get("Set-Cookie"); } catch(Exception err){} // Verificamos se em toda a lista de cookies existe algum com nome "bb_password" return cookies.stream().map((cookie) -> cookie.split("=")[0]).anyMatch((name) -> (name.equals("bb_password"))); } Nossa classe ficará assim: import java.io.*; import java.net.*; import java.nio.charset.StandardCharsets; import java.util.List; public class VBulletin { private List<String> cookies; private HttpURLConnection connection; private URL loginUrl; public VBulletin connect(URL url){ this.loginUrl = url; return this; } public boolean hasAccount(User user){ try { retrieveCookies(); connection = (HttpURLConnection) loginUrl.openConnection(); connection.setRequestProperty("User-Agent", "Mozilla/5.0"); connection.setRequestProperty("Connection", "keep-alive"); connection.setRequestMethod("POST"); this.cookies.stream().forEach((cookie) -> { connection.addRequestProperty("Cookie", cookie.split(";", 1)[0]); }); String parameters = setRequestParameters(user); connection.setRequestProperty("Content-Length", Integer.toString(parameters.length())); connection.setDoOutput(true); connection.setDoInput(true); try (DataOutputStream wr = new DataOutputStream(connection.getOutputStream())) { wr.writeBytes(parameters); wr.flush(); } if(connection.getResponseCode() == HttpURLConnection.HTTP_OK) this.cookies = connection.getHeaderFields().get("Set-Cookie"); } catch(Exception err){} return cookies.stream().map((cookie) -> cookie.split("=")[0]).anyMatch((name) -> (name.equals("bb_password"))); } private void retrieveCookies(){ try { connection = (HttpURLConnection) loginUrl.openConnection(); connection.setRequestMethod("GET"); connection.setUseCaches(false); connection.setRequestProperty("User-Agent", "Mozilla/5.0"); if (cookies != null) this.cookies.stream().forEach((cookie) -> { connection.addRequestProperty("Cookie", cookie.split(";", 1)[0]); }); if(connection.getResponseCode() == HttpURLConnection.HTTP_OK){ this.cookies = connection.getHeaderFields().get("Set-Cookie"); this.loginUrl = new URL(loginUrl.toString().concat("login.php?do=login")); } } catch (IOException ex){} } private String setRequestParameters(User user) throws UnsupportedEncodingException { return new StringBuilder().append("vb_login_username=") .append(URLEncoder.encode(user.getUsername(), StandardCharsets.UTF_8.displayName())) .append("&cookieuser=1") .append("&vb_login_md5password=") .append(user.getPassword()) .append("&do=login").toString(); } } Testando e autenticando um usuário Tendo a classe VBulletin, podemos verificar se um usuário é membro assim: import java.net.MalformedURLException; import java.net.URL; public class Main { public static void main(String...args) throws MalformedURLException { // Criamos um usuário contendo nick (ou email) e senha User user = new User("renan", "senha123"); // Definimos a URL do fórum URL url = new URL("[Hidden Content]"); // Chamamos o método que autentica o usuário boolean isMember = new VBulletin().connect(url).hasAccount(user); if(isMember) System.out.println("O usuário é membro do fórum, IRRÁ! :)"); } } Espero que esse post ajude quem estiver interessado em implementar um meio de interagir com o fórum. Lembrando que, tendo os cookies armazenados (como fizemos) e enviando eles a cada requisição, é possível fazer qualquer ação que um usuário faria pelo navegador: postar um tópico, enviar mensagem particular, agradecer tópicos, reportar postagens, etc. Esse método resolve os dois problemas apontados no começo do tópico, o login será validado corretamente. Ou, você pode continuar apostando nos "Bem-vindo(a)," que ensinam por aí. :)
  2. Estava criando uma aplicação para um amigo e em um determinado momento surgiu a necessidade de checar a existência de um usuário no fórum (VBulletin) sem conexão direta com o banco de dados. Bom, criei uma classe bem fácil de utilizar e estarei compartilhando o código para quem tiver interesse em usá-la em algum projeto :D, assim você dispensa tempo escrevendo o código de conexão e se preocupa com outras funcionalidades da sua aplicação. USO Basta realizar o download das classes "VBConnection.java" e "BVConnectionException.java". Depois, inclua ambas as classes no seu projeto (como sugestão, crie um pacote separado para colocar as classes). E já está pronto para o uso. FLUXO Com três linhas de código você faz a verificação: - Instancie a classe "VBConnection" passando para o construtor o nome de usuário e senha. - Defina a URL de login com o método "setLoginURL". - Use o método "connect" para verificar se está tudo OK com a conexão. EXEMPLO: [b][color=#a52a2a]VBConnection[/color][/b] [color=#006400]con[/color] = [b][color=#ff3300]new[/color][/b] [color=#a52a2a][b]VBConnection[/b][/color]([color=#daa520] "rnxn"[/color], [color=#daa520]"senha123"[/color] ); [color=#006400]con[/color].setLoginURL([color=#daa520] "[Hidden Content]" [/color]); [b][color=#a9a9a9]/* Exemplo */[/color][/b] [b]if[/b]( [color=#006400]con[/color].connect() ){ [b][color=#a9a9a9]// conectou, faz algo...[/color][/b] } Exemplo de código 1 Exemplo de código 2 MÉTODOS setLoginURL( String s ) Parametro: String contendo a URL de login. Retorno: void. connect() Parametro: void. Retorno: true se tiver conectado, do contrário o retorno é false. EXCEÇÕES - URL de login não definida: só chame o método "connect" após setar a URL de login. - URL Mal formatada: Tenha certeza de passar uma URL válida, exemplo: [Hidden Content]" ao invés de "meuforum.com", etc. - Código de resposta diferente de 200 ( Bem sucedido ): Não há o que fazer, você pode usar o método "e.getMessage()" para visualizar qual foi o código retornado... 404, 406. A conexão só será realizada se estiver tudo OK e o código de resposta for 200. DOWNLOAD Código fonte online DOWNLOAD VBConnection.java DOWNLOAD VBConnectionException.java [/center] rnxn.
×
×
  • Criar Novo...

Informação Importante

Nós fazemos uso de cookies no seu dispositivo para ajudar a tornar este site melhor. Você pode ajustar suas configurações de cookies , caso contrário, vamos supor que você está bem para continuar.