Salve a tutto il forum, sono nuovo della programazzione in PHP e questo sito mi è stato segnalato da PHP solution, la rivista che sto comprando per programmare in questo linguaggio.
Il problema è questo, vengo subito al dunque, sono il programmatore di un piccolo sito (ecco l'indirizzo http://www.openfreedom.org), il quale ha lo scopo di integrare alcune idee di tipo open source, per questo è stato scelto un host con Linux come S.O, php come linguaggio per creare le pagine e MySQL come DB relazionale. Il problema che è emerso (oltre ad latri che in seguito riporterò) è la sicurezza della fase di registrazione e login di un utente. La pagina (di seguito riporto il codice utilizzato) è stata creata utilizzando degli script trovati sul libro PHP 5 guida dper lo sviluppatore della Wrox. La questione è che una delle tabelle utilizzate nello script (lo script prevede un prima fase di identificazione con la tabella utenti ed una seconda fase di aggiornamento della tabella che tiene traccia di chi si connette), quella relativa alle tracce di chi si connete si è riempita di dati non relativi agli utenti registrati, come se qualcuno avesse inserito nominativi strani nel login e lo script li avesse accettati senza fare il controllo.
Il codice della pagina è il seguente:
<?php
session_start();
session_register('useralias', 'userpassword');
?>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html lang="it"><head><title>www.openfreedom.org</title>
<link rel="stylesheet" href="slackwarelife_dir/style.css" type="text/css">
<link rel="shortcut icon" type="image/ico" href="http://www.openfreedom.org/favicon.ico">
<link rel="alternate" type="application/rss+xml" title="slackwarelife rss" href="http://www.openfreedom.org/rss/news.xml">
<link rel="alternate" type="application/rss+xml" title="slackware-current ChangeLog" href="http://slackware.it/rss/snap_slackware-current.xml">
<meta name="description" content="open freedom">
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"></head>
<body>
<table class="main" align="center" cellpadding="0" cellspacing="0">
<tbody><tr>
<td align="left" valign="top" width="170">
<table cellpadding="0" cellspacing="0" width="170">
<tbody><tr><td height="170">
</td></tr>
</tbody></table>
<table id="menu" cellspacing="10"><tbody><tr>
<td nowrap="nowrap">
<ul class="menu">[*]home[/list]
</td>
</tr>
<tr>
<td nowrap="nowrap">
<ul class="menu">[*]chi sono[*]contatti[*]links[*]rss[*]downloads[*]documentazione[*]contributi[*]registrazione[/list]
</td></tr>
</tbody></table>
<td class="page" valign="top" width="568">
[img]slackwarelife_dir/logo.jpg[/img]
<div class="top">
Benevenuto sul sito openfreedom.org
</div>
<table class="box" align="center" width="95%"><tbody><tr><td>
<?php
include("/web/htdocs/www.openfreedom.org/home/privato/news.php")
?>
</td>
</tr>
</tbody></table>
</td>
<td align="left" valign="top" width="170">
<table cellpadding="0" cellspacing="0" width="170">
<tbody><tr><td height="170">
</td></tr>
</tbody></table>
<?php
require_once ('/web/htdocs/www.openfreedom.org/home/privato/common_db.inc');
$exclude_dirs = array('/info', '/contact');
$exclude_files = array('index.html', 'info.html', 'register.php');
$user_tablename = 'user';
$access_log_tablename = 'access_log';
$PHP_SELF = $_SERVER['PHP_SELF'];
if (!$_SESSION['useralias']){
$filepath = dirname($_SERVER['SCRIPT_FILENAME']);
$filename = basename($_SERVER['SCRIPT_FILENAME']);
if($filepath == '') $filepath = '/';
$auth_done = 0;
for($j=0; $j < count($exclude_dirs); $j++) {
if($exclude_dirs[$j] == $filepath) break;
else {
for($i=0; $i< count($exclude_files); $i++) {
if($exclude_files[$i] == $filename) break;
if ($i == (count($exclude_files) - 1)){
do_authentication();
$auth_done = 1;
break;
}
}
}
if($auth_done) break;
}
}
login_ok();
if ($_SESSION['useralias'] && $_SESSION['userpassword']){
$useralias = $_SESSION['useralias'];
$filename = basename($_SERVER['SCRIPT_FILENAME']);
$link_id = db_connect($default_dbname);
$query = "SELECT useralias FROM $access_log_tablename
WHERE page = '$filename'
AND useralias = '$useralias'";
$result = mysql_query($query);
if(!mysql_num_rows($result))
$query = "INSERT INTO $access_log_tablename
VALUES ('$filename', '$useralias', 1, NULL)";
else $query = "UPDATE $access_log_tablename
SET visitcount = visitcount + 1, accessdate = NULL
WHERE page = '$filename' AND useralias = '$useralias'";
mysql_query($query);
$num_rows = mysql_affected_rows($link_id);
if($num_rows != 1) die(sql_error());
}
function do_authentication() {
global $default_dbname, $user_tablename, $access_log_tablename;
global $MYSQL_ERROR, $MYSQL_ERRNO;
global $filename;
global $PHP_SELF;
if(!isset($_POST['useralias'])) {
login_form();
exit;
}
else {
$_SESSION['userpassword'] = $_POST['userpassword'];
$_SESSION['useralias'] = $_POST['useralias']; }
$useralias = $_POST['useralias'];
$userpassword = $_POST['userpassword'];
$link_id = db_connect($default_dbname);
$query = "SELECT username FROM $user_tablename
WHERE useralias = '$useralias'
AND userpassword = password('$userpassword')";
$result = mysql_query($query);
if(!mysql_num_rows($result)) {
session_unregister("useralias");
login_filed();
exit;
}
else {
$query = "SELECT useralias FROM $access_log_tablename
WHERE page = '$filename'
AND useralias = '$useralias'";
$result = mysql_query($query);
if(!mysql_num_rows($result))
$query = "INSERT INTO $access_log_tablename
VALUES ('$filename', '$useralias', 1, NULL)";
else $query = "UPDATE $access_log_tablename
SET visitcount = visitcount + 1, accessdate = NULL
WHERE page = '$filename' AND useralias = '$useralias'";
mysql_query($query);
$num_rows = mysql_affected_rows($link_id);
if($num_rows != 1) die(sql_error());
}
}
function login_form() {
global $PHP_SELF;
?>
<table class="login" cellpadding="0" cellspacing="0" width="100%"><tbody><tr>
<td align="left" bgcolor="#ffffff" valign="top" width="150">
<tr>
<td><center>
<form method="post" action="<? echo $PHP_SELF ?>">
Username:
<input name="useralias" size="8" type="text">
Password:
<input name="userpassword" size="8" type="password">
<input type="submit" value="entra" name="Submit">
</form></center></td>
</tr>
</tbody></table>
</td></tr>
<tr><td></td><td class="bottom"><center>
<font class="small">2005 Forti Massimo - Slackwarelife</font>
<a href="http://validator.w3.org/check/referer" target="_blank">
[img]slackwarelife_dir/valid-html401.jpg[/img]</a>
<a href="http://jigsaw.w3.org/css-validator/" target="_blank">
[img]slackwarelife_dir/vcss.jpg[/img]</a>
</center></td><td></td></tr></tbody></table>
</body></html>
<?
}
function login_ok() {
$user = $_SESSION['useralias'];
?>
<table class="login" cellpadding="0" cellspacing="0" width="100%"><tbody><tr>
<td align="left" bgcolor="#ffffff" valign="top" width="150">
<tr>
<td><center>
Benvenuto <? echo $user ?>
Per modificare i tuoi dati clicca
QUI
</center></td>
</tr>
</tbody></table>
</td></tr>
<tr><td></td><td class="bottom"><center>
<font class="small">2005 Forti Massimo - Slackwarelife</font>
<a href="http://validator.w3.org/check/referer" target="_blank">
[img]slackwarelife_dir/valid-html401.jpg[/img]</a>
<a href="http://jigsaw.w3.org/css-validator/" target="_blank">
[img]slackwarelife_dir/vcss.jpg[/img]</a>
</center></td><td></td></tr></tbody></table>
</body></html>
<?
}
function login_filed() {
?>
<table class="login" cellpadding="0" cellspacing="0" width="100%"><tbody><tr>
<td align="left" bgcolor="#ffffff" valign="top" width="150">
<tr>
<td><center>
Errore di connessione!!!!
Hai inserito username e password non validi!!!!
Ritenta clliccando
QUI
Per richiedere la password persa clicca
QUI
Oppure accedi alla pagina di registrazione
QUI
</center></td>
</tr>
</tbody></table>
</td></tr>
<tr><td></td><td class="bottom"><center>
<font class="small">2005 Forti Massimo - Slackwarelife</font>
<a href="http://validator.w3.org/check/referer" target="_blank">
[img]slackwarelife_dir/valid-html401.jpg[/img]</a>
<a href="http://jigsaw.w3.org/css-validator/" target="_blank">
[img]slackwarelife_dir/vcss.jpg[/img]</a>
</center></td><td></td></tr></tbody></table>
</body></html>
<?
}
?>
Questa pagina funziona, ma non riesco a capire se è sicura, in rete non ho trovato cose tanto differenti, ma la paura è tanta, e la situazione descritta prima mi preoccupa.
Inoltre volevo chiedervi come poter indrodurre l'utilizzo dei cookies, chiedendo all'utente se vuole utilizzare tale sistema per poter effettuare il login automatica al prossimo accesso.
Vi chiedo aiuto, le cose che devo chiedere sono tante ed ogni aiuto per poter far crescere questo piccolo progetto saranno molto, molto gradite.
Grazie in anticipo