Errori "Random"
Errori "Random" postato il 30/04/2013 15:14:40 nel forum programmazione, open source e hosting
Buon pomeriggio a tutti,
ancora una volta mi ritrovo a rivolgermi a voi per un... anzi per diversi errori "strani"...
Premessa: Fino a ieri pomeriggio funzionava tutto bene. Poi sono iniziati, di colpo, errori a diversi utenti:
Non riuscivano più a mandare mail
Non riuscivano a postare in bacheca
Non riuscivano a mandare messaggi con "la ricetrasmittente"
Inizialmente a me funzionava tutto, poi piano piano, anche a me dava errore...
Il problema è che l'errore non lo da SEMPRE verso gli stessi player o sugli stessi post in bacheca... Va a singhiozzi... A volte da errore, 4 minuti dopo funziona, poi un'ora dopo non va più, ecc...
Ora, mi rendo conto che così sarà difficile capire l'origine dell'errore, quindi vi posto il codice dei "messaggi" che sono quelli che danno un errore "chiaro" perché lo stampa a video, diversamente dalle ricetrasmittenti e dalla bacheca che semplicemnte NON inviano in DB il messaggio e amen...
Quindi, l'errore che da è: ERRORE: MAIL NON A BUON FINE PER NomePG
e il codice è il seguente:
<? session_start();
include ("inc/parametri.inc.php");
include ("inc/controllo.php");
include ("inc/open2.php");
include ("inc/controlloesilio.php");
$Login=$_SESSION['Login'];
$Dest=$_POST['Dest'];
$Testo=$_POST['Testo'];
if ($Dest==''){$Dest=$_GET['Dest'];}
if ($_GET['cancella'] != '') {
$IDCanc = 0 + $_POST['IDCanc'];
if ($IDCanc >0) {
$MySql = "INSERT INTO BakMessaggi SELECT * FROM Messaggi WHERE ID = $IDCanc AND Destinatario = '".pars($Login)."'";
mysql_query($MySql);
$MySql = "DELETE FROM Messaggi WHERE ID = $IDCanc AND Destinatario = '".pars($Login)."'";
mysql_query($MySql);
header("Location: messaggi.php?p=$p&Ord=$Ord&Max=$Max", false);
}
}
include ('inc/header.html.inc.php');
?>
</head>
<body topmargin="0" leftmargin="0" style="background-image: url(http://digilander.libero.it/Jols/messaggi2.jpg); background-position:center; background-attachment: fixed; background-repeat:no-repeat;">
<div align=center>
<br><br><br>
<br><br><br>
<?
function formattadata($tim)
{
return(strftime("%d/%m/%Y %H:%M", strtotime($tim)));
}
if ($_POST['Destinatario'] != '') {
$Testo = htmlspecialchars($Testo);
$Testo = str_replace("
", "<br>", $Testo);
$IDAllegato = 0 + $_POST['IDAllegato'];
if ($IDAllegato > 0) {
$MySql = "Select * From Messaggi";
$MySql .= " Where ID = '$IDAllegato'";
$MySql .= " AND Destinatario = '".pars($Login)."'";
$Result = mysql_query($MySql);
if ($rs = mysql_fetch_array($Result)) {
$TestoAllegato = htmlspecialchars($par_MessaggiNameSing).' da parte di <b>'.htmlspecialchars($rs['Mittente']).'</b><br>';
$TestoAllegato .='Spedito il '.formattadata($rs['Spedito']).'<br>';
$TestoAllegato .= addslashes($rs['Testo']);
$TestoAllegato = str_replace('<i>', '', $TestoAllegato);
$TestoAllegato = str_replace('</i>', '', $TestoAllegato);
} else {
$TestoAllegato = '<b>Allegato inesistente!</b>';
}
$rs->close;
mysql_free_result($Result);
$Testo .= '<br><br><i>'.$TestoAllegato.'</i>';
}
if (($_SESSION['IDGilda_S']%100 == 0) && (0 + $_SESSION['IDGilda_S'] > 0)) {
$Dest = explode(',', $_POST['Destinatario']);
} else {
$Dest = explode(',', $_POST['Destinatario']);
}
for ($i = 0; $i <= count($Dest)-1; $i++) {
$Destinatario = trim($Dest[$i]);
$MySql = "SELECT Nome FROM Personaggio WHERE Nome = '$Destinatario'";
$Result = mysql_query($MySql);
$rs = mysql_fetch_array($Result);
$Esiste = (!(!$rs));
$rs->close;
mysql_free_result($Result);
$Certified = 0;
if ($Esiste) {
$MySql = "INSERT Into Messaggi (Mittente, Destinatario, Testo, Spedito) VALUES ('$Login', '$Destinatario', '$Testo', NOW())";
mysql_query($MySql);
$Certified = mysql_affected_rows();
$IDCanc = 0 + $IDCanc;
if (($IDCanc != "") && ($i==count($Dest)-1)) {
$MySql = "INSERT INTO BakMessaggi SELECT * FROM Messaggi WHERE ID = $IDCanc AND Destinatario = '".pars($Login)."'";
mysql_query($MySql);
$MySql = "DELETE From Messaggi WHERE ID = $IDCanc AND Destinatario = '".pars($Login)."'";
mysql_query($MySql);
}
?>
<table border=0 width="316" class=tChiaro>
<? if($Certified == 1) { ?>
<tr><td><?= htmlspecialchars($par_MessaggiNameSing) ?> spedita a <?= htmlspecialchars(stripslashes($Destinatario)) ?></td></tr>
<tr><td>Spedito il <?= strftime("%d/%m/%Y %H:%M:%S") ?></td></tr>
<tr><td><?= stripslashes($Testo) ?></td></tr>
<? } else { ?>
<tr bgcolor=orange><td>ERRORE: <?= strtoupper(htmlspecialchars($par_MessaggiNameSing)) ?> NON A BUON FINE PER <?= htmlspecialchars(stripslashes($Destinatario)) ?></td></tr>
<tr><td><?= strftime("%d/%m/%Y %H:%M:%S") ?></td></tr>
<tr><td><?= $Testo ?></td></tr>
<? } ?>
</table><br>
<? } else { ?>
<font class=Titolo>Destinatario <?= htmlspecialchars($Destinatario) ?> inesistente: impossibile spedire <?= htmlspecialchars($par_MessaggiNameSing) ?>.</font><br>
<?
}
}
} else { ?>
<br><br>
<form action="nuovomessaggiotutti.php" method="post">
<table width="300"><tr><td>Destinatario
<?
if (($_SESSION['IDGilda_S']%100 == 0) && (0 + $_SESSION['IDGilda_S'] > 0)) {
echo ' (multipli separati da virgola)';
}
?>
<br>
<input type="text" size="20" name="Destinatario" value="<?= $Dest ?>"></td>
<td></td>
<td></td>
</tr>
<tr><td><font color=red> Per inviare lo stesso messaggio a più persone, digitare i nomi separati da virgole senza alcuno spazio. </font><br><br><center><textarea name="Testo" rows="17" cols="45"></textarea></center></td>
<td></td>
<td></td>
</tr>
<tr><td align="right"><br><input type="submit" value="Spedisci"></td>
<td></td>
<td></td>
</tr>
<?
if ($_POST['allega'] != '') {
$MySql = "Select * From Messaggi";
$MySql .= " Where ID = '".$_POST['IDCanc']."'";
$MySql .= " AND Destinatario = '".pars($Login)."'";
$Result = mysql_query($MySql);
if($rs = mysql_fetch_array($Result)) {
?> <input type="hidden" name=IDAllegato value="<?= $_POST['IDCanc'] ?>">
<tr bgcolor="#808080"><td colspan=3 align="center">ALLEGA</td></tr>
<tr bgcolor="#808080"><td colspan=3><?= htmlspecialchars($par_MessaggiNameSing) ?> da parte di <b><?= htmlspecialchars($rs["Mittente"]) ?></b><br>
Spedito il <?= formattadata($rs["Spedito"]) ?><br>
<hr><?= $rs["Testo"] ?></td></tr> <?
}
$rs->close;
mysql_free_result($Result);
}
?>
</table>
<? if (($_GET['cancella'] != '') || ($_GET['cancellaerispondi'] != '')) { ?>
<input type="hidden" name="IDCanc" value="<?= $_POST['IDCanc'] ?>">
<? } ?>
<input type="hidden" name="p" value="<?= $_POST['p'] ?>">
<input type="hidden" name="Ord" value="<?= $_POST['Ord'] ?>">
<input type="hidden" name="Max" value="<?= $_POST['Max'] ?>">
</form>
<? } ?>
<hr size="1" width=200>
<a href="messaggi.php?p=<?= $p ?>&Ord=<?= $Ord ?>&Max=<?= $Max ?>">Torna alla lista <?= htmlspecialchars($par_MessaggiName) ?></a>
</div>
</body>
</html>
Scrutando il codice sembrerebbe chiaro che il problema sta nella valorizzazione della variabile:
$Certified
Ma... che errore è? Perché non la valorizza? E perché a volte, lo stesso utente, riceve errore quando invia al PlayerA e non quando invia al PlayerB e magari 10minuti dopo da errore il playerB e non il playerA?
Ho anche scirtto al servizio di Hosting... tante volte stessero facendo delle modifiche al server... ma ancora non mi rispondono e quindi nel frattempo sarei grato a chiunque riesca a capirci qualcosa.
Grazie a tutti :-)
Pagine → 1
30/04/2013 15:22:57
Trovato il problema:
Il servizio di hosting:
le confermo che è cambiata la configurazione delle magic_quotes_gpc da ON a OFF.
Per ragioni di sicurezza le magic_quotes_gpc applicano automaticamente la funzione addslashes a tutte le variabili _GET, _POST.
Bene... mi fa piacere (soprattutto essere stato informato prima) ma quindi... alla luce di questo... che cambiamenti devo effettuare, per esempio alla pagina dei messaggi (che vi ho postato)?
Grazie a tutti
30/04/2013 15:47:11 e modificato da digital-destiny il 30/04/2013 15:48:50
Se $certified non viene valorizzata significa che la Query SQL va in errore.
Per diagnosticare l'errore prova a farti stampare l'errore:
echo mysql_error();
Al 99% sarà un Syntax Error, perchè nella query probabilmente introduci a volte dei dati non filtrati (Forse il destinatario?) per i caratteri speciali di SQL.
$MySql = "INSERT Into Messaggi (Mittente, Destinatario, Testo, Spedito) VALUES ('$Login', '$Destinatario', '$Testo', NOW())";
Prima di ciò se ne occupava l'impsotazione di default, mentre adesso devi occuparti tu di fare addslahses($param) delle cose che vanno in database e che potrebbero contenere apostrofi o altri caratteri di escape, per esempio.
Ti toccherà sistemare tutto il codice per il nuovo sistema, ovviamente, oppure impostare manualmente l'escape automatico di PHP, ammesso che il tuo hosting te lo permetta.
30/04/2013 17:12:34
In genere è sempre consigliabile scrivere codice che presupponga che magic_quotes_gpc sia spento per renderlo più portabile. L'opzione delle magic quotes è stata deprecata e verrà rimossa da PHP a partire dalla versione 5.4.
Questo significa che prima o poi dovrai comunque riscrivere tutto il tuo codice per renderlo funzionante senza le magic quotes.
Dovresti guardare la versione di PHP che è montata sul tuo hosting, se non è ancora la versione 5.4 puoi riabilitare l'opzione che loro hanno disattivato. Se invece è già la 5.4...mi spiace devi riscrivere tutte query del tuo gdr. Lasciarle così come sono, oltre a creare i problemi che hai, aprono il tuo gdr anche ad attacchi di tipo SQL Injection. Qualcuno potrebbe decidere che è divertente farti uno scherzo e cancellarti tutto il db in un colpo solo.
Se non hai ancora la 5.4 leggi questa pagina. è la guida che ti dice come disattivare magic_quotes, ma dato che a te serve l'esatto contrario non dovrai fare altro che sistituire gli Off con gli On: http://php.net/manual/en/security.magicquotes.disabling.php ↗
nell'esempio 1 ci sono due tecniche che puoi usare, provane una (io consiglio quella con .htaccess)
30/04/2013 17:30:04
Grazie mille per le risposte...
Controllerò la versione del php nella speranza che posso riattivare, almeno momentaneamente, la funzione in questione.
Nei giorni a venire poi modificherò le varie pagine (che purtroppo temo non saranno poche) per potere passare alla versione nuova non appena sarà installata sul server e/o per poter ripristinare la funzione.
Grazie a tutti
30/04/2013 19:29:23
OK...mi sono deciso a rivdere un po' tutto il codice e a mettere quei benedetti
htmlspecialchars(addslashes($_POST[...
htmlspecialchars(addslashes($_GET[...
dove servono.
Ora ho "solo un" problema, ovvero che non mi stampa più bene le virgolette sostituendole con i "...
Come posso ovviare a questo problema?
30/04/2013 20:31:22
Io ho avuto un problema simile al tuo, ho dovuto eliminare tutti gli htmlspecialchars e sostituirli con gli addslashes ed ancora oggi non ho trovato nulla di meglio <.<
Appena inviavo qualcosa con lettere accentate dava errore...
30/04/2013 21:25:38
Visto che usi una land a quanto vedo dal codice basata sul gdrcd 3.x ti converrebbe fino a quando non sistemi il codice di fare nell'open2.php
un filtraggio con l'addslashes delle variabili $_POST, $_GET.
innanzitutto fai un if di controllo sullo status del magic_quotes_gpc:
e poi all'interno filtri quelle tre variavili, qualcosa del tipo:
if (get_magic_quotes_gpc() === FALSE) {
if(isset($_POST) && count($_POST) > 0) {
foreach($_POST as $key => $value) {
$temp_post[$key] = $value;
}
$_POST = $temp_post;
}
if(isset($_GET) && count($_GET) > 0) {
foreach($_GET as $key => $value) {
$temp_get[$key] = $value;
}
$_GET = $temp_get;
}
}
Ho scritto il codice al volo qui, quindi potrebbe esserci qualche picoclo errore di sintassi non avendolo testato, prendilo come una linea guida su come fare.
Volendo ci sarebbere da fare lo stesso lavoro per $_COOKIE e non so come si comporti l'array $_REQUEST se gli array get e post sono stati cambiati da quel ciclo.
Te la consiglio come soluzione temporanea in quanto pe ril database comunque sarebbe sempre meglio usare il mysql_real_escape_string() come funzione per l'input dei dati
01/05/2013 13:17:16
sgc carter ha scritto: OK...mi sono deciso a rivdere un po' tutto il codice e a mettere quei benedetti
htmlspecialchars(addslashes($_POST[...
htmlspecialchars(addslashes($_GET[...
dove servono.
Ora ho "solo un" problema, ovvero che non mi stampa più bene le virgolette sostituendole con i "...
Come posso ovviare a questo problema?
mai mai mai mai usare htmlspecialchars (o htmlentities) quando inserisci i dati nel database! Il filtraggio html va fatto quando estrai i dati dal database (quando fai la select!) non quando li inserisci. Ti risparmi un sacco di problemi di visualizzazione, tipo quello che hai appena riscontrato.
Volendo ci sarebbere da fare lo stesso lavoro per $_COOKIE e non so come si comporti l'array $_REQUEST se gli array get e post sono stati cambiati da quel ciclo.
$_REQUEST è un array che contiene delle copie dei dati in get e post, non contiene riferimenti o cose del genere. Quindi se modifichi get e post, request non cambia, dovresti modificare anche quello.
Discussione seguita da
Pagine → 1
Rispondi alla Discussione Segui Discussione Inoltra Discussione Forum Programmazione, Open Source e Hosting Elenco Forum
Articoli, Interviste e altre Risorse!
Fallen Gods ↗
Sea of Conquest ↗
AlterEgo ↗
State of Survival ↗
Seconda Era ↗
Storie di Agarthi ↗
Crossout ↗