Deploy tramite custom CI/CD Action
All checks were successful
Deploy / trigger (push) Successful in 2s

This commit is contained in:
2026-01-28 21:50:40 +01:00
parent 31653b13dc
commit 9b71395d09
31 changed files with 2205 additions and 30 deletions

314
esercizio1/eventi.css Normal file
View File

@@ -0,0 +1,314 @@
*,
*::before,
*::after {
margin: 0;
padding: 0;
box-sizing: border-box;
}
html {
color-scheme: dark;
}
body,
input,
button,
select,
textarea {
font-family: "Outfit", sans-serif;
}
body {
background-color: hsl(219, 69%, 10%);
color: #fff;
display: flex;
flex-direction: column;
min-height: 100vh;
}
.container {
width: 95%;
max-width: 1200px;
margin-left: auto;
margin-right: auto;
}
header {
position: fixed;
top: 0;
left: 0;
width: 100%;
background-color: hsla(219, 69%, 6%, 0.9);
backdrop-filter: blur(6px);
-webkit-backdrop-filter: blur(6px);
padding: 0.5rem 0;
z-index: 3;
}
header .container {
display: flex;
flex-direction: row;
flex-wrap: nowrap;
justify-content: space-between;
align-items: center;
gap: 1rem;
}
header .logo img {
width: 100%;
height: auto;
display: block;
}
header .logo {
width: 2rem;
user-select: none;
}
.hero {
background-color: hsl(219, 69%, 10%);
background-image: url("img/hero.jpg");
background-position: 50% 80%;
background-repeat: no-repeat;
background-size: cover;
}
.hero .overlay {
padding: 12rem 1rem 8rem 1rem;
background-color: hsla(219, 69%, 5%, 0.6);
backdrop-filter: blur(2px);
-webkit-backdrop-filter: blur(2px);
text-align: center;
}
img {
width: 100%
}
.page {
flex-grow: 1;
}
section {
margin-top: 4rem;
margin-bottom: 4rem;
text-align: center;
}
section h2 {
margin-bottom: 2rem;
user-select: none;
}
section form {
display: flex;
flex-direction: row;
flex-wrap: nowrap;
justify-content: center;
align-items: center;
gap: 1.5rem;
background-color: hsl(219, 69%, 20%);
width: 95%;
max-width: 900px;
margin: 1rem auto;
margin-bottom: 0;
padding: 1rem;
border-radius: 1rem;
box-shadow: 0px 0px 20px hsla(219, 69%, 10%, 0.4);
}
section form fieldset {
border: none;
display: flex;
flex-direction: row;
align-items: center;
flex-wrap: nowrap;
gap: 1rem;
text-align: left;
width: 100%;
max-width: 100%;
}
section form fieldset.buttons {
max-width: max-content;
}
section form fieldset label {
font-size: 1.2rem;
}
section form fieldset input[type="text"] {
font-size: 98%;
padding: 0.4rem 0.6rem;
border-radius: 0.5rem;
border: 1px solid hsla(219, 69%, 75%, 0.5);
width: 100%;
max-width: 100%;
background-color: hsla(219, 69%, 5%, 0.8);
}
section form fieldset input[type="text"]:hover,
section form fieldset input[type="text"]:focus {
border: 1px solid hsla(219, 69%, 75%, 1);
outline: none;
}
section form fieldset input[type="submit"],
section form fieldset input[type="button"],
.button {
font-size: 95%;
padding: 0.4rem 0.6rem;
border-radius: 0.5rem;
background-color: hsl(219, 69%, 75%);
color: hsl(219, 69%, 10%);
font-weight: bold;
text-transform: uppercase;
border: none;
cursor: pointer;
text-decoration: none;
user-select: none;
}
section form fieldset input[type="submit"]:hover,
section form fieldset input[type="button"]:hover,
.button:hover {
background-color: hsl(219, 69%, 70%);
}
section .boxes {
display: grid;
grid-template-columns: 1fr 1fr 1fr 1fr;
display: flex;
flex-direction: column;
gap: 2rem;
}
section .boxes .box {
display: flex;
flex-direction: row;
flex-wrap: nowrap;
width: 99%;
max-width: 1100px;
margin: 0 auto;
background-color: hsl(219, 69%, 20%);
border-radius: 1rem;
overflow: hidden;
box-shadow: 0px 0px 20px hsla(219, 69%, 10%, 0.4);
}
section .boxes .box .image {
flex-grow: 1;
max-width: 25rem;
min-width: 25rem;
}
section .boxes .box .image img {
width: 100%;
object-fit: cover;
height: 100%;
display: block;
aspect-ratio: 4/3;
user-select: none;
}
section .boxes .box .data {
flex-grow: 2;
text-align: left;
display: flex;
flex-direction: column;
padding: 1rem;
}
section .boxes .box .data h3 {
font-size: 1.8rem;
}
@media only screen and (max-width: 767px) {
section .boxes .box .image {
max-width: 12rem;
min-width: 12rem;
}
section .boxes .box .data h3 {
font-size: 1.5rem;
}
}
@media only screen and (max-width: 600px) {
section form {
flex-direction: column;
}
section .boxes .box .image {
max-width: 100%;
min-width: 12rem;
}
section .boxes .box {
flex-direction: column;
}
}
section .boxes .box .data .meta {
display: flex;
flex-direction: row;
flex-wrap: wrap;
margin: 1rem 0;
justify-content: flex-start;
align-items: center;
gap: 0.5rem;
user-select: none;
}
section .boxes .box .data .meta p {
display: flex;
flex-direction: row;
align-items: center;
gap: 0.5rem;
width: max-content;
padding: 0.2rem 0.4rem;
border-radius: 0.5rem;
background-color: hsl(219, 69%, 30%);
}
section .boxes .box .data .grow {
flex-grow: 1;
}
section .buttons {
display: flex;
flex-direction: row;
flex-wrap: wrap;
gap: 0.5rem;
align-items: center;
justify-content: center;
}
section .boxes .box .data .buttons {
justify-content: flex-end;
margin-top: 1rem;
}
code {
background-color: hsl(221, 14%, 14%);
color: #ff6685;
padding: 0.2rem 0.3rem;
border-radius: 0.5rem;
}
.count {
transition: all 150ms cubic-bezier(0.165, 0.84, 0.44, 1);
transform: scale(1);
}
.animated {
color: yellow;
transform: scale(1.2) rotate(3deg);
}
footer {
text-align: center;
background-color: hsla(219, 69%, 6%, 0.8);
padding: 1rem 0;
}

BIN
esercizio1/favicon.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 45 KiB

View File

@@ -0,0 +1,10 @@
Ho scelto di utilizzare il metodo GET per 3 motivi principali:
- Semplicità di implementazione
- Dati inviati non sensibili
- Possibilità dell'utente di mantenere e/o salvare la ricerca effettuata
I dati inviati saranno visibili nell'URL, nel formato chiave=valore dopo il simbolo ?.
Le coppie chiave-valore vengono separate dal simbolo &.

Binary file not shown.

After

Width:  |  Height:  |  Size: 198 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 87 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 305 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 384 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 180 KiB

BIN
esercizio1/img/flag-ctf.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 39 KiB

BIN
esercizio1/img/hero.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 MiB

227
esercizio1/index.html Normal file
View File

@@ -0,0 +1,227 @@
<!DOCTYPE html>
<html lang="it">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>SecureTickets</title>
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=Outfit:wght@100..900&display=swap" rel="stylesheet">
<link rel="stylesheet" href="eventi.css">
<link rel="icon" type="image/png" href="favicon.png" sizes="96x96" />
<script src="https://kit.fontawesome.com/c2497a668c.js" crossorigin="anonymous" type="text/javascript"></script>
</head>
<body>
<header>
<div class="container">
<div class="logo">
<img src="logo.png" alt="SecureTickets">
<h3>SecureTickets</h3>
</div>
<div class="count" id="animation">
<i class="fa-solid fa-ticket"></i> Biglietti: <span id="counter">0</span>
</div>
</div>
</header>
<div class="hero">
<div class="overlay">
<div class="container">
<h1>Piattaforma n. 1 per cercare eventi</h1>
</div>
</div>
</div>
<div class="page">
<section class="container">
<h2>Cerca un evento</h2>
<p>Utilizza la nostra nuova ricerca sicura per trovare l'evento desiderato, oppure consulta la sezione in
evidenza!
</p>
<form method="get" action="process_eventi.php">
<fieldset>
<label for="nome-evento"><i class="fa-solid fa-tag"></i></label>
<input type="text" id="nome-evento" name="nome-evento" placeholder="Nome evento" required>
</fieldset>
<fieldset>
<label for="citta"><i class="fa-solid fa-map-location-dot"></i></label>
<input type="text" id="citta" name="citta" placeholder="Città" required>
</fieldset>
<fieldset class="buttons">
<input type="submit" value="Cerca">
</fieldset>
</form>
</section>
<section class="container">
<h2>In evidenza</h2>
<div class="boxes">
<div class="box">
<div class="image">
<img src="img/evento-bon-jovi.webp" alt="Bon Jovi">
</div>
<div class="data">
<h3>Bon Jovi - Forever Tour</h3>
<div class="meta">
<p><i class="fa-solid fa-calendar-day"></i> 24 luglio 2026</p>
<p><i class="fa-solid fa-map-pin"></i> Arena di Verona</p>
</div>
<p>La leggenda del rock torna in Italia! Bon Jovi arriva allArena di Verona con il “Forever
Tour”,
per una serata di pura energia tra i brani del nuovo album e i grandi classici come Livin
on a
Prayer, Always e Its My Life.
</p>
<div class="grow"></div>
<div class="buttons">
<button class="button" onclick="addBiglietto()">Acquista biglietto</button>
</div>
</div>
</div>
<div class="box">
<div class="image">
<img src="img/evento-david-gilmour.webp" alt="David Gilmour">
</div>
<div class="data">
<h3>David Gilmour - Luck And Strange Tour</h3>
<div class="meta">
<p><i class="fa-solid fa-calendar-day"></i> 18 marzo 2026</p>
<p><i class="fa-solid fa-map-pin"></i> Circo Massimo, Roma</p>
</div>
<p>Il leggendario chitarrista dei Pink Floyd torna in Italia con il tour “Luck and Strange”.
Gilmour
presenta i brani del nuovo album e i capolavori che hanno fatto la storia del rock
psichedelico
in un emozionante viaggio sonoro al Circo Massimo.
</p>
<div class="grow"></div>
<div class="buttons">
<button class="button" onclick="addBiglietto()">Acquista biglietto</button>
</div>
</div>
</div>
<div class="box">
<div class="image">
<img src="img/evento-scorpions.jpg" alt="Scorpions">
</div>
<div class="data">
<h3>Scorpions - Coming Home 60th Years Tour</h3>
<div class="meta">
<p><i class="fa-solid fa-calendar-day"></i> 16 agosto 2026</p>
<p><i class="fa-solid fa-map-pin"></i> Arena di Verona</p>
</div>
<p>La storica band tedesca festeggia 60 anni di carriera con un tour speciale! Gli Scorpions tornano in Italia con tutti i loro successi, da Wind of Change a Still Loving You, fino allenergia di Rock You Like a Hurricane. Una serata esplosiva e ricca di emozioni nel segno del grande rock!
</p>
<div class="grow"></div>
<div class="buttons">
<button class="button" onclick="addBiglietto()">Acquista biglietto</button>
</div>
</div>
</div>
<div class="box">
<div class="image">
<img src="img/evento-presepe-vivente-panettieri.jpg" alt="Presepe Vivente">
</div>
<div class="data">
<h3>Presepe Vivente - XXI Edizione</h3>
<div class="meta">
<p><i class="fa-solid fa-calendar-day"></i> 24 dicembre 2025</p>
<p><i class="fa-solid fa-map-pin"></i> Panettieri (CS)</p>
</div>
<p>Torna il suggestivo Presepe Vivente di Panettieri, giunto alla ventunesima edizione. Le vie
del
borgo si animano con botteghe, figuranti e sapori tradizionali per rivivere la magia della
Natività nel cuore della Sila.
</p>
<div class="grow"></div>
<div class="buttons">
<button class="button" onclick="addBiglietto()">Acquista biglietto</button>
</div>
</div>
</div>
<div class="box">
<div class="image">
<img src="img/evento-matera.jpg" alt="Matera Light Festival">
</div>
<div class="data">
<h3>Matera Light Festival 2026</h3>
<div class="meta">
<p><i class="fa-solid fa-calendar-day"></i> 10-19 ottobre 2026</p>
<p><i class="fa-solid fa-map-pin"></i> Matera (MT)</p>
</div>
<p>La Città dei Sassi si illumina con il Matera Light Festival, dove arte, tecnologia e
paesaggio si
fondono in installazioni, videomapping e giochi di luce che valorizzano la bellezza senza
tempo
di Matera e del suo patrimonio UNESCO.
</p>
<div class="grow"></div>
<div class="buttons">
<button class="button" onclick="addBiglietto()">Acquista biglietto</button>
</div>
</div>
</div>
</div>
</section>
<section class="container">
<h2>HTTP GET e POST</h2>
<div class="boxes">
<div class="box">
<div class="data">
<h3>GET</h3>
<p>Metodo di HTTP utilizzato per inviare dati al server. I dati sono inviati nell'URL, dopo il
simbolo <code>?</code> (Query String).</p>
<p>I valori inviati sono visibili, e vengono inviati secondo lo schema
<code>chiave=valore</code>, separando più coppie chiave-valore con il simbolo
<code>&</code>.</p>
<p>Possono essere inviati al massimo 2048 caratteri.</p>
</div>
</div>
<div class="box">
<div class="data">
<h3>POST</h3>
<p>Metodo di HTTP utilizzato per inviare dati al server. I dati non vengono inseriti in chiaro
nell'URL, ma vengono inseriti nel <code>body</code> della richiesta HTTP.</p>
<p>Non ci sono limiti di caratteri per invio. Viene preferito il metodo POST per l'utilizzo di
file, grandi quantità di informazioni o dati sensibili.</p>
</div>
</div>
</div>
</section>
</div>
<footer>
<script>
function addBiglietto() {
const counter = document.getElementById("counter");
const animation = document.getElementById("animation");
animation.classList.add("animated");
const newValue = Number(counter.innerText) + 1;
counter.innerText = newValue;
setTimeout(() => {
animation.classList.remove("animated");
}, 200);
}
</script>
<div class="container">
Realizzato da Francesco Giuseppe Mancuso - classe 5E - www.francescomancuso.it
</div>
</footer>
</body>
</html>

BIN
esercizio1/logo.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 331 KiB

View File

@@ -0,0 +1,84 @@
<?php
if (isset($_GET["sorgente"])) {
highlight_file("process_eventi.php");
exit;
}
?>
<!DOCTYPE html>
<html lang="it">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Ricerca > SecureTickets</title>
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=Outfit:wght@100..900&display=swap" rel="stylesheet">
<link rel="stylesheet" href="eventi.css">
<link rel="icon" type="image/png" href="favicon.png" sizes="96x96" />
<script src="https://kit.fontawesome.com/c2497a668c.js" crossorigin="anonymous" type="text/javascript"></script>
</head>
<body>
<header>
<div class="container">
<div class="logo">
<img src="logo.png" alt="SecureTickets">
<h3>SecureTickets</h3>
</div>
<div class="count">
Biglietti: 0
</div>
</div>
</header>
<div class="hero">
<div class="overlay">
<div class="container">
<h1>Piattaforma n. 1 per cercare eventi</h1>
</div>
</div>
</div>
<div class="page">
<section class="container">
<?php
if (!isset($_GET["nome-evento"]) || !isset($_GET["citta"])) {
// Dati non completi
?>
<h2>Richiesta non completa, riprova</h2>
<?php
} else {
// Sanitizzazione input necessaria per query DB ricerca
$nome = htmlspecialchars($_GET["nome-evento"]);
$citta = htmlspecialchars($_GET["citta"]);
echo "<h3>Hai cercato</h3>";
echo "<h2>" . $nome . " in " . $citta . "</h2>";
echo "<p>Nessun evento trovato, per ora, ma l'invio dei dati con l'array <code>&dollar;_GET</code> funziona!</p>";
}
?>
</section>
<section class="container">
<div class="buttons">
<a class="button" onclick="history.back();">Torna indietro</a>
<a class="button" href="process_eventi.php?sorgente">Leggi sorgente</a>
<a class="button" href="../esercizio2">Es. successivo</a>
</div>
</section>
</div>
<footer>
<div class="container">
Realizzato da Francesco Giuseppe Mancuso - classe 5E - www.francescomancuso.it
</div>
</footer>
</body>
</html>