• Bannato Super User

    codice html via mysql - problema modifica codice

    Buongiorno a tutti

    Utilizzo uno script mysql php per inviare messaggi privati
    all'interno del mio sito.

    Tramite una casella di testo in amministrazione (message.php vedi codice
    pagine in basso) inserisco un messaggio (testo + link) che viene inserito
    in mysql e dopo recapitato ai singoli utenti.


    PROBLEMA: quando invio un messaggio l'utente che lo riceve
    vede solo testo e non collegamenti e immagini html cliccabili
    dunque non mi accetta il codice html anche se invio un
    messaggio con puro codice html (esempio:
    <a href="h ttp://w ww .miosito/countries.php">Countries</a> )


    Arriva sempre solo codice di testo e mai codice html dunque non
    arriva un messaggio con un collegamento cliccabile.

    Ho notato che quando i messaggi inviati dall'amministazione
    vengono inseriti in mysql vengono modificati e dunque il codice
    html risulta alterato e dunque perde le sue funzioni nel momento
    in cui utente riceve il messaggio.

    esempio di messaggio salvato nel mysql (alterato da mysql)
    (&lt A href=&quot h ttp ://google.it&quot &gt Google&lt /A&gt )

    Chiedo un aiuto, se potete spiegatemi come poter risolvere in
    modo semplice, sono alle prime armi con mysql.

    Postatemi per favore una possibile soluzione al mio problema per
    poter cosi inviare sempre tramite mysql messaggi con codice html
    che risulta funzionante e i link cliccabili ai singoli utenti alla
    ricezione del messaggio.

    Grazie mille.


    codice pagina invio messaggi pannello amministratore (message.php)

    <?php
    require ('config.php');
    $user=$_COOKIE["usNick"];

    $sql = "SELECT * FROM tb_users WHERE username='$user'";
    $result = mysql_query($sql);
    $row = mysql_fetch_array($result);

    mysql_close($con);
    if ($row['account'] !="premium"){
    echo"
    <p>Only Admin Can Send Messages To Members</p>
    ";
    include ('footer.php');
    exit();
    }
    ?>

    <script type="text/javascript">

    /***********************************************

    • Textarea Maxlength script- ? Dynamic Drive (w ww. dynamicdrive.com)
    • This notice must stay intact for legal use.
    • Visit h ttp://w ww.dynamicdrive.com/ for full source code
      ***********************************************/

    function ismaxlength(obj){
    var mlength=obj.getAttribute? parseInt(obj.getAttribute("maxlength")) : ""
    if (obj.getAttribute && obj.value.length>mlength)
    obj.value=obj.value.substring(0,mlength)
    }

    </script>

    <?

    if (isset($_POST["sendto"])) {

    if( strtolower($_POST['code'])!= strtolower($_SESSION['texto'])){
    echo "SECURITY CODE ERROR... ";

    exit();
    }
    $sendfrom=$_COOKIE["usNick"];
    $sendto=limpiar($_POST["sendto"]);
    $comments=limpiar($_POST["comments"]);

    if ($sendto==""){echo "Error"; exit();}
    if ($comments==""){echo "Error"; exit();}

    $eltiempo=time();
    $lafecha=date("d-m-y H:i",$eltiempo);
    require('config.php');
    $query = "INSERT INTO tb_messenger (sendfrom, sendto, date, comments) VALUES('$sendfrom','$sendto','$lafecha','$comments')";
    mysql_query($query) or die(mysql_error());
    mysql_close($con);
    echo "<br><br>Your Message Has Been Sent Correctly";

    ?>
    </font>

    <?
    exit();
    }
    ?>

    Use the form below to contact a member (for admin only).

    <br><br>
    <div align="center"><div id="form">
    <fieldset>
    <legend> All Fields Required </legend>

    <form method="POST" action="index.php?op=3">

    <table width="400" border="0" align="center">
    <tr>
    <td width="150" align="left"><label>Member</label></td>
    <td width="250" align="left"><select name="sendto" class="combo" tabindex="1">
    <option value=""></option>

    <?
    require('config.php');
    $sendfrom=$_COOKIE["usNick"];
    $tabla = mysql_query("SELECT * FROM tb_users ORDER BY username ASC"); // selecciono todos los registros de la tabla usuarios, ordenado por nombre
    mysql_close($con);
    while ($row = mysql_fetch_array($tabla)) {

    echo "<option value='".$row["username"]."'>".$row["username"]."</option>

    ";

    }
    ?>

    </select></td>
    </tr>
    <tr>
    <td width="150" align="left"><label>Comments</label></td>
    <td width="250" align="left"><textarea name="comments" rows="20" maxlength="1000" onkeyup="return ismaxlength(this)" tabindex="2"></textarea></td>
    </tr>

    <tr>
    <td width="150" align="left"> </td>
    <td width="250" align="right"><input type="submit" value="Submit" class="submit" tabindex="3" />
    </td>
    </tr>
    </table>

    </form>
    </fieldset>
    </div></div>




    codice pagina ricezione messaggi dell'utente (readmessage.php)

    <?
    session_start();
    ?>

    <? include('header.php');?>

    <? include('up_banner_468x60.php');?>

    <?
    require ('config.php');

    function limpiare($mensaje)
    {$mensaje = htmlentities(stripslashes(trim($mensaje)));
    $mensaje = str_replace("'"," ",$mensaje);
    $mensaje = str_replace(";"," ",$mensaje);
    $mensaje = str_replace("$"," ",$mensaje);
    return $mensaje;}
    $id=limpiare($_GET["id"]);
    $lole=$_COOKIE["usNick"];
    $sql = "SELECT * FROM tb_messenger where id='$id' and sendto='$lole'";
    $result = mysql_query($sql);
    $row = mysql_fetch_array($result);
    $query = "UPDATE tb_messenger SET status='read' where id='$id'"; mysql_query($query) or die(mysql_error());
    mysql_close($con);
    ?>
    <br>
    <div align="center"><div id="form">
    <fieldset>
    <legend> Read Message </legend>

    <form method="POST" action="replysms.php?to=<?= $row["sendfrom"] ?>">
    <table width="400" border="0" align="center">
    <tr>
    <td width="150" align="left"><label>Date</label></td>
    <td width="250" align="left"><? echo $row["date"]; ?></td>
    </tr>
    <tr>
    <td width="150" align="left"><label>From</label></td>
    <td width="250" align="left"><? echo $row["sendfrom"]; ?></td>
    </tr>
    <tr>
    <td width="150" align="left"><label>Message</label></td>
    <div style= width: 250px; height: 400px; <p><? echo $row["comments"]; ?></div>
    </tr>
    <tr>
    <td width="150" align="left"> </td>
    <td width="250" align="right"><input type="submit" value="Reply" class="submit" tabindex="4" />
    </td>
    </tr>
    </table>
    </form>
    </fieldset>
    </div></div>

    <? include('down_banner_468x60.php');?>

    <? include('footer.php'); ?>




    struttura mysql parte di gestione dei messaggi inviati


    --
    -- Table structure for table tb_messenger

    CREATE TABLE IF NOT EXISTS tb_messenger (
    id int(11) NOT NULL auto_increment,
    sendfrom varchar(11) collate latin1_general_ci NOT NULL,
    sendto varchar(11) collate latin1_general_ci NOT NULL,
    date varchar(35) collate latin1_general_ci NOT NULL,
    comments varchar(150) collate latin1_general_ci NOT NULL,
    status varchar(11) collate latin1_general_ci NOT NULL default 'unread',
    PRIMARY KEY (id)
    ) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_general_ci AUTO_INCREMENT=22026 ;



  • Bannato Super User

    Ho messo degli spazi nei domini perchè non li accetta in questo forum, vi prego aiutatmi per risolvere il problema


  • User

    semplicemente perchè effettui htmlentities prima di inserirli nel database??


  • Bannato Super User

    Sono alle prime armi con phpmyadmin

    se mi spighi con degli esempio forse ti capisco.

    fammi capire di cosa si tratta e come fare, grazie
    ciao


  • User

    cosa centra phpmyadmin??

    
    $sendfrom=$_COOKIE["usNick"];
    $sendto=limpiar($_POST["sendto"]);
    $comments=limpiar($_POST["comments"]);
    
    if ($sendto==""){echo "Error"; exit();}
    if ($comments==""){echo "Error"; exit();}
    
    

    in questo pezzo di codice, invii alla funzione 'limpiar' come parametro il testo del messaggio, la funzione limpiar non esiste in php ,ma tu ne hai definita una 'limpiare' (con una 'e' in piu), quindi supponiamo che sia questa la funzione chiamata...
    ora cosa fa quata funzione??
    la funzione htmlentities parsa i caratteri html come < > & / ecc in modo che,appunto ,non si comportino come codice html ma come caratteri.
    come fa questa funzione a parsarli? semplice, li sostituisce con caratteri di escape come > ...
    quindi la stringa che infili nel db, una volta nella pagina web secondo te verrà interpretata come html dopo che ne hai parsato il codice??


  • Bannato Super User

    Se c'è qualcuno che sa la soluzione che posti le righe modificate qui altrimenti non riesco proprio

    lo script non l'ho fatto io dunque non so tecnicamente come funziona

    spero che qualuno posso aiutarmi, grazie


  • Consiglio Direttivo

    Ciao guadagnaeuro e benvenuto nel Forum GT

    una volta estratto il dato dal Db prova a processarlo così per visualizzarlo:
    [PHP]echo html_entity_decode($testopvt);[/PHP]
    😉


  • Bannato Super User

    @Samyorn said:

    Ciao guadagnaeuro e benvenuto nel Forum GT

    una volta estratto il dato dal Db prova a processarlo così per visualizzarlo:
    [php]echo html_entity_decode($testopvt);[/php];)

    Ciao sam

    ho provato la tua funzione ma il codice lo vedo giusto ma non è cliccabile, non è html

    CODICE ORIGINALE INVIATO AL MYSQL VIA WEB
    <a href="sito(punto)it">sito< a>

    CODICE MEMORIZZATO NEL MYSQL
    &lt a href=&quot sito(punto)it&quot &gt sito&lt a&gt

    CODICE OTTENUTO CON echo html_entity_decode($testopvt);
    < a href=" sito(punto)it" > sito< a>

    Ancora non è cliccabile ci sono degli spazi che non lo rendono HTML, come posso risolvere?

    Coma mai non diventa come il codice originario inviato?

    Grazie a chi mi aiuta, se potete postate degli esempio o ancora meglio le parti gia modificate

    C'è uno spazio prima dell http che mette da solo il mysql e non so il motivo

    come potreui risolvere?

    N-B. (punto) l'ho messo io altrimenti non accetta il .


  • Consiglio Direttivo

    guardando meglio il codice salvato su Db effettivamente manca qualcosa

    < dovrebbe diventare < e non &lt e così per gli altri
    poi vedo che non c'è proprio lo slash
    il problema è la funzione limpiare che difatti sostituisce ; con degli spazi

    puoi provare a salvare i dati parsandoli con
    [php] $testopvt= addslashes(htmlentities($testopvt, ENT_QUOTES));[/php] e quando li recuperi
    [php]echo stripslashes(html_entity_decode($testopvt));[/php]
    elimina la riga
    [PHP] $mensaje = str_replace(";"," ",$mensaje);[/PHP]
    e dovrebbe andare 😉


  • Bannato Super User

    Ciao samyorn

    volevo dirti che ho risolto semplicemente cancellano la funzione limpiar che mi alterava i dati e dunque alterava il passaggio nel mysql.

    Sono arrivato grazie alla tua spiegazione dunque anziche correggere i problemi che produce questa funziona limpiar l'ho cancellata e cosi nel mysql arrivano codici html senza alcuna alterazione dunque perfettamente funzionanti.

    grazie ancora per il suggeriento.

    Sono nuovo nel php e ancora non lo conosco, in ogni caso mi hai permesso di trovare qeusta soluzione, grazie mille.

    buona notte


  • Consiglio Direttivo

    @guadagnaeuro said:

    .....e cosi nel mysql arrivano codici html senza alcuna alterazione dunque perfettamente funzionanti.

    Fai attenzione che questa non è cosa buona...rischi gravi SQL injection facendo così
    Ti consiglio di fare come ti ho suggerito al precendete post 😉
    :ciauz:


  • Bannato Super User

    Ciao samyorn

    ho provato col tuo medoto ma non funziona, appaiono i link cn gli stessi errori di priva, col solito spazio prima del link che invalida il codice html.

    Se puoi suggeriscimi un'altro modo che funzioni, col tuo modo non mi va proprio.

    mi spieghi cosa sono gli jniection ?


  • Consiglio Direttivo

    Hai tolto questa riga?
    [php] $mensaje = str_replace(";"," ",$mensaje); [/php]

    o meglio, togli la funzione e utilizza questi:

    Per l'inserimento nel Db
    [php] $testopvt= addslashes(htmlentities($testopvt, ENT_QUOTES)); [/php]

    per visualizzarli:
    [php]echo stripslashes(html_entity_decode($testopvt)); [/php]