Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
Por indicação de um amigo aqui do forum, coloquei um script php para proteção contra ataques do tipo "CSRF"
antes de colocar este script, eu rodava o arquivo de login no acunetix, e me voltava uma vulnerabilidade de CSRF;
agora com o script me volta mais de 50, já que o script cada vez que é chamado troca o nome dos campos.
seriosamente, este codigo que eu coloquei do script de proteção, está gerando mais vulnerabilidade?
deem uma olhada no codigo, e me dizem se é correto o que eu fiz.
csrf.class.php
<?php
/*
* newPHPClass_1 [ TIPO ]
* Descricao
* @author Luan Martins
* @copyright (c) year, Luan Martins - LM Desenvolvimentos
*/
class Csrf {
//inicio de codigo
public function get_token_id(){
if(isset($_SESSION['token_id'])){
return $_SESSION['token_id'];
}else{
$token_id = $this->random(10);
$_SESSION['token_id'] = $token_id;
return $token_id;
}
}
public function get_token(){
if(isset($_SESSION['token_value'])){
return $_SESSION['token_value'];
}else{
$token = hash('sha256', $this->random(500));
$_SESSION['token_value'] = $token;
return $token;
}
}
public function check_valid($method) {
if($method == 'post' || $method == 'get') {
$post = $_POST;
$get = $_GET;
if(isset(${$method}[$this->get_token_id()]) && (${$method}[$this->get_token_id()] == $this->get_token())) {
return true;
} else {
return false;
}
} else {
return false;
}
}
public function form_names($names, $regenerate) {
$values = array();
foreach ($names as $n) {
if($regenerate == true) {
unset($_SESSION[$n]);
}
$s = isset($_SESSION[$n]) ? $_SESSION[$n] : $this->random(10);
$_SESSION[$n] = $s;
$values[$n] = $s;
}
return $values;
}
private function random($len) {
if (function_exists('openssl_random_pseudo_bytes')) {
$byteLen = intval(($len / 2) + 1);
$return = substr(bin2hex(openssl_random_pseudo_bytes($byteLen)), 0, $len);
} elseif (@is_readable('/dev/urandom')) {
$f=fopen('/dev/urandom', 'r');
$urandom=fread($f, $len);
fclose($f);
$return = '';
}
if (empty($return)) {
for ($i=0;$i<$len;++$i) {
if (!isset($urandom)) {
if ($i%2==0) {
mt_srand(time()%2147 * 1000000 + (double)microtime() * 1000000);
}
$rand=48+mt_rand()%64;
} else {
$rand=48+ord($urandom[$i])%64;
}
if ($rand>57)
$rand+=7;
if ($rand>90)
$rand+=6;
if ($rand==123) $rand=52;
if ($rand==124) $rand=53;
$return.=chr($rand);
}
}
return $return;
}
}
php do login
$errors = "";
$csrf = NEW Csrf();
// Gere e valide o Id do token
$token_id = $csrf->get_token_id();
$token_value = $csrf->get_token($token_id);
// Gere nomes de formulário aleatório
$form_names = $csrf->form_names(array('nome', 'senha'), false);
if(isset($_POST[$form_names['nome']], $_POST[$form_names['senha']])) {
// Verifique se o valor e o id do token são válidos.
if($csrf->check_valid('post')) {
// Obtenha as variáveis do formulário.
IF(ISSET($_POST['logar'])){
$nome = filter_input(INPUT_POST, (string)$form_names['nome'] ,FILTER_SANITIZE_STRING ,FILTER_FLAG_ENCODE_AMP);
$senha = filter_input(INPUT_POST, (string)$form_names['senha'] ,FILTER_SANITIZE_STRING ,FILTER_FLAG_ENCODE_AMP);
$errors = "";
$nome = primeira_limpada_string($nome);
$senha = primeira_limpada_string($senha);
IF($nome == "" || $senha == ""){
$errors .= "✖ Campos vasios!<br>";
}
IF($errors == ""){
$verifica_1 = sintaxy_nome($nome);
$verifica_3 = sintaxy_senha($senha);
if ($verifica_1 == "sim"){ // verificação de caracteres inserido pelo usuário
$errors .= "Nome com caractere invalido<br>";
}else if($verifica_3 == "sim"){ // verificação de caracteres inserido pelo usuário
$errors .= "Senha contem caractere invalido<br>";
}
if($errors == ""){
$userPDo = new UsuarioPdo();
$dados = $userPDo->estou_banido($nome);
if($dados == TRUE){
$sessao = new Sessao();
$sessao->banSessao();
}else{
$_username = $nome;
$header = new HeaderPdo();
$_password = $header->criptografia_Hash_MD5($senha);
$usuario = new Usuario($_username, $_password);
$tentativa = new UsuarioPdo();
$logou = $tentativa->fazer_login($usuario, $_password);
IF($logou == TRUE){
$sessao = new Sessao();
$sessao->carregaSessao($logou);
}else{
$errors .="✖ Dados invalidos!";
}
}
}else{
echo $errors;
}
}
}
// A função do formulário vai aqui
}
// Recrie um novo valor aleatório para o formulário.
$form_names = $csrf->form_names(array('nome', 'senha'), true);
}
formulario html
<form method="POST" action="" autocomplete="off">
<table>
<tr>
<td colspan="2"><h1 style="margin-bottom: 25px;">▾ Fazer Login</h1></td>
</tr>
<tr>
<input type="hidden" name="<?= $token_id; ?>" value="<?= $token_value; ?>" />
<input class="campo_texto" name="<?= $form_names['nome'] ?>" min="4" max="15" placeholder="Usuário" type="text" autocomplete="off" style="display: none" disabled>
<td><div style="
border-top-left-radius: 3px; border-bottom-left-radius: 3px;
margin-left: 20px; width:40px; height:40px; background: white;">
<img class="icon_login"src="imagens/icons/index/user.png" alt=""/></div></td>
<td><input class="campo_texto" name="<?= $form_names['nome'] ?>" min="4" max="15" placeholder="Usuário" type="text" autocomplete="off"></td>
</tr>
<tr>
<td><div style="
border-top-left-radius: 3px; border-bottom-left-radius: 3px;
margin-left: 20px; width:40px; height:40px; background: white;">
<img class="icon_login" src="imagens/icons/index/password.png" alt=""/></div></td>
<td><input class="campo_texto" name="<?= $form_names['senha'] ?>" min="1" max="15" placeholder="************" type="password" autocomplete="off"></td>
</tr>
<tr>
<td colspan="2"><input class="campo_btn" type="submit" name="logar" value="➲ Confirmar Login"</td>
</tr>
<tr>
<td colspan="2">
<p class="resposta">
<i class="fa fa-check-circle" aria-hidden="true"></i> Ao fazer login no <?php echo NOMEHOTEL ?>, você concorda com todas as regras e termos de uso.
</p>
</td>
</tr>
</table>
<p style="color:red; font-family: verdana; font-weight: bold; padding-left: 20px; padding-top: 30px;"><?php echo $errors; ?></p>
</form>Carregando comentários...