Atualização 2 - lado front end
This commit is contained in:
parent
c31681f644
commit
49e96d4a4b
|
|
@ -4,31 +4,38 @@
|
|||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<link rel="stylesheet" href="./Css/padraouser.css">
|
||||
<link rel="stylesheet" href="./Css/page/Telas_acao/erro_404.css">
|
||||
<link rel="stylesheet" href="./Css/global/padraouser.css">
|
||||
<link rel="stylesheet" href="./Css/global/Blocos.css">
|
||||
|
||||
<title>Ambiente do Usuario</title>
|
||||
<title>Consulta InfluxDB</title>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<h1>Escolha Parâmetros para a Consulta</h1>
|
||||
|
||||
<form id="queryForm">
|
||||
<label for="bucket">Selecione o Bucket:</label>
|
||||
<select id="bucket" name="bucket" required>
|
||||
<option value="" disabled selected>Escolha um bucket</option>
|
||||
</select><br><br>
|
||||
|
||||
<label for="host">Selecione o Host (Servidor):</label>
|
||||
<select id="nodename" name="host" required>
|
||||
<option value="" disabled selected>Escolha um host</option>
|
||||
</select><br><br>
|
||||
|
||||
<!-- Seu conteúdo principal aqui -->
|
||||
<main id="entrada_1">
|
||||
<label for="startTime">Início (ISO 8601):</label>
|
||||
<input type="datetime-local" id="startTime" name="startTime" required><br><br>
|
||||
|
||||
</main>
|
||||
|
||||
|
||||
|
||||
<!--padrao_A1 reponsavel ter toda a estrutura que aplicara o data na tela-->
|
||||
<script src="./js/padrao_A1.js"></script>
|
||||
<script src="./js/Erro_404.js"></script>
|
||||
<label for="endTime">Fim (ISO 8601):</label>
|
||||
<input type="datetime-local" id="endTime" name="endTime" required><br><br>
|
||||
|
||||
<label for="windowPeriod">Período de Agregação (Ex.: 1m, 10s):</label>
|
||||
<input type="text" id="windowPeriod" name="windowPeriod" placeholder="Exemplo: 1m, 10s" required><br><br>
|
||||
|
||||
<button type="submit">Enviar Consulta</button>
|
||||
</form>
|
||||
|
||||
<div id="result"></div>
|
||||
|
||||
<script src="app.js"></script>
|
||||
</body>
|
||||
|
||||
</html>
|
||||
|
|
@ -21,9 +21,15 @@
|
|||
}
|
||||
|
||||
/*Cria toda a estilização do painel de pop up*/
|
||||
.pop {
|
||||
.pop1,
|
||||
.pop2 {
|
||||
|
||||
position: absolute;
|
||||
left: 28vw;
|
||||
bottom: 28vh;
|
||||
|
||||
opacity: 0;
|
||||
|
||||
z-index: 10000;
|
||||
background-color: var(--Matriz);
|
||||
border-bottom: 0.2vw solid var(--Cor_Segundaria_5_1);
|
||||
|
|
@ -34,14 +40,13 @@
|
|||
color: var(--Cor_Segundaria_5_1);
|
||||
width: 45vw;
|
||||
|
||||
overflow: hidden;
|
||||
|
||||
overflow: auto;
|
||||
|
||||
|
||||
display: flex;
|
||||
position: relative;
|
||||
flex-direction: column;
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
align-content: center;
|
||||
text-align: center;
|
||||
|
||||
|
|
@ -50,12 +55,38 @@
|
|||
|
||||
}
|
||||
|
||||
/*Coluna para alinhar, o X para fechar o pop up*/
|
||||
.colum_1 {
|
||||
width: 44vw;
|
||||
padding-top: 2vh;
|
||||
|
||||
height: 5vh;
|
||||
opacity: 1;
|
||||
display: flex;
|
||||
justify-content: start;
|
||||
align-items: center;
|
||||
align-content: center;
|
||||
|
||||
}
|
||||
|
||||
/*Coluna para alinhar, o texto de resposta*/
|
||||
.colum_2 {
|
||||
width: 44.6vw;
|
||||
height: 45vh;
|
||||
padding-bottom: 2vh;
|
||||
overflow-y: auto;
|
||||
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
align-content: center;
|
||||
|
||||
}
|
||||
|
||||
/*Cria toda a estilização de botão para fechar o pop up*/
|
||||
.X {
|
||||
position: absolute;
|
||||
left: 0.5vw;
|
||||
top: 0.8vh;
|
||||
|
||||
padding-left: 1vw;
|
||||
border: none;
|
||||
background: none;
|
||||
outline: none;
|
||||
|
|
|
|||
|
|
@ -1,14 +0,0 @@
|
|||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>Document</title>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<a href="."></a>
|
||||
</body>
|
||||
|
||||
</html>
|
||||
|
|
@ -1,8 +1,10 @@
|
|||
/* Base de comunicação com mid -abertura- */
|
||||
//Base de comunicação do front end com o back end -abertura-
|
||||
// Função para obter a URL base do servidor
|
||||
async function getApiUrl() {
|
||||
try {
|
||||
const response = await fetch('../../../php/config_url.php'); // Solicita a URL base do PHP
|
||||
//solicitação do arquivo config_url.php
|
||||
const response = await fetch('../../../php/config_url.php');
|
||||
//Aplicação de um if caso a resposta do php seja oposta ao ok
|
||||
if (!response.ok) {
|
||||
throw new Error('Network response was not ok');
|
||||
}
|
||||
|
|
@ -13,24 +15,25 @@ async function getApiUrl() {
|
|||
throw error;
|
||||
}
|
||||
}
|
||||
/* -fechamento- */
|
||||
// fechamento
|
||||
|
||||
/* Frontend - abertura - - envio da ação - */
|
||||
|
||||
// Adiciona um ouvinte de evento ao formulário de login para tratar o evento de submissão
|
||||
//conexões com fatores do front end, e a determinação de uma pequena ação para quando os dois inputs estiverem vazios -abertura-
|
||||
//Acapitação das ids do formulário
|
||||
document.getElementById("formLogin").addEventListener("submit", async function (event) {
|
||||
event.preventDefault(); // Previne o comportamento padrão do formulário
|
||||
event.preventDefault();
|
||||
|
||||
// Previne o comportamento padrão do formulário
|
||||
// Obtém os elementos do DOM correspondentes ao nome de usuário, senha e mensagem de erro
|
||||
const usernameElement = document.getElementById("username");
|
||||
const passwordElement = document.getElementById("password");
|
||||
const errorMessageElement = document.getElementById("errorMessage");
|
||||
const erro5003 = document.getElementById("erro_503");
|
||||
|
||||
const usernameElement = document.getElementById("username");//dominio
|
||||
const passwordElement = document.getElementById("password"); //senha
|
||||
const errorMessageElement = document.getElementById("errorMessage"); //painel que apresntação de erro padrão
|
||||
const erro5003 = document.getElementById("erro_503"); //pop up de erro 500
|
||||
const erro5004 = document.getElementById("erro_504"); //pop de desvio de scripts.
|
||||
|
||||
// Limpa qualquer mensagem de erro anterior e bordas de campo
|
||||
errorMessageElement.innerHTML = '';
|
||||
erro5003.innerHTML = '';
|
||||
erro5004.innerHTML = '';
|
||||
usernameElement.style.borderColor = '';
|
||||
passwordElement.style.borderColor = '';
|
||||
|
||||
|
|
@ -41,53 +44,122 @@ document.getElementById("formLogin").addEventListener("submit", async function (
|
|||
}
|
||||
|
||||
// Obtém os valores inseridos pelo usuário nos campos de nome de usuário e senha
|
||||
const username = usernameElement.value.trim();
|
||||
const password = passwordElement.value.trim();
|
||||
const username = usernameElement.value.trim();//usuário
|
||||
const password = passwordElement.value.trim();//senha
|
||||
|
||||
|
||||
/*Caso em que o usuario não preenche os dois campos inputs, ou um deles*/
|
||||
// Verifica se os campos estão preenchidos
|
||||
if (!username || !password) {
|
||||
errorMessageElement.innerHTML = `<p>Preencha ambos os campos</p>`;
|
||||
usernameElement.style.borderColor = 'red';
|
||||
passwordElement.style.borderColor = 'red';
|
||||
errorMessageElement.innerHTML = `<p>Preencha ambos os campos</p>`;//mensagem de erro padrão
|
||||
|
||||
errorMessageElement.style.height = '10vh';
|
||||
errorMessageElement.style.opacity = '1';
|
||||
errorMessageElement.style.transition = ' 1s ease';
|
||||
usernameElement.style.borderColor = 'red';//corpo do input usuario em vermelho.
|
||||
passwordElement.style.borderColor = 'red';//corpo do input senha em vermelho.
|
||||
|
||||
const tempoDeExibicao = 5000;
|
||||
setTimeout(() => {
|
||||
errorMessageElement.style.height = '10vh';//Altura do bloco de apresentação
|
||||
errorMessageElement.style.opacity = '1';//Opacidade do bloco de apresentação
|
||||
errorMessageElement.style.transition = '1s ease';//transição
|
||||
|
||||
errorMessageElement.style.height = '0vh'; // Oculta a mensagem
|
||||
usernameElement.style.borderColor = '#1478cf';
|
||||
setTimeout(() => {//Aplicação de tempo para retirar os efeitos
|
||||
|
||||
errorMessageElement.style.height = '0vh'; // Reduz o tamanho do bloco para Oculta a mensagem
|
||||
usernameElement.style.borderColor = '#1478cf'; //volta a cor do inptu, de usuário ao seu padrão
|
||||
passwordElement.style.borderColor = '#1478cf';
|
||||
|
||||
errorMessageElement.style.opacity = '0';
|
||||
errorMessageElement.style.transition = ' 1s ease';
|
||||
}, tempoDeExibicao);
|
||||
//volta a cor do inptu, de senha ao seu padrão
|
||||
errorMessageElement.style.opacity = '0'; // define a opacidade do painel de erro a zero
|
||||
errorMessageElement.style.transition = '1s ease'; // define uma tansição suave para tudo isso.
|
||||
}, 5000); //definie um time de 5 segundos, contados em milesegundos 5.000
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
//Fechamento
|
||||
|
||||
|
||||
//Camada de segurança -abertura-
|
||||
|
||||
// Função para escapar caracteres HTML, resumidamente ele pega o paramentro definido e subistitui todas as letras já definidas nela pelos termos descritos em "" para assim quebrar com quaisquer entrada de script dentro dos inputs.
|
||||
function escapeHTML(str) {
|
||||
return str
|
||||
.replace(/&/g, "&")
|
||||
.replace(/</g, "<")
|
||||
.replace(/>/g, ">")
|
||||
.replace(/"/g, """)
|
||||
.replace(/'/g, "'")
|
||||
.replace(/V/g, "'")
|
||||
.replace(/C/g, "'")
|
||||
.replace(/a/g, "'")
|
||||
.replace(/i/g, "'")
|
||||
.replace(/o/g, "'")
|
||||
.replace(/u/g, "'")
|
||||
.replace(/b/g, "'")
|
||||
.replace(/c/g, "'")
|
||||
.replace(/l/g, "'")
|
||||
.replace(/d/g, "'")
|
||||
.replace(/e/g, "'")
|
||||
.replace(/t/g, "'")
|
||||
.replace(/1/g, "'")
|
||||
.replace(/2/g, "'")
|
||||
.replace(/3/g, "'")
|
||||
.replace(/4/g, "'")
|
||||
.replace(/5/g, "'")
|
||||
.replace(/6/g, "'")
|
||||
.replace(/7/g, "'")
|
||||
.replace(/8/g, "'")
|
||||
.replace(/9/g, "'");
|
||||
|
||||
}
|
||||
|
||||
|
||||
// Aqui ele armazena em constantes os termos relacionandos a funções sqls, e funções de scripts para serem redirecionadas.
|
||||
const containsScript = /<script>|<\/script>|script/i;
|
||||
const containsSQL = /select|insert|update|delete|drop|union/i;
|
||||
|
||||
|
||||
//Aqui é definido mais duas constantes para armazenar as comparações boleanas, onde só é necessario que um dos cenários seja verdadeiro.
|
||||
const hasScriptOrSQLInUsername = containsScript.test(username) || containsSQL.test(username);
|
||||
const hasScriptOrSQLInPassword = containsScript.test(password) || containsSQL.test(password);
|
||||
|
||||
//Aplicação dentro de if se trabalhar pelo lapidar das informações de comparação, onde inicialmente ele definiu os parametros, para logo depois aplicas as compações entre eles, registrando as comparações dentro do input
|
||||
if (hasScriptOrSQLInUsername || hasScriptOrSQLInPassword) {
|
||||
erro5004.innerHTML = "<div class='colum_1'><button id='fechar' class='X'>X</button></div>"
|
||||
+ "<div class='colum_2'><p>As entradas desse formulário não podem receber scripts ou comandos SQL.</p></div>";
|
||||
console.log(escapeHTML(username));
|
||||
console.log(escapeHTML(password));
|
||||
|
||||
erro5004.style.height = '45vh'; // Ajusta a altura
|
||||
erro5004.style.opacity = '1'; // Define a opacidade
|
||||
erro5004.style.transition = '1s ease'; // Adiciona a transição
|
||||
|
||||
const fecharBotao = document.getElementById('fechar');
|
||||
fecharBotao.addEventListener('click', () => {
|
||||
erro5004.style.height = '0vh'; // Oculta a mensagem
|
||||
erro5004.style.opacity = '0'; // Define a opacidade
|
||||
erro5004.style.transition = '1s ease'; // Adiciona a transição
|
||||
});
|
||||
|
||||
return; // Interrompe o envio se houver erro
|
||||
//fechar da camada de segurança
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
||||
/* Frontend - fechamento - - envio da ação - */
|
||||
// Função principal para enviar dados criptografados para o backend
|
||||
|
||||
/* Nesse caso seria uma dupla utilização pois ele enviaria para o mid*/
|
||||
try {
|
||||
// Obtém a URL base do servidor
|
||||
// utiliza função definida no inicio da estrutura para á armazenar na constante api url
|
||||
const apiUrl = await getApiUrl();
|
||||
|
||||
// Envia uma requisição POST para o servidor de login com os dados de usuário e senha
|
||||
// Envia os dados para o backend
|
||||
const response = await fetch(`${apiUrl}/login`, {
|
||||
method: 'POST',
|
||||
headers: {
|
||||
'Content-Type': 'application/json' // Define o tipo de conteúdo como JSON
|
||||
},
|
||||
body: JSON.stringify({ username, password }) // Converte os dados para JSON antes de enviar
|
||||
|
||||
body: JSON.stringify({
|
||||
username, password
|
||||
}) // Converte os dados para JSON antes de enviar
|
||||
});
|
||||
/* - fechamento -*/
|
||||
|
||||
|
||||
|
||||
/*Frontend - Abertura - - Reação á resposta - */
|
||||
|
|
@ -180,14 +252,20 @@ document.getElementById("formLogin").addEventListener("submit", async function (
|
|||
const erro_500 = await response.json();
|
||||
const erroMessage = JSON.stringify(erro_500, null, 2); // O segundo argumento é para substituição, e o terceiro é para a indentação
|
||||
|
||||
erro5003.innerHTML = `<p> Contate o suporte suporte@itguys.com.br e informe esse erro ${erroMessage} </p>
|
||||
<button class='X' id='x'>X</button>`;
|
||||
erro5003.innerHTML =
|
||||
"<div class='colum_1'><button id='fechar' class='X'>X</button></div>"
|
||||
+
|
||||
"<div class='colum_2'><p> Contate o suporte suporte@itguys.com.br e informe esse erro"
|
||||
+
|
||||
erroMessage
|
||||
+
|
||||
"</p></div>";
|
||||
erro5003.style.height = '45vh'; // Oculta a mensagem
|
||||
erro5003.style.opacity = '1';
|
||||
erro5003.style.transition = ' 1s ease';
|
||||
|
||||
//função para fechar o pop up de erro.
|
||||
var botao = window.document.getElementById('x');
|
||||
var botao = window.document.getElementById('fechar');
|
||||
|
||||
botao.addEventListener('click', clicou);
|
||||
|
||||
|
|
@ -243,6 +321,7 @@ document.getElementById("formLogin").addEventListener("submit", async function (
|
|||
|
||||
|
||||
|
||||
|
||||
/*Caso de erro onde nem mesmo acontece uma comunicação com o servidor*/
|
||||
} catch (error) {
|
||||
console.error('Error:', error); // Loga qualquer erro ocorrido
|
||||
|
|
|
|||
|
|
@ -0,0 +1,72 @@
|
|||
// Função para verificar se a página está em um iframe
|
||||
function AnaliseDeIframe() {
|
||||
if (window.top !== window.self) {
|
||||
alert('O seu acesso ao painel de login está restrito. Não é permitido o carregamento em frames.');
|
||||
// Redireciona para a mesma URL fora do iframe
|
||||
window.top.location = 'https://dev.itguys.com.br/';
|
||||
}
|
||||
}
|
||||
|
||||
// Executa a função ao carregar a página
|
||||
window.onload = AnaliseDeIframe;
|
||||
|
||||
|
||||
document.addEventListener('DOMContentLoaded', () => {
|
||||
// Verifica se o protocolo não é HTTPS
|
||||
if (window.location.protocol !== 'https:') {
|
||||
// Redireciona para a mesma URL com HTTPS
|
||||
window.location.href = `https://${window.location.host}${window.location.pathname}`;
|
||||
}
|
||||
});
|
||||
|
||||
// Lista de URLs dos scripts permitidos
|
||||
const scriptsPermitidos = [
|
||||
'https://dev.itguys.com.br/ambiente_do_usu%C3%A1rio/js/Login/login.js', // Adicione o nome ou URL do script permitido
|
||||
'https://dev.itguys.com.br/ambiente_do_usu%C3%A1rio/js/Login/seguranca.js'
|
||||
];
|
||||
|
||||
function observarScripts() {
|
||||
// Obtenha todos os elementos <script> na página
|
||||
const scripts = document.scripts;
|
||||
const scriptsAdicionais = [];
|
||||
const scriptsNaoContados = new Set(scriptsPermitidos);
|
||||
|
||||
// Verifique cada script na página
|
||||
for (let i = 0; i < scripts.length; i++) {
|
||||
const script = scripts[i];
|
||||
const scriptSrc = script.src;
|
||||
|
||||
// Verifique se o script é externo ou interno
|
||||
if (scriptSrc) {
|
||||
// Se o script é externo
|
||||
if (!scriptsNaoContados.has(scriptSrc)) {
|
||||
scriptsAdicionais.push('Script externo com conteúdo: ' + scriptSrc);
|
||||
|
||||
} else {
|
||||
scriptsNaoContados.delete(scriptSrc);
|
||||
}
|
||||
} else {
|
||||
// Se o script é interno
|
||||
const scriptContent = script.textContent.trim();
|
||||
if (scriptContent) {
|
||||
scriptsAdicionais.push(`Script interno com conteúdo: "${scriptContent}...`); // Exibe o início do conteúdo
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Relate scripts adicionais
|
||||
if (scriptsAdicionais.length > 0) {
|
||||
console.log('Scripts adicionais não são permitidos!');
|
||||
console.log('Scripts adicionais encontrados:', scriptsAdicionais);
|
||||
}
|
||||
|
||||
// Relate scripts que não foram contados
|
||||
if (scriptsNaoContados.size > 0) {
|
||||
console.log('Scripts permitidos não encontrados:', [...scriptsNaoContados]);
|
||||
}
|
||||
}
|
||||
|
||||
// Adicione um listener para quando a página for carregada
|
||||
window.addEventListener('load', observarScripts);
|
||||
|
||||
|
||||
29
login.html
29
login.html
|
|
@ -5,17 +5,33 @@
|
|||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>Login | iTGuys</title>
|
||||
<link rel="stylesheet" href="./Css/page/Login/Estrutura_login.css">
|
||||
<link rel="icon" type="image/x-icon" href="./Acessts/Imagens/iT_Guys/logo1.png">
|
||||
<link rel="stylesheet" href="./Css/page/Login/Estrutura_login.css" />
|
||||
|
||||
<!--Bloqueia a entrada, de escripts e estilos interno, na página html-->
|
||||
<meta http-equiv="Content-Security-Policy" content="default-src 'self'; script-src 'self'; style-src 'self';">
|
||||
|
||||
<!--força o navegador usar o modo de renderização mais seguro disponível.-->
|
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge">
|
||||
|
||||
<!--Meta dados para bloquear a capitação de certas informações do usuário-->
|
||||
<meta http-equiv="Feature-Policy"
|
||||
content="geolocation 'none'; microphone 'none'; camera 'none'; fullscreen 'none'; payment 'none'; vr 'none'; autoplay 'none'; accelerometer 'none'; ambient-light-sensor 'none'; gyroscope 'none'; magnetometer 'none';picture-in-picture 'none';sync-xhr 'none'; usb 'none';clipboard-write 'none'; clipboard-read 'none'; payments 'none'; ">
|
||||
|
||||
</head>
|
||||
|
||||
|
||||
|
||||
|
||||
<!--Div usada para apresentar o pop up do caso de erro 503, usando a classe para estilizar, e a id para definir as funções do painel-->
|
||||
<div class="pop" id="erro_503">
|
||||
<div class="pop1" id="erro_503">
|
||||
</div>
|
||||
<!--Div usada para apresentar o pop up, do caso de invasão, onde o usuário tenta enviar comandos sqls ou comandos de scripts, usando a class pop2 para estilizar todo o painel, enquanto usa a id erro 504 para apresentar as informações do painel-->
|
||||
<div class="pop2" id="erro_504">
|
||||
</div>
|
||||
|
||||
<!-- Edições para aplicar uma alinhamento centralizado na página, definino a classe centralizar estilizar todo o corpo da página -->
|
||||
|
||||
<!-- Edições para aplicar uma alinhamento centralizado na página, definino a classe centralizar estilizar todo o corpo da página-->
|
||||
|
||||
<body class="centralizar">
|
||||
<main>
|
||||
|
|
@ -29,7 +45,7 @@
|
|||
</div>
|
||||
|
||||
<!--Formulario que alinha todos os inputs da tela de login, usando a id formLogin para criar a base de interatividade com o script login.js-->
|
||||
<form id="formLogin">
|
||||
<form id="formLogin"> <!--Conversar com o Thiago-->
|
||||
|
||||
<!-- Campo oculto para incluir o token CSRF -->
|
||||
<input type="hidden" name="csrf_token"
|
||||
|
|
@ -43,7 +59,7 @@
|
|||
<img src="./Acessts/Imagens/Iconis/User 2.png" alt="">
|
||||
<!--caixa de entrada para os usuario, tendo a classe login_input para estilizar ela-->
|
||||
<input class="Login_input" type="text" name="usuario" id="username"
|
||||
placeholder="usuario@dominio.com.br" autocomplete="username">
|
||||
placeholder="usuario@dominio.com.br" writingsuggestions="on" autocomplete="username">
|
||||
</div>
|
||||
<!--Div responsavel por alinhar a label e o input realacionados ao senha do usuário, usando a classe Senha focado unicamente e alinhar todos os elementos relacionados a senha-->
|
||||
<div class="Senha">
|
||||
|
|
@ -51,7 +67,7 @@
|
|||
|
||||
<!--caixa de entrada para a senha do usuário, tendo a classe Senha_input para estilizar ela-->
|
||||
<input class="Senha_input" type="password" name="senha" id="password"
|
||||
placeholder="escreva sua senha" autocomplete="current-password">
|
||||
placeholder="escreva sua senha" writingsuggestions="on" autocomplete="new-password">
|
||||
</div>
|
||||
|
||||
<div id="errorMessage" class="error-message"></div>
|
||||
|
|
@ -66,6 +82,7 @@
|
|||
</main>
|
||||
<!--Script responsavel por lidar com o retiro das informações e as processar-->
|
||||
<script src="./js/Login/login.js"></script>
|
||||
<script src="./js/Login/seguranca.js"></script>
|
||||
</body>
|
||||
|
||||
</html>
|
||||
Loading…
Reference in New Issue