Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
Boa Noite FÓRUM.
Estou com uma dúvida sobre um certo código.
Estou criando um sistema de avaliação, onde o aluno avalia o professor. Neste sistema, eu tenho uma condição onde o mesmo aluno não pode responder o questionário 2x.
Estou fazendo isso pegando o ip da máquina ( ou aparentemente acho que estou fazendo isso ).
Utilizei esse código e não deu certo.
function getIp()
{
$variables = array('REMOTE_ADDR',
'HTTP_X_FORWARDED_FOR',
'HTTP_X_FORWARDED',
'HTTP_FORWARDED_FOR',
'HTTP_FORWARDED',
'HTTP_X_COMING_FROM',
'HTTP_COMING_FROM',
'HTTP_CLIENT_IP');
$return = 'Unknown';
foreach ($variables as $variable)
{
if (isset($_SERVER[$variable]))
{
$return.= $_SERVER[$variable]." - ";
}
}
return $return;
}
$_SERVER['LOCAL_ADDR];
$_SERVER['REMOTE_ADDR];
gethostbyaddr($_SERVER['REMOTE_ADDR']);
gethostbyaddr($_SERVER['LOCAL_ADDR']);
Já usei todos esses e não consigo o que preciso.
Eu preciso de um comando que pega algum numero fixo e único de uma máquina que nunca altere, até mesmo quando troca de rede. EXISTE ESTE TIPO DE COMANDO ?O que você procura é o endereço do MAC, porém eu estive buscando um tempo atras e o pessoal passou para mim que capturar o endereço do MAC de uma máquina é quase impossível.
O mesmo aluno não pode responder duas vezes o questionário, porem a mesma máquina pode ser usada por outro aluno para responder (eu acho), logo tentar fazer bloqueio por IP ou MAC ou número de série do HD não é recomendável. O correto seria exigir login do aluno e guardar o login em um tabela toda vez que o questionário fosse respondido com sucesso. Assim ao usuário tentar efetuar o login você verifica se o mesmo já respondeu.
Pelo que entendi, ele não tem um método de autenticação, por isso quer bloquear por ip. Mas caso ele tenha, aí sim, esse seria o melhor método para fazer esse limite de avaliações.
Então, eu não posso exigir uma identificação do Usuário, porque senão comprometia a segurança do meu sistema. ( O aluno ficaria com receio de avaliar o professor corretamente, caso este pense que será identificado)
O que eu preciso é realmente um bloqueio. Esse do mac ou pelo serial do HD seria perfeito. Alguém sabe fazer ?
Aproveitando o mesmo tópico, que é uma pergunta relevante sobre o assunto, achei este código aqui, e funciona sobre o IP.
<script type="text/javascript">
/**
* Get the user IP throught the webkitRTCPeerConnection
* @param onNewIP {Function} listener function to expose the IP locally
* @return undefined
*/
function getUserIP(onNewIP) { // onNewIp - your listener function for new IPs
//compatibility for firefox and chrome
var myPeerConnection = window.RTCPeerConnection || window.mozRTCPeerConnection || window.webkitRTCPeerConnection;
var pc = new myPeerConnection({
iceServers: []
}),
noop = function() {},
localIPs = {},
ipRegex = /([0-9]{1,3}(\.[0-9]{1,3}){3}|[a-f0-9]{1,4}(:[a-f0-9]{1,4}){7})/g,
key;
function iterateIP(ip) {
if (!localIPs[ip]) onNewIP(ip);
localIPs[ip] = true;
}
//create a bogus data channel
pc.createDataChannel("");
// create offer and set local description
pc.createOffer(function(sdp) {
sdp.sdp.split('\n').forEach(function(line) {
if (line.indexOf('candidate') < 0) return;
line.match(ipRegex).forEach(iterateIP);
});
pc.setLocalDescription(sdp, noop, noop);
}, noop);
//listen for candidate events
pc.onicecandidate = function(ice) {
if (!ice || !ice.candidate || !ice.candidate.candidate || !ice.candidate.candidate.match(ipRegex)) return;
ice.candidate.candidate.match(ipRegex).forEach(iterateIP);
};
}
// Usage
getUserIP(function(ip)
{
document.getElementById("ip").innerHTML = ip;
}
);
</script>
//PRA EXIBIR O IP DA REDE
<?php
echo "<span id='ip'></span><br>";
?>
Como eu faço para pegar este IP da função JS e jogar em uma variável PHP ?Cara, o próprio php tem uma função de pegar ip. [$_SERVER](https://secure.php.net/manual/pt_BR/reserved.variables.server.php)
Utilize isso.
$_SERVER["REMOTE_ADDR"];Amigo, já tentei esses códigos simples, e nenhum deles funcionou(Porque eu não sei). Tive que partir para os mirabolantes. Este que citei no outro post, deu certo, mas não consigo passar para uma variável php. Essa é a dúvida agora.
Caso você esteja utilizando o acesso via localhost, talvez não funcione, talvez.
Da uma olhada nesse topico.
Realmente, o remote_addr não funcionou pra você pq talvez você esteja no localhost, mas em um servidor web funciona normal.
E pra você conseguir o endereço MAC de alguém é necessário você fazer um software, fazer o usuário baixar ele pra que possa ser possível capturar o endereço MAC, igual os bancos fazem pra garantir que somente aquela máquina do usuário tenha acesso permitido via desktop.
Faz o usuário cadastrar somente o número de celular dele e mete um autenticador do google, aquele de 2 fatores, pro usuário só responder o questionário quando fizer a autenticação usando o número de celular dele com leitor de qr code, quando ele inserir o código correto que é informado no celular dele pelo autenticador do google você contabiliza, pra quando chegar no 2 você barrar ele, dessa forma você evita o usuário burlar o sistema na sacanagem, pra burlar ele precisaria de outro celular com leitor de qrcode + autenticador do google + um número diferente, aí é onde entraria o IP de forma secundária, pra colocar mais um elemento pra dificultar. Essa é uma forma melhor do que session, ip, cookie, pq tudo isso sozinho, pra esse seu caso, não vai garantir o funcionamento da forma como você quer.
Bruno Mars, seria interessante isso, mas eu não faço a mínima ideia de como fazer. E meu site está online, hospedado na hostinger, não é local. Pior que no local, dava certo. Só que me trazia o (::1) o ipv6, e quando teste web, vem nada.
O código acima, consegui resolver o problema de achar o ip, mas não consigo pegar esse número para manipulá-lo. Eu tenho outras condições que ajudam a formar uma chave composta de segurança, mas essa é essencial para o funcionamento.
Se souber do serial hd, pode me dizer ? Ou se saber também sobre o código acima, já ficaria muito grato.
Pra pegar o IP daquele script que você passou e que funcionou aí pra você, tenta fazer algo assim:
<script type="text/javascript">
/**
* Get the user IP throught the webkitRTCPeerConnection
* @param onNewIP {Function} listener function to expose the IP locally
* @return undefined
*/
function getUserIP(onNewIP) { // onNewIp - your listener function for new IPs
//compatibility for firefox and chrome
var myPeerConnection = window.RTCPeerConnection || window.mozRTCPeerConnection || window.webkitRTCPeerConnection;
var pc = new myPeerConnection({
iceServers: []
}),
noop = function() {},
localIPs = {},
ipRegex = /([0-9]{1,3}(\.[0-9]{1,3}){3}|[a-f0-9]{1,4}(:[a-f0-9]{1,4}){7})/g,
key;
function iterateIP(ip) {
if (!localIPs[ip]) onNewIP(ip);
localIPs[ip] = true;
}
//create a bogus data channel
pc.createDataChannel("");
// create offer and set local description
pc.createOffer(function(sdp) {
sdp.sdp.split('\n').forEach(function(line) {
if (line.indexOf('candidate') < 0) return;
line.match(ipRegex).forEach(iterateIP);
});
pc.setLocalDescription(sdp, noop, noop);
}, noop);
//listen for candidate events
pc.onicecandidate = function(ice) {
if (!ice || !ice.candidate || !ice.candidate.candidate || !ice.candidate.candidate.match(ipRegex)) return;
ice.candidate.candidate.match(ipRegex).forEach(iterateIP);
};
} document.getElementById("ip").value = ip;
}
);
</script>
<input type="hidden" name="pegar_ip" id="ip">
Veja que adicionei a input hidden no final pra que você possa pegar o ip através de um formulário e fiz uma pequena alteração em document.getElementById("ip").innerHTML mudei para document.getElementById("ip").value , isso faz com que o endereço de ip apareça no campo da input pra que você possa pegar ele via post ou get e manipular ele da forma como você quiser.
Sobre o autenticador, se quiser usar e mexer você vai precisar usar a API do google autenticador, é uma api que o google fornece pra que a comunidade possa usar.Eu tinha visto algo parecido, mas não tinha dado certo. Foi só mudar do innerHTML para value, que deu certo.
VLW
Se alguém souber como pegar o n° serial do hd com php ou javascript, fico eternamente grato.
Essas funções são tudo números que podem ser alterados, por mais que você capture o ip de alguém ainda vai ser possível burlar o questionário e responder mais de 2x, o seu professor pra pregar uma peça em vocês pode usar proxy's e responder o questionário 100x, alterar o ip manualmente e responder mais 5x/6x ou até mesmo usar os ip's do opera com vpn embutida e responder mais umas 5x.
É muito mais fácil você usar o seu banco de dados à seu favor e limitar o número de vezes que o aluno pode responder o questionário, que no caso é 2x. Você poem uma coluna "limite_questionario", adiciona 2 nela por padrão, faz a verificação e já era.
A única coisa que os ips podem fazer nesse caso específico é complementar a segurança, como armazenar em um log o número do ip dos alunos que tentaram responder mais de 2x ou até mesmo armazenar os ips de alunos que tentaram burlar o sistema utilizando proxy's e por aí vai.