Campo Read Only permite atualização

Bom dia!
Tive um problema de segurança com uma aplicação. O usuário manipulou o valor de um Campo read-only.

Percebi que o ScriptCase não valida no servidor se um campo é read-only.

Inspecionei o HTML gerado e percebi que o scriptcase gera campos invisíveis de entrada de dados para os campos read-only. isso quer dizer que se o usuário alterar o valor do campo invisível o scriptcase depois não valida isso no servidor, permitindo a alteração do campo,ainda que tenha sido marcado como read-only.

Existem vários plugins de browser que permitem a fácil manipulação desses campos mesmo sem ter que inspecionar o código fonte.
O web-developer é um bom exemplo disso, onde o usuário sequer precisa ter conhecimento de html para fazer a manipulação do fonte, basta exibir os campos escondidos e habilitar os campos não editáveis.

Na minha opinião o ScriptCase deveria validar isso do lado do servidor para evitar esse tipo de problema.

O que vcs acham ?

1 Curtida

Percebi que a mesma situação ocorre se você configurar o tipo de dado como label ou marcar o atributo “exibir como label”.

Nos dois casos acima considero polêmico a possibilidade de alterar o registro, mas no caso do read-only, ao meu ver, é uma falha de segurança grave do ScriptCase.

1 Curtida

Experimentem para mitigar esse problema, colocar isso no On-Load e fazer testes:

// Bloquear Botão Direito do Mouse.

echo "
<script>
if (document.addEventListener) {
    document.addEventListener('contextmenu', function(e) {
        e.preventDefault();
        return false;
    });
} else { //Versões antigas do IE
    document.attachEvent('oncontextmenu', function(e) {
        e = e || window.event;
        e.returnValue = false;
        return false;
    });
}
</script>
";


// Bloquear CTRL+U e CTRL+S

echo "
<script>
if (document.addEventListener) {
    document.addEventListener('keydown', bloquearSource);
} else { //Versões antigas do IE
    document.attachEvent('onkeydown', bloquearSource);
}

function bloquearSource(e) {
    e = e || window.event;

    var code = e.which || e.keyCode;

    if (
        e.ctrlKey &&
        (code == 83 || code == 85) //83 = S, 85 = U
    ) {
        if (e.preventDefault) {
            e.preventDefault();
        } else {
            e.returnValue = false;
        }

        return false;
    }
}
</script>
";


// Proteger CSS

?>
<style>
/*desabilita a seleção no body*/
body {
    -webkit-touch-callout: none; /* iOS Safari */
      -webkit-user-select: none; /* Chrome/Safari/Opera */
       -khtml-user-select: none; /* Konqueror */
         -moz-user-select: none; /* Firefox */
          -ms-user-select: none; /* Internet Explorer/Edge */
              user-select: none;
}

/*habilita a seleção nos campos editaveis*/
input, textarea {
    -webkit-touch-callout: initial; /* iOS Safari */
      -webkit-user-select: text; /* Chrome/Safari/Opera */
       -khtml-user-select: text; /* Konqueror */
         -moz-user-select: text; /* Firefox */
          -ms-user-select: text; /* Internet Explorer/Edge */
              user-select: text;
}

/*habilita a seleção nos campos com o atributo contenteditable*/
[contenteditable=true] {
    -webkit-touch-callout: initial; /* iOS Safari */
      -webkit-user-select: all; /* Chrome/Safari/Opera */
       -khtml-user-select: all; /* Konqueror */
         -moz-user-select: all; /* Firefox */
          -ms-user-select: all; /* Internet Explorer/Edge */
              user-select: all;
}
</style>
<?php

No OnValidate recarregar da base novamente os campos Read-Only / Label:

// Ok Lançamento já existe
if ({LancamentoID}>0) {

    // Recarregar campos Read-Only / Label
	
	/* Macro sc_lookup */

	$sql ="
	SELECT
		ValorCusto,
		Status
	FROM
		Pedido
	WHERE
	    LancamentoID = {LancamentoID}
	";

	sc_lookup(chk_ped, $sql);

	/* Erro no lookup */
	if (FALSE === {chk_ped}) {
		sc_error_message("Ocorreu um erro no acesso ao banco de dados.<BR>");
	}
	elseif (empty({chk_ped})) { /* EOF */

		// CONTINUA...
		
	}
	else {

		/* Inclua aqui sua rotina de processamento */

		{ValorCusto} = {chk_ped[0][0]};
		{Status} = {chk_ped[0][1]};
		
	}	

}

// Refazer calculos e validações com campos Read-Only / Label referente ao seu projeto.

Normalmente esse código a gente usa em páginas mais sensíveis externas de acesso ao público,
em geral.