Make you refresh the page and then see the message

5

Hello, How do I send a contact form for example, give a refresh on the page and show the sending message?

Code: Javascript:

function showAlert(type, message)
{
    if (message !== '')
    {
        if (type === '')
        {
            type = 'success';
            type = 'danger';
            type = 'info';
            type = 'warning';
        }
        $('#alert').removeClass();
        $('#alert').addClass('alert alert-' + type).html(message).slideDown();
        setTimeout("closeAlert()", 15000);
}

$(function ()
{
    $('#alert').click(function ()
    {
        closeAlert();
    });
});

function closeAlert()
{
    $('#alert').slideUp();
    $('#alert').removeClass();
}

HTML:

<div id='alert'></div>

PHP:

echo "<script>
window.onload = function ()
{
showAlert('success', 'Perfil atualizado com sucesso.');
};
</script>";

Displaying the message in another way, but it seems to me that there are security holes in this if I do not fix it. messages.php

<?php

if (isset($_GET['action']))
{
    $action = $_GET['action'];

    if($action=='registered')
    {
        echo '<div class="alert alert-success">
        <button type="button" class="close" data-dismiss="alert">&times;</button>
        <strong>Sucesso!</strong> avaliação cadastrada obrigado pela colaboração.
        </div>';
    }
}
?>

Then I include the messages wherever I want:

include("/system/messages.php");

and call via _GET:

echo '<script language= "JavaScript">
location.href="?p=cadastro&action=registered";
</script>';

So the attacker can, for example, put a path of an external script in place of the variable: link Your site would normally include the file and run everything inside it ... The rest you can imagine.

Make it safe:

// Define uma lista com os array que poderão ser chamados na URL
    $allowed = array($nomeUsuario, 'perfil-updated', 'perfil-updated-error');

 // Verifica se a variável $_GET['action'] existe E se ela faz parte da lista de arquivos permitidos
    if (isset($_GET['action']) AND (array_search($_GET['action'], $allowed) !== false))
    {
        $action = $_GET['action'];
        if($action=='perfil-updated')
        {
            echo '<div class="alert alert-success">
            <button type="button" class="close" data-dismiss="alert">&times;</button>
            <strong>Sucesso!</strong> Perfil atualizado.
            </div>';
        }
        if($action=='perfil-updated-error')
        {
            echo '<div class="alert alert-danger">
            <button type="button" class="close" data-dismiss="alert">&times;</button>
            <strong>Erro ao atualizar!</strong> Não foi possível atualizar o perfil.
            </div>';
        }
    }
    else
    {
// Se não existir variável $_GET ou ela não estiver na lista de permissões, define um valor padrão
        echo '<script language= "JavaScript">
        location.href="?p=profile&action='.$nomeUsuario.'";
        </script>';
    }
    
asked by anonymous 31.12.2015 / 05:57

3 answers

7

I have already + 1'd Pro Hands' answer because I think it will be difficult to have a simpler and more objective solution than that.

I just posted a variant, so that it would be clear to the questioner how to prevent anyone from displaying arbitrary messages (which would have no security risk, by the way).

Instead of passing the message through query , you would only pass the code of it (you can do this by keeping the original redirect to avoid duplicate submissions):

http://pagina.com/diretorio?msg=1

And in the $ _GET part, you choose the message with the desired code:

 <?php
    // convertendo o GET para numero
    $msg = isset( $_GET["msg"] ) ? abs( intval( $_GET["msg"] ) ) : 0;

    // de acordo com o numero, mostramos a mensagem correspondente:
    if( $msg == 1 ) {
       echo 'Parabéns, você conseguiu!';
    } elseif ( $msg == 2 ) {
       echo 'Faltou preencher o campo recomendação';
    } elseif ( $msg == 3 ) {
       echo 'Já existe cadastro neste email';
    } else {
       // se o número da mensagem não for 1, 2 ou 3:
       echo 'Ocorreu um problema com a mensagem de retorno.';
    }
    ...

Of course, in your code you put as many% as you need, and number the messages according to the actual case.


"Wiping" the code with array :

Instead of echo, you can simply use an array with values, making the code very short and easy to maintain:

    $msgs = array(
       'Ocorreu um problema com a mensagem de retorno.',  // 0
       'Parabéns, você conseguiu!',                       // 1
       'Faltou preencher o campo recomendação',           // 2
       'Já existe cadastro neste email'                   // 3
    );

    // pega a mensagem e converte em numero
    $msg = isset( $_GET["msg"] ) ? abs( intval( $_GET["msg"] ) ) : 0;

    // se for maior do que o numero de mensagens, usa a mensagem 0
    $msg = if( $msg > count( $msgs ) ? 0 : $msg );

    echo '<div class="mensagem">' . htmlentities( $msgs[$msg] ) . '</div>';


Applying Styles

If you want to use different styles per message:

    $msgs = array(
       'Ocorreu um problema com a mensagem de retorno.',  // 0
       'Parabéns, você conseguiu!',                       // 1
       'Faltou preencher o campo recomendação',           // 2
       'Já existe cadastro neste email'                   // 3
    );

    $estilos = array(
       'vermelho-desastre',  // 0
       'verde-do-bem',       // 1
       'vermelho-erro',      // 2
       'vermelho-erro'       // 3
    );

    $msg = isset( $_GET["msg"] ) ? abs( intval( $_GET["msg"] ) ) : 0;
    $msg = if( $msg > count( $msgs ) ? 0 : $msg );

    echo '<div class="'.$estilos[$msg].'">'.htmlentities( $msgs[$msg] ).'</div>';
    
31.12.2015 / 18:39
6

A simple way is to use $_GET with the message (encoding it for the URL) on the page.

Example:

"http://pagina.com/diretorio?msg=Hello2F%Welcome"

Then, echo the $ _GET ["msg"] if it exists, wherever you want.

It would be something like this:

<div class="_dTC">
    <div class="_vAM">
        <?php
        if(isset($_GET["msg"])){
            echo $_GET["msg"];
        }
        ?>
    </div>
</div>
    
31.12.2015 / 15:24
3

Save a cookie flag and check if it exists.

This technique is also useful for preventing duplicate submissions. However, we are not going to address the duplicate submission blocking rules here.

Example technique using just JavaScript

function createCookie(name, value, days) {
    var date, expires;
    if (days) {
        date = new Date();
        date.setTime(date.getTime()+(days*24*60*60*1000));
        expires = "; expires="+date.toGMTString();
    } else {
        expires = "";
    }
    document.cookie = name+"="+value+expires+"; path=/";
}

if (document.cookie.indexOf("updated") >= 0) {
    alert("ok, foi atualizado");

    // Remove o cookie
    createCookie("updated", 1, -1);
}else{
    // Cria o cookie
    createCookie("updated", 1, 1);
}

If you're using Google Chrome, you can check for execution by "Developer tools" - > Resources - > Cookies

In this image, it is the initial state when the cookie was generated:

Giveitarefreshandthenthealertwillpopup.Thishappensbecausethecookieexistsatthattime.

ClickOKtoclosethealert.Notethatindevelopertoolsthecookiehasbeenremoved.

AmorerealisticexamplewithPHPandHTML

ThisisthePHPscriptwhereyoureceivedatafromaform.Let'scallit"tmp.php"

// Recebeu de um formulário, fez as firulas que tinha que fazer e agora está setando o cookie:
if (isset($_GET['foo']))
{
    $cookie_name = 'updated';
    $cookie_value = 1;
    setcookie($cookie_name, $cookie_value, time() + (86400 * 30), '/'); // 86400 = 1 day

    /**
    Isso é necessário quando precisar acessar o cookie na corrente sessão pelo PHP pois a função setcookie() não atualiza os headers. 
    Caso não necessite, apenas remova ou comente a linha abaixo.
    */
    $_COOKIE[$cookie_name] = $cookie_value;
}

/**
Aqui pode fazer um include ou um header(location:...)
Um include consumirá menos em requisições, mas consumirá mais memória pois o PHP vai parsear o arquivo incluso.
Utilize o que for conveniente para o seu caso.
*/
include 'tmp.html';

//header("location: http://localhost/tmp.html");

This is the HTML page containing the form and a cookie checker. Let's call it "tmp.html"

<html lang="en" xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>test</title>
<META http-equiv="Content-Type" content="text/html; charset=UTF-8">

<script type="text/javascript">

function createCookie(name, value, days) {
    var date, expires;
    if (days) {
        date = new Date();
        date.setTime(date.getTime()+(days*24*60*60*1000));
        expires = "; expires="+date.toGMTString();
    } else {
        expires = "";
    }
    document.cookie = name+"="+value+expires+"; path=/";
}

if (document.cookie.indexOf("updated") >= 0) {
    alert("ok, foi atualizado");

    // Remove o cookie
    createCookie("updated", 1, -1);
}
</script>


</head>
<body>

<form action="tmp.php" method="get">
<input type="hidden" name="foo" value="1" />
<input type="submit" value="enviar" />
</form>

</body>
</html>

To test, go to the HTML page. Example: http://localhost/tmp.html

Press the "send" button. It will be directed to http://localhost/tmp.php?foo=1 where JavaScript will check that the cookie exists, issue alert () and then remove the cookie.

    
31.12.2015 / 09:16