07/03/2012
Paginazione PHP con HTTP POST
La paginazione è uno dei metodi più gettonati per ripartire i contenuti dinamici di un sito Web su più pagine. Spesso, però, per ragioni di sicurezza (e non solo) risulta più conveniente sostituire il GET con il POST, avvalendosi di un pò di codice Javascript da utilizzare lato client.
Ecco un il codice (testato e funzionante):
$query = "SELECT * FROM Utenti";
$risultato = $mysqli->query($query);
$count = mysqli_num_rows($risultato);
$per_pagina = 30; //secondo parametro di LIMIT
$tot_pagine = ceil($count / $per_pagina); //approssima la divisione all'intero
$pagina_corrente = 1;
if(isset($_POST['pagina']) && is_numeric($_POST['pagina']))
{
$pagina_corrente = $_POST['pagina'];
}
$primo = ($pagina_corrente - 1) * $per_pagina; //primo parametro di LIMIT
$query = $query."ORDER BY C.Cognome ASC LIMIT $primo, $per_pagina";
$risultato = $mysqli->query($query1);
lato server, mentre lato client il codice Javascript è così definito:
<script type="text/javascript">
function invia()
{
document.loginform4.method="post";
document.loginform4.action="visualizzacontatti.php";
document.loginform4.submit();
}
</script>
Inoltre, il numero di pagina calcolato nell'ambito del codice PHP verrà salvato in un campo di input hidden:
<input type="hidden" name="pagina" id="pagina" value="<?php echo $pagina_corrente?>"/>
I numeri di pagina cliccabili saranno così definiti:
<div id="paginazione">
<p align ="center">
<?php
if($pagina_corrente == 1 || $count == 0) //se siamo nella prima pagina oppure non vi sono record
{
echo "<< Precedente";
}
else
{
$pagina_precedente = ($pagina_corrente - 1);
?>
<a href ="javascript:invia()" onclick="document.loginform4.pagina.value=<?php echo $pagina_precedente?>"><?php echo "<< Precedente"?></a>
<?php
}
echo ' Pagine: ';
for($i = 1; $i <= $tot_pagine; $i++)
{
if($i == $pagina_corrente)
{
echo "[$i]";
}
else
{
?>
<a href ="javascript:invia()" onclick="document.loginform4.pagina.value=<?php echo $i?>"><?php echo $i ?></a>
<?php
}
}
if($pagina_corrente == $tot_pagine) // se siamo nell'ultima pagina
{
echo "Successiva >>";
}
else
{
$prossima_pagina = ($pagina_corrente + 1);
?>
<a href ="javascript:invia()" onclick="document.loginform4.pagina.value=<?php echo $prossima_pagina?>"><?php echo "Successiva >>"?></a>
<?php
}
?>
</p>
</div>
Enjoy!
15:48 Scritto da: nazarenolatella in Web Editing | Link permanente | Commenti (0) | Segnala | Tag: php, javascript, paginazione, post, get | OKNOtizie |
Facebook
18/01/2012
PHP e mysql: input sanitization di base
Tutti gli addetti ai lavori sanno (o almeno dovrebbero sapere) che nell'ambito della sicurezza Web occorre prestare particolare attenzione ai dati trasmessi al server mediante gli appositi form HTML.
Tale operazione si rende indispensabile poichè un utente malevolo potrebbe "postare" delle stringhe "ad hoc" per "iniettare" del codice SQL arbitrario (SQL injection) oppure inserire all'interno della pagina del codice HTML (o javascript) che provoca il reindirizzamento su un sito infetto (iframe, redirect et similia, ovvero tutto ciò che riguarda gli attacchi XSS).
Per questo motivo ho deciso di postare qualche riga di codice PHP che consente di filtrare in modo rapido ed efficace i dati immessi dagli utenti.
In particolare, vengono svolti due controlli: il primo si occupa dell'individuazione (e la successiva rimozione) dei caratteri speciali di MySQL (apice singolo, apice doppio, backslash, cancelletto, ecc.), mentre il secondo verifica che non vi siano dei tag HTML all'interno delle stringhe immesse nei campi di input.
Ecco il codice:
if(isset($_POST['username']) && $_POST['username'] != '')
{
$username = mysqli_real_escape_string($mysqli,strip_tags($_POST['username']));
}
else
{
$errore = 'Devi inserire lo username';
}
Come potete notare, il campo su cui è stato implementato il filtro è quello relativo allo username. Per prima cosa viene verificato che la variabile $_POST['username'] sia settata e non sia vuota.
Se tale controllo va a buon fine, tramite la funzione strip_tags() viene rimosso l'eventuale codice HTML e successivamente, mediante mysqli_real_escape_string() vengono filtrati i caratteri speciali relativi a MySQL.
Ovviamente, attraverso tale meccanismo non darete agli utenti la possibilità di scegliere username del tipo:
<username>
o ancora:
username#
ma si sa, in questi casi bisogna certamente scendere a compromessi e capire dove sta il male minore.
A presto.
12:16 Scritto da: nazarenolatella in SO: Linux | Link permanente | Commenti (0) | Segnala | Tag: xss, sqli, input sanitization, mysql, javascript, php, html, tags, special chars | OKNOtizie |
Facebook
15/08/2011
Visualizzare mediante PHP il nome del database utilizzato
Recentemente ho dovuto modificare parzialmente uno dei CRM che ho sviluppato. Non volendo inficiare il DB in produzione ho dovuto "clonarlo", in modo da poter fare i miei esperimenti in assoluta libertà.
Poichè volevo essere sicuro che ciascuna pagina utilizzasse effettivamente il database "clone" (avendo a disposizione un solo server), ho implementato un controllo in PHP che mi restituisse il nome del DB in uso all'apertura della pagina.
Ecco lo script:
$db = $mysqli -> query("SELECT DATABASE()");
while($riga1 = $db -> fetch_assoc())
{
echo $riga1["DATABASE()"];
}
La chiave di lettura delle righe di codice sopra riportate sta proprio nella funzione DATABASE() di MySQL, la quale consente di individuare il nome del DB in uso.
Da riga di comando avremo una situazione simile alla seguente:
mysql> SELECT DATABASE();
+------------+
| DATABASE() |
+------------+
| prova |
+------------+
1 row in set (0.00 sec)
mysql>
Il post termina qui, a presto.
16:45 Scritto da: nazarenolatella in Web Editing | Link permanente | Commenti (0) | Segnala | Tag: php, mysql, database(), current database | OKNOtizie |
Facebook
















