Query di inserimento dati nel Database
05/09/2012 20:06:32
Fai un altro tentativo.. sostituisci tutti gli ' che compaiono qui sui 3d con l'apice semplice quello del pulsante "?" non vorrei che andasse un po' in pappa con la conversione degli apici da in lettura del POST o di qualche altra cosa sparsa per il codice. Sostituiscili tutti copia questo ' da qui e cercalo nel testo e sostituiscilo inserendolo da tastiera.
05/09/2012 20:10:41 e modificato da eldiabolo il 05/09/2012 20:15:02
<?
if (isset($_REQUEST['pg'])){
$pg=addslashes($_REQUEST['pg']);
if (isset($_POST['esterno'])){ /*sostituito con la e minuscola, sia qui che poi sotto nel codice html sottostante*/
//prendi il post della text area chiamata note_fato e gli
//aggiungi direttamente gli slash per filtrare l'input dati
$note_fato= addslashes($_POST['note_fato']);
$query_update = "UPDATE Personaggio SET Esterno = '".$note_fato."' WHERE Nome = '".$pg."' ";
$result_update = mysql_query($query_update ) or die ("errore critico nella query salvataggio dati");
}
/*qui c'era un "?>" di troppo*/
if ( ($_SESSION['Admin_S']==1)||($_SESSION['Master_S']==1)||($_SESSION['Master_S']==2)) {
//carichi i dati, così se sono stati appena modificati
//dall'operazione precedente vengono caricati già aggiornati
$query_load = "SELECT Personaggio.Esterno FROM Personaggio WHERE Nome = '".$pg."' ";
$result_load=mysql_query($query_load) or die("errore caricamento dati");
//controlli se sono stati trovati dati quindi
//se il result è maggiore di 0 righe caricate
if (mysql_num_rows($result_load) > 0) {
//passi i dati all'array, io utilizzo questo metodo non è
//obbligatorio ma mi trovo più comodo ed è più leggibile poi il codice
$array_load=mysql_fetch_array($result_load);
$note_fato=$array_load['Esterno'];
}else{
//dichiari e iniziliazzi in ogni casi i dati della variabile
//delle note del fato, se ci sono li carichi altrimenti la dichiari vuota.
$note_fato="";
}
//stampi a video la text area e ci metti la stampa unita della
//variabile caricata in precedenza "$note_fato" tra i tag della
//text area così ti riporta i dati che avevi sul database
echo '
<form onSubmit="return Conferma();" action="scheda1prova.php?pg='.$pg.'" method="post">
<tr><td>
NOTE FATO
<textarea cols=47 rows=15 name="note_fato">'.$note_fato.'</textarea>
<input type="hidden" name="esterno" value="save" />
<input type="submit" name="Submit" value=" Aggiungi Note " style="color:white;background:red">
</td></tr>
</form>';}
?>
</table>
<script language="JavaScript">
function Conferma(){
if (confirm('Sei sicuro?'))
return true;
else
return false;
}
</script>
<?php $rs->close;
}else{
echo "NON HAI SPEICIFICATO IL PERSONAGGIO";
}
?>
Mancava giustamente il pg su cui effettuare la modifica almeno nel codice che stiamo maneggiando qui sul forum.. guarda un po' così
Editato per riportare la modifica: method="post" nei parametri del form.
05/09/2012 20:13:55 e modificato da leoblacksoul il 05/09/2012 20:15:00
Putroppo non puoi scrivere gli apici che servono per php su questo forum, vengono convertiti in automatico.
Comunque si è vero, se non cambi tutti gli apici che ci sono nei codici scritti su questo thread nessuno script funzionerà.
Potresti usare la versione che ho riscritto (con l'aggiunta finale del post precedente di eldiabolo)? XD Non per altro, ma le altre versioni hanno due problemi di sicurezza non innocui (access bypass e XSS).
05/09/2012 20:15:36
Gli apici li avevo già sistemati (mi era già capitato di notare che copincollando questi non funzionassero) però..finalmente FUNZIONA. Mancava proprio la specifica del personaggio, a quanto pare *^* grazie mille, della pazienza, della costanza e dei consigli !
05/09/2012 20:24:41
leoblacksoul ha scritto: Putroppo non puoi scrivere gli apici che servono per php su questo forum, vengono convertiti in automatico.
Comunque si è vero, se non cambi tutti gli apici che ci sono nei codici scritti su questo thread nessuno script funzionerà.
Potresti usare la versione che ho riscritto (con l'aggiunta finale del post precedente di eldiabolo)? XD Non per altro, ma le altre versioni hanno due problemi di sicurezza non innocui (access bypass e XSS).
Fatto :3 grazie anche a te, anche se non ho capito cosa sono questi problemi di sicurezza, ma mi fido!
05/09/2012 20:25:58
Di nulla buon proseguimento ;)
05/09/2012 20:47:24 e modificato da leoblacksoul il 05/09/2012 20:53:37
Nel caso, ti posto la versione finale del codice.
Il codice di prima mi permetterebbe di inserire codice malevolo nel tuo gdr con soli due clic, anche senza essere registrato.
<?php
if(isset($_GET['pg'])){
$pg=$_GET['pg'];
if ( ($_SESSION['Admin_S']==1)||($_SESSION['Master_S']==1)||($_SESSION['Master_S']==2)) {
if (isset($_POST['esterno'])){
//prendi il post della text area chiamata note_fato e gli
//aggiungi direttamente gli slash per filtrare l'input dati
$note_fato= addslashes($_POST['note_fato']);
$query_update = "UPDATE Personaggio SET Esterno = '".$note_fato."' WHERE Nome = '".addslashes($pg)."' ";
$result_update = mysql_query($query_update );
}
//carichi i dati, così se sono stati appena modificati
//dall'operazione precedente vengono caricati già aggiornati
$query_load = "SELECT Personaggio.Esterno FROM Personaggio WHERE Nome = '".addslashes($pg)."' ";
$result_load=mysql_query($query_load);
//controlli se sono stati trovati dati quindi
//se il result è maggiore di 0 righe caricate
if (mysql_num_rows($result_load) > 0) {
//passi i dati all'array, io utilizzo questo metodo non è
//obbligatorio ma mi trovo più comodo ed è più leggibile poi il codice
$array_load=mysql_fetch_array($result_load);
$note_fato=$array_load['Esterno'];
}else{
//dichiari e inizialiazzi in ogni casi i dati della variabile
//delle note del fato, se ci sono li carichi altrimenti la dichiari vuota.
$note_fato="";
}
//stampi a video la text area e ci metti la stampa unita della
//variabile caricata in precedenza "$note_fato" tra i tag della
//text area così ti riporta i dati che avevi sul database
echo '
<tr><td>
<form onSubmit="return Conferma();" action="scheda1prova.php?pg='.htmlentities($pg).'" method="post">
NOTE FATO
<textarea cols="47" rows="15" name="note_fato">'.htmlentities($note_fato).'</textarea>
<input type="hidden" name="esterno" value="save" />
<input type="submit" value="Aggiungi Note" style="color:white;background:red" />
</form>
</td></tr>';
}
}
?>
</table>
<script type="text/javascript">
function Conferma(){
return confirm('Sei sicuro?');
}
</script>
Dato che eldiabolo ha chiesto spiegazioni sui problemi dello script, li scrivo qua.
Lo script precedente permetteva due cose, che combinate insieme costituiscono un grave problema di sicurezza della scheda del gdr:
_Access bypass: il codice NON controllava che il personaggio avesse i permessi necessari per le note fato prima di aggiornarle. Questo significa che con una richiesta post fatta a mano sarei riuscito a modificare le note fato anche senza avere i permessi di admin o master. Non solo, dato che la pagina non richiede autenticazione sarei riuscito a farlo anche senza essere registrato. Non nascondetevi dietro a un form, con i browser di oggi non ci vuole niente a inviare una richiesta post manualmente senza usare i <form>, è sufficiente la console javascript che Firefox, Chrome, Opera, etc mettono a disposizione di tutti i loro utenti.
_Cross Site Scripting (XSS): l'output nella textarea non era stato propriamente filtrato prima di venire stampato. Permettendo di inserire codice arbitrario (HTML e javascript) utilizzabile per fare l'hijacking della scheda.
Mettiamo insieme le due cose: se io fossi un hacker e volessi attaccare il tuo gdr non dovrei fare altro che aprire la scheda (senza bisogno di registrarsi!) di uno degli utenti (magari di un utente importante, come il gestore) aprire la console javascript che mi offre Chrome, digitare due righe di codice per inviare una richiesta AJAX post che simuli la compilazione del form delle note fato. Dato che il codice non controllava da dove venisse la richiesta avrebbe prontamente aggiornato le note fato con quello che io gli avrei detto. Se io avessi scritto una cosa di questo tipo nelle note fato:
</textarea><script type="text/javascript">window.location.href='www.tirubolapassword.it';</script>
la prossima volta che qualcuno avrebbe aperto la scheda non avrebbe più trovato la scheda, avrebbe invece trovato il mio sito o qualunque altra cosa che mi fosse venuto voglia di scrivere nel codice javascript.
L'effetto è mitigato dal fatto che solo gli admin e i master avrebbero visualizzato questo problema. Ma forse non è poi un "mitigato", dato che se io fossi un hacker vorrei andare a colpire e a rubare i dati proprio agli admin e ai master.
05/09/2012 21:08:29
Non sono un amante del "codice tutto verde" dei forum, specie dopo una giornata intera a scrivere sorgenti.. non avevo notato nello specifico le modifiche per questo ho chiesto nello specifico cos'era stato modificato.
Tnx, sicuramente utili e fondamentali per un codice sicuro ;)
Abbiamo fatto troppi copia e incolla dai vari 3d di questo codice si, ero sicuro infatti di aver già sistemato l'update dentro l'if anche perchè fuori oltre ad essere una falla di sicurezza ha pure poco senso.
L'htmlentities fa comodo sicuramente, dipende poi da chi può inserire quel codice ma in linea di massima è sempre meglio usarlo per evitare qualche brutto scherzone anche se sono dati che inseriscono soltanto master e gestori, si sa mai ;)
Apposto, buona serata e buon proseguimento ad entrambi ^_^
Rispondi alla Discussione Segui Discussione Inoltra Discussione Forum Programmazione, Open Source e Hosting Elenco Forum
Articoli, Interviste e altre Risorse!
State of Survival ↗
Wuthering Waves ↗
Crossout ↗
AlterEgo ↗
Storie di Agarthi ↗
World of Warship ↗
Tibia ↗