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

403
esercizio3/candidatura.css Normal file
View File

@@ -0,0 +1,403 @@
*,
*::before,
*::after {
margin: 0;
padding: 0;
box-sizing: border-box;
}
html {
color-scheme: light;
}
body,
input,
button,
select,
textarea {
font-family: "Outfit", sans-serif;
}
body {
background-color: hsl(44, 100%, 96%);
color: #000101;
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: #264f36;
backdrop-filter: blur(6px);
-webkit-backdrop-filter: blur(6px);
padding: 1rem 0;
z-index: 3;
}
header .container {
display: flex;
flex-direction: row;
flex-wrap: nowrap;
justify-content: center;
align-items: center;
gap: 1rem;
}
header .logo {
display: flex;
flex-direction: row;
align-items: center;
gap: 0.5rem;
color: #fff;
}
header .logo img {
display: block;
height: auto;
width: 2rem;
}
.hero {
background-color: #264f36;
background-image: url("img/hero.jpg");
background-position: 50% 20%;
background-repeat: no-repeat;
background-size: cover;
}
.hero .overlay {
padding: 12rem 1rem 8rem 1rem;
background-color: hsla(43, 100%, 53%, 0.8);
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: 1rem;
}
.notice {
width: 95%;
max-width: 900px;
font-size: 87%;
opacity: 0.85;
margin: 0 auto;
font-style: italic;
}
section form {
background-color: hsl(44, 100%, 86%);
width: 95%;
max-width: 900px;
margin: 2rem auto;
margin-bottom: 0;
padding: 0rem;
border-radius: 1rem;
box-shadow: 0px 0px 20px hsla(44, 100%, 86%, 0.4);
border: 1px solid hsla(43, 100%, 53%, 1);
position: relative;
}
section form .effect {
background-color: hsla(43, 100%, 53%, 1);
background: linear-gradient(0deg, #ffbb0f 30%, transparent);
height: 65%;
width: 100%;
border-radius: 0 0 0.9rem 0.9rem;
position: absolute;
left: 0;
bottom: 0;
z-index: 0;
}
section form .container {
z-index: 1;
padding: 1rem;
padding-bottom: 2rem;
width: 100%;
display: flex;
flex-direction: column;
flex-wrap: nowrap;
justify-content: center;
align-items: center;
position: relative;
gap: 1rem;
}
section form img {
height: auto;
width: calc(100% - 2rem);
position: absolute;
top: 100%;
left: 1rem;
}
section form .orizzontale {
display: flex;
flex-direction: row;
align-items: flex-start;
flex-wrap: nowrap;
gap: 1rem;
width: 100%;
}
section form fieldset {
border: none;
display: flex;
flex-direction: row;
align-items: center;
flex-wrap: nowrap;
gap: 0.5rem;
text-align: left;
width: 100%;
max-width: 100%;
}
section form .orizzontale fieldset {
flex-direction: column;
justify-content: flex-start;
align-items: flex-start;
}
section form fieldset.buttons {
max-width: max-content;
}
section form fieldset label {
user-select: none;
}
section form .orizzontale fieldset > label {
display: block;
width: 100%;
font-weight: bold;
}
section form fieldset input[type="text"],
section form fieldset input[type="email"],
section form fieldset textarea {
font-size: 98%;
padding: 0.4rem 0.6rem;
border-radius: 0.5rem;
border: 1px solid hsla(143, 35%, 23%, 0.5);
width: 100%;
max-width: 100%;
background-color: hsla(143, 35%, 95%, 0.8);
}
section form fieldset input[type="file"] {
font-size: 88%;
width: 100%;
max-width: 100%;
}
section form fieldset input[type="text"]:hover,
section form fieldset input[type="text"]:focus,
section form fieldset input[type="email"]:hover,
section form fieldset input[type="email"]:focus,
section form fieldset textarea:hover,
section form fieldset textarea:focus {
border: 1px solid hsla(143, 35%, 23%, 1);
outline: none;
}
section form fieldset textarea {
resize: vertical;
}
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: #264f36;
color: #fff;
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(143, 35%, 18%);
}
#upload {
margin-bottom: 1rem;
}
.uploader {
display: flex !important;
flex-direction: column;
align-items: center;
justify-content: center;
padding: 1rem;
border-radius: 1rem;
width: 100%;
height: 8rem;
text-align: center;
margin-top: 1rem;
border: 3px dashed hsla(143, 35%, 23%, 0.8);
background-color: hsla(143, 35%, 95%, 0.8);
white-space: unset;
cursor: pointer;
}
.uploader span {
font-weight: normal;
font-size: 90%;
}
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(143, 35%, 20%);
color: #fff;
border-radius: 1rem;
overflow: hidden;
box-shadow: 0px 0px 20px hsla(143, 35%, 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;
}
section .boxes .box .data {
flex-grow: 2;
text-align: left;
display: flex;
flex-direction: column;
padding: 1rem;
}
section .boxes .box .data h3,
.corso-box .data h3 {
font-size: 1.8rem;
}
@media only screen and (max-width: 767px) {
section .boxes .box .data h3,
.corso-box .data h3 {
font-size: 1.5rem;
}
}
@media only screen and (max-width: 600px) {
section form .orizzontale {
flex-direction: column;
align-items: stretch;
}
}
section .boxes .box .data .meta,
.corso-box .data .meta {
display: flex;
flex-direction: row;
flex-wrap: wrap;
margin: 1rem 0;
justify-content: flex-start;
align-items: center;
gap: 0.5rem;
}
section .boxes .box .data .meta p,
.corso-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(143, 35%, 30%);
}
section .buttons {
display: flex;
flex-direction: row;
flex-wrap: wrap;
gap: 0.5rem;
align-items: center;
justify-content: center;
}
code {
background-color: #fff;
color: hsl(348, 100%, 40%);
padding: 0.2rem 0.3rem;
border-radius: 0.5rem;
}
.post-data {
display: flex;
flex-direction: column;
align-items: center;
gap: 1rem;
margin-top: 2rem;
}
a {
color: hsl(143, 35%, 23%);
}
footer {
text-align: center;
background-color: hsl(143, 35%, 23%);
padding: 1rem 0;
color: #fff;
}

BIN
esercizio3/favicon.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.3 KiB

View File

@@ -0,0 +1,6 @@
Ho scelto di utilizzare il metodo POST perché i dati inviati al server HTTP sono sensibili e non devono essere visibili in chiaro nell'URL.
I dati verranno quindi inseriti nel body della Request.
Ho aggiunto per la lettura dei metadata del file caricato l'attributo enctype="multipart/form-data" al <form>.
Lato server, ho utilizzato l'array associativo $_FILES[]

BIN
esercizio3/img/graphic.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

BIN
esercizio3/img/hero.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 139 KiB

161
esercizio3/index.html Normal file
View File

@@ -0,0 +1,161 @@
<!DOCTYPE html>
<html lang="it">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Candidati ora!</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="candidatura.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="McDonald's">
<h3>McDonald's</h3>
</div>
</div>
</header>
<div class="hero">
<div class="overlay">
<div class="container">
<h1>Invia la tua candidatura</h1>
</div>
</div>
</div>
<div class="page">
<section class="container">
<h2>Vuoi far parte della nostra squadra?</h2>
<p>Compila il form e inviaci una candidatura spontanea!</p>
<br>
<p class="notice">Le rendiamo noto che la sua candidatura potrà essere gestita direttamente da McDonalds
Italia S.r.l. in
qualità di titolare del trattamento oppure da soggetti appartenenti al sistema a marchio McDonalds che
gestiranno la fase di selezione come Titolari autonomi del trattamento.</p>
<form method="post" action="process_candidatura.php" enctype="multipart/form-data">
<div class="effect"></div>
<img src="img/graphic.png">
<div class="container">
<div class="orizzontale">
<fieldset>
<label for="nome"><i class="fa-solid fa-user"></i> Nome e Cognome</label>
<input type="text" id="nome" name="nome" required>
</fieldset>
<fieldset>
<label for="email"><i class="fa-solid fa-envelope"></i> E-mail</label>
<input type="email" id="email" name="email" required>
</fieldset>
</div>
<div class="orizzontale">
<fieldset>
<h4>Livello di esperienza</h4>
<div class="radio">
<input type="radio" id="junior" name="esperienza" value="Junior" required>
<label for="junior">Livello Junior</label><br>
<input type="radio" id="mid" name="esperienza" value="Mid">
<label for="mid">Livello Mid</label><br>
<input type="radio" id="senior" name="esperienza" value="Senior">
<label for="senior">Livello Senior</label>
</div>
</fieldset>
<fieldset>
<h4>Competenze</h4>
<div class="radio">
<input type="checkbox" id="html" name="competenze[]" value="Conoscenza di HTML">
<label for="html">Conoscenza di HTML</label><br>
<input type="checkbox" id="css" name="competenze[]" value="Conoscenza di CSS">
<label for="css">Conoscenza di CSS</label><br>
<input type="checkbox" id="js" name="competenze[]" value="Conoscenza di JavaScript">
<label for="js">Conoscenza di JavaScript</label><br>
<input type="checkbox" id="php" name="competenze[]" value="Conoscenza di PHP">
<label for="php">Conoscenza di PHP</label><br>
<input type="checkbox" id="py" name="competenze[]" value="Conoscenza di Python">
<label for="py">Conoscenza di Python</label>
</div>
</fieldset>
</div>
<div class="orizzontale">
<fieldset>
<label class="uploader" for="upload">Carica il tuo CV<br><span>Premi qui per selezionare un
documento</span></label>
<input id="upload" type="file" name="curriculum"
accept=".pdf,.doc,application/vnd.openxmlformats-officedocument.wordprocessingml.document">
</fieldset>
</div>
<div class="orizzontale">
<fieldset>
<label for="lettera">Lettera di presentazione</label>
<textarea id="lettera" name="lettera" rows="5"
placeholder="Scrivi qui o incolla la tua lettera di presentazione..."
required></textarea>
</fieldset>
</div>
<h4 style="width: 100%;text-align: left;margin-top: 0.5rem;">Informativa</h4>
<fieldset>
<input type="checkbox" id="accetto" name="accetto" required>
<label for="accetto">Accetto l'Informativa sulla Privacy</label>
</fieldset>
<fieldset class="buttons">
<input type="submit" value="Invia">
</fieldset>
</div>
</form>
</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>
<div class="container">
Realizzato da Francesco Giuseppe Mancuso - classe 5E - www.francescomancuso.it
</div>
</footer>
</body>
</html>

BIN
esercizio3/logo.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

View File

@@ -0,0 +1,169 @@
<?php
if (isset($_GET["sorgente"])) {
highlight_file("process_candidatura.php");
exit;
}
if ($_SERVER["REQUEST_METHOD"] === "GET") {
die("<code>Questa pagina blocca il metodo GET, compila prima il modulo!</code>");
}
?>
<!DOCTYPE html>
<html lang="it">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Candidatura confermata</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="candidatura.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="McDonald's">
<h3>McDonald's</h3>
</div>
</div>
</header>
<div class="hero">
<div class="overlay">
<div class="container">
<h1>Invio confermato!</h1>
</div>
</div>
</div>
<div class="page">
<section class="container">
<h2>Grazie per aver inviato la tua candidatura!</h2>
<p>Ecco i dati che abbiamo ricevuto (array <code>&dollar;_POST</code>): </p>
<div class="post-data">
<?php
if (!isset($_POST)) {
// Dati mancanti
?>
<h2>Invio dati del form non completo, riprova!</h2>
<?php
} else {
// Controllo la presenza di ogni variabile
echo "<p><strong>Nome</strong><br>";
if (isset($_POST["nome"])) {
// Sanitizzazione input necessaria
$var = htmlspecialchars($_POST["nome"]);
echo $var;
} else {
echo "<code>NON PRESENTE</code>";
}
echo "</p>";
echo "<p><strong>E-mail</strong><br>";
if (isset($_POST["email"])) {
// Sanitizzazione input necessaria
$var = htmlspecialchars($_POST["email"]);
echo $var;
} else {
echo "<code>NON PRESENTE</code>";
}
echo "</p>";
echo "<p><strong>Esperienza</strong><br>";
if (isset($_POST["esperienza"])) {
// Sanitizzazione input necessaria
$var = htmlspecialchars($_POST["esperienza"]);
echo $var;
} else {
echo "<code>NON PRESENTE</code>";
}
echo "</p>";
echo "<p><strong>Competenze</strong><br>";
if (isset($_POST["competenze"])) {
// Sanitizzazione input necessaria
foreach ($_POST["competenze"] as $competenza) {
echo htmlspecialchars($competenza);
echo "<br>";
}
} else {
echo "<code>NON PRESENTE</code>";
}
echo "</p>";
echo "<p><strong>File allegato</strong><br>";
if (isset($_POST["curriculum"]) || isset($_FILES["curriculum"])) {
// Sanitizzazione necessaria solo per salvataggio del file, con permessi di esecuzione bloccati
echo "<i>Nome</i>: " . $_FILES["curriculum"]['name'];
echo "<br><i>Tipo di file</i>: " . $_FILES['curriculum']['type'];
echo "<br><i>Directory temporanea</i>: " . $_FILES['curriculum']['tmp_name'];
echo "<br><i>Errori riscontrati</i>: " . $_FILES['curriculum']['error'];
echo "<br><i>Dimensione</i>: " . $_FILES['curriculum']['size'] . " B";
echo "<br><br>Utilizzato l'array di PHP <code>&dollar;_FILES</code> e l'attributo <code>enctype=\"multipart/form-data\"</code> al modulo";
} else {
echo "<code>NON PRESENTE</code>";
}
echo "</p>";
echo "<p><strong>Lettera di presentazione</strong><br>";
if (isset($_POST["lettera"])) {
// Sanitizzazione input necessaria
$var = htmlspecialchars($_POST["lettera"]);
echo $var;
} else {
echo "<code>NON PRESENTE</code>";
}
echo "</p>";
echo "<p><strong>Privacy accettata</strong><br>";
if (isset($_POST["accetto"])) {
echo "Si";
} else {
echo "No";
}
echo "</p>";
}
?>
</div>
</section>
<section class="container">
<p>Verrai molto presto ricontattato da uno dei nostri addetti!<br><a
href="https://www.adaptivesecurity.com/blog/mcdonalds-password-data-breach" target="_blank">
Per approfondire&nbsp;&nbsp;<i class="fa-solid fa-arrow-up-right-from-square"></i></a></p>
</section>
<section class="container">
<div class="buttons">
<a class="button" onclick="history.back();">Torna indietro</a>
<a class="button" href="process_candidatura.php?sorgente">Leggi sorgente</a>
<a class="button" href="../">Torna all'inizio</a>
</div>
</section>
</div>
<footer>
<div class="container">
Realizzato da Francesco Giuseppe Mancuso - classe 5E - www.francescomancuso.it
</div>
</footer>
</body>
</html>