diff options
| author | polo <ordipolo@gmx.fr> | 2022-08-03 02:15:04 +0200 |
|---|---|---|
| committer | polo <ordipolo@gmx.fr> | 2022-08-03 02:15:04 +0200 |
| commit | e4a74650a36bbb72285d38d96ee2a0689031521e (patch) | |
| tree | fb08e0c3f1b72f3372598ce1ad535d382f6f5fc7 | |
| parent | 498ffeb0d502bbf1dbe70f0ae7a81c11b78af37d (diff) | |
| download | melaine-e4a74650a36bbb72285d38d96ee2a0689031521e.tar.gz melaine-e4a74650a36bbb72285d38d96ee2a0689031521e.tar.bz2 melaine-e4a74650a36bbb72285d38d96ee2a0689031521e.zip | |
captcha + améliorations regex + erreur 404
| -rw-r--r-- | .htaccess | 7 | ||||
| -rw-r--r-- | controller/Security.php | 29 | ||||
| -rw-r--r-- | controller/password.php | 49 | ||||
| -rw-r--r-- | erreur404.php | 6 | ||||
| -rw-r--r-- | model/Article.php | 13 | ||||
| -rw-r--r-- | public/css/donnees_hors_editeur.css | 2 | ||||
| -rw-r--r-- | view/password.php | 1 | ||||
| -rw-r--r-- | à faire après livraison.txt | 4 |
8 files changed, 77 insertions, 34 deletions
| @@ -2,7 +2,10 @@ | |||
| 2 | # ne décocher qu'une seule ligne "ErrorDocument" | 2 | # ne décocher qu'une seule ligne "ErrorDocument" |
| 3 | 3 | ||
| 4 | # site simple | 4 | # site simple |
| 5 | #ErrorDocument 404 http://localhost/melaine/erreur404.php | 5 | #ErrorDocument 404 /melaine/erreur404.php |
| 6 | 6 | ||
| 7 | # site "hôte virtuel" (cas des hébergeurs et d'une debian par défaut) | 7 | # site "hôte virtuel" local: melaine.localhost |
| 8 | ErrorDocument 404 /erreur404.php | 8 | ErrorDocument 404 /erreur404.php |
| 9 | |||
| 10 | # en utilisant une adresse distante (http) | ||
| 11 | #ErrorDocument 404 http://melainefavennec.com/erreur404.php | ||
diff --git a/controller/Security.php b/controller/Security.php index c4724de..39205c1 100644 --- a/controller/Security.php +++ b/controller/Security.php | |||
| @@ -32,22 +32,27 @@ function removeSpacesTabsCRLF(string $chaine): string | |||
| 32 | // lien sans http:// | 32 | // lien sans http:// |
| 33 | function fixLinks($data) | 33 | function fixLinks($data) |
| 34 | { | 34 | { |
| 35 | // 1/ | ||
| 35 | // si une adresse est de type "domaine.fr" sans le http:// devant, le comportement des navigateurs est de rechercher un fichier comme si mon adresse commençait par file:// | 36 | // si une adresse est de type "domaine.fr" sans le http:// devant, le comportement des navigateurs est de rechercher un fichier comme si mon adresse commençait par file:// |
| 36 | // tomber ainsi sur une page d'erreur est parfaitement déroutant | 37 | // tomber ainsi sur une page d'erreur est parfaitement déroutant |
| 37 | // une erreur 404 est détectée et le visiteur redirigé, mais ça ne règle pas le problème | ||
| 38 | 38 | ||
| 39 | // regex pour détecter les balises <a> et ajouter http:// au début des liens si nécessaire | 39 | // regex pour détecter les balises <a> et ajouter http:// au début des liens si nécessaire |
| 40 | $pattern = '#(<a.*href=")((?!https?://).*)(".*>)#'; | 40 | $pattern = '#(<a[^>]+href=")((?!https?://)[^>]+>)#'; |
| 41 | $remplacement = '$1http://$2$3'; | 41 | //$data = preg_replace($pattern, '$1http://$2', $data); |
| 42 | // le "while" est ici parce que preg_replace s'arrête après avec matché une fois | 42 | |
| 43 | // plus exactement, le .* à la fin fait que la chaine détectée va jusqu'à la fin des données (à corriger peut-être avec </a>) | 43 | // 2/ |
| 44 | while(preg_match($pattern, $data)) | 44 | // cas où la regex fait mal son boulot: |
| 45 | { | 45 | // l'erreur 404 est gérée par le .htaccess |
| 46 | $data = preg_replace($pattern, $remplacement, $data); | 46 | // et le visiteur est redirigé à la page "menu" |
| 47 | } | 47 | // (ça ne règle pas le problème mais c'est mieux) |
| 48 | 48 | ||
| 49 | // 2ème problème, en train d'écrire un article, l'utilisateur clique sur ce lien qu'il vient de créer et qui apparaît dans l'infobulle, un nouvelle onglet apparaît | 49 | // 3/ |
| 50 | // solution: fermer ce nouvel onglet avec echo '<SCRIPT>javascript:window.close()</SCRIPT>'; | 50 | // quand l'éditeur est ouvert (avant de valider l'article), |
| 51 | // le lien qu'on vient de créer apparaît dans l'infobulle, | ||
| 52 | // cliquer dessus ouvre un onglet sur une erreur 404 | ||
| 53 | // solution partielle avec le .htaccess | ||
| 54 | // | ||
| 55 | // solution? fermer ce nouvel onglet avec echo '<SCRIPT>javascript:window.close()</SCRIPT>'; | ||
| 51 | // comment déclencher le JS? en faisant qu'une erreur 404 causée pour cette raison soit particulière? | 56 | // comment déclencher le JS? en faisant qu'une erreur 404 causée pour cette raison soit particulière? |
| 52 | 57 | ||
| 53 | return($data); | 58 | return($data); |
diff --git a/controller/password.php b/controller/password.php index a163619..9d9b45b 100644 --- a/controller/password.php +++ b/controller/password.php | |||
| @@ -28,8 +28,8 @@ function existPassword() | |||
| 28 | 28 | ||
| 29 | function createCaptcha(): array | 29 | function createCaptcha(): array |
| 30 | { | 30 | { |
| 31 | $a = rand(2, 10); | 31 | $a = rand(2, 9); |
| 32 | $b = rand(2, 10); | 32 | $b = rand(2, 9); |
| 33 | return array(toLettersFrench($a), toLettersFrench($b), $a * $b); | 33 | return array(toLettersFrench($a), toLettersFrench($b), $a * $b); |
| 34 | } | 34 | } |
| 35 | 35 | ||
| @@ -61,16 +61,30 @@ function toLettersFrench(int $number): string | |||
| 61 | case 9: | 61 | case 9: |
| 62 | return 'neuf'; | 62 | return 'neuf'; |
| 63 | break; | 63 | break; |
| 64 | case 10: | 64 | default: |
| 65 | return 'dix'; | 65 | return ''; // erreur |
| 66 | break; | ||
| 67 | }; | 66 | }; |
| 68 | } | 67 | } |
| 69 | 68 | ||
| 70 | // vérifier qu'on a que des chiffres | 69 | // on veut des chiffres |
| 71 | function controlCaptchaInput() | 70 | function controlCaptchaInput(): int |
| 72 | { | 71 | { |
| 73 | //$_POST['captcha'] | 72 | if(is_numeric($_POST['captcha'])) // '2.3' est acceptés |
| 73 | { | ||
| 74 | // (int) supprime les décimales | ||
| 75 | if($_POST['captcha'] == (int) $_POST['captcha']) | ||
| 76 | { | ||
| 77 | return (int) $_POST['captcha']; | ||
| 78 | } | ||
| 79 | else | ||
| 80 | { | ||
| 81 | return 0; | ||
| 82 | } | ||
| 83 | } | ||
| 84 | else | ||
| 85 | { | ||
| 86 | return 0; | ||
| 87 | } | ||
| 74 | } | 88 | } |
| 75 | 89 | ||
| 76 | 90 | ||
| @@ -90,7 +104,7 @@ function createPassword() | |||
| 90 | $subHeading = 'Veuillez choisir le mot de passe que vous utiliserez pour gérer le site.'; | 104 | $subHeading = 'Veuillez choisir le mot de passe que vous utiliserez pour gérer le site.'; |
| 91 | require('view/password.php'); | 105 | require('view/password.php'); |
| 92 | 106 | ||
| 93 | // au rechargement après saisi | 107 | // contrôle de la saisie |
| 94 | if(isset($_POST['motdepasse']) && !empty($_POST['motdepasse']) && isset($_POST['captcha']) && (int) $_POST['captcha'] == $_SESSION['captcha']) | 108 | if(isset($_POST['motdepasse']) && !empty($_POST['motdepasse']) && isset($_POST['captcha']) && (int) $_POST['captcha'] == $_SESSION['captcha']) |
| 95 | { | 109 | { |
| 96 | // caractères non désirés supprimés | 110 | // caractères non désirés supprimés |
| @@ -116,6 +130,15 @@ function createPassword() | |||
| 116 | echo($errorBadCharacters); | 130 | echo($errorBadCharacters); |
| 117 | } | 131 | } |
| 118 | } | 132 | } |
| 133 | // saisie non valide | ||
| 134 | elseif(isset($_POST['captcha']) && controlCaptchaInput() == 0) | ||
| 135 | { | ||
| 136 | sleep(1); | ||
| 137 | echo($header); | ||
| 138 | echo($errorNonValidCaptcha); | ||
| 139 | echo($formulaireNouveauMDP); | ||
| 140 | echo($errorBadCharacters); | ||
| 141 | } | ||
| 119 | // mauvais captcha | 142 | // mauvais captcha |
| 120 | elseif(isset($_POST['captcha']) && (int) $_POST['captcha'] != $_SESSION['captcha']) | 143 | elseif(isset($_POST['captcha']) && (int) $_POST['captcha'] != $_SESSION['captcha']) |
| 121 | { | 144 | { |
| @@ -169,7 +192,13 @@ function connect() | |||
| 169 | header('Location: index.php?page=' . $_GET['from']); | 192 | header('Location: index.php?page=' . $_GET['from']); |
| 170 | exit(); | 193 | exit(); |
| 171 | } | 194 | } |
| 172 | 195 | // saisie non valide | |
| 196 | elseif(isset($_POST['captcha']) && controlCaptchaInput() == 0) | ||
| 197 | { | ||
| 198 | echo($errorNonValidCaptcha); | ||
| 199 | sleep(1); | ||
| 200 | echo($formulaireConnexion); | ||
| 201 | } | ||
| 173 | // mauvais captcha | 202 | // mauvais captcha |
| 174 | elseif(isset($_POST['captcha']) && (int) $_POST['captcha'] != $_SESSION['captcha']) | 203 | elseif(isset($_POST['captcha']) && (int) $_POST['captcha'] != $_SESSION['captcha']) |
| 175 | { | 204 | { |
diff --git a/erreur404.php b/erreur404.php index e8fc033..b5171d2 100644 --- a/erreur404.php +++ b/erreur404.php | |||
| @@ -1,6 +1,12 @@ | |||
| 1 | <?php | 1 | <?php |
| 2 | // erreur404.php | 2 | // erreur404.php |
| 3 | 3 | ||
| 4 | // cas des liens sans http:// devant (peut-être pas gérable) | ||
| 5 | //var_dump($_SERVER['REQUEST_URI']); | ||
| 6 | //exit(); | ||
| 7 | //$pattern = '#(<a[^>]+href=")((?!https?://)[^>]+>)#'; | ||
| 8 | //$data = preg_replace($pattern, '$1http://$2', $data); | ||
| 9 | |||
| 4 | // les erreurs 404 sont renvoyées ici par le .htaccess | 10 | // les erreurs 404 sont renvoyées ici par le .htaccess |
| 5 | header('Location: http://' . $_SERVER['HTTP_HOST'] . '/index.php?erreur=404'); | 11 | header('Location: http://' . $_SERVER['HTTP_HOST'] . '/index.php?erreur=404'); |
| 6 | 12 | ||
diff --git a/model/Article.php b/model/Article.php index 24480ed..d0fb019 100644 --- a/model/Article.php +++ b/model/Article.php | |||
| @@ -50,13 +50,12 @@ class Article | |||
| 50 | 50 | ||
| 51 | private function makeHtmlMiniImages($content) | 51 | private function makeHtmlMiniImages($content) |
| 52 | { | 52 | { |
| 53 | while(preg_match('#<img src=.+/images/.+>#', $content)) | 53 | // insérer -mini au nom du dossier et au fichier |
| 54 | { | 54 | // on choisit pour bien faire de cibler toute la balise <img/> |
| 55 | // ? => mode paresseux, on fait matcher le moins d'occurences possibles | 55 | $pattern = array('#(<img[^>]+/images(?!-mini))([^>]+>)#', |
| 56 | $pattern = '#(<img src=.+/)(images)(/.+?)(\.jpg|\.jpeg|\.png|\.gif.+>)#'; | 56 | '#(<img[^>]+)((?<!-mini)(\.jpg|\.jpeg|\.png|\.gif)[^>]+>)#'); |
| 57 | // insérer -mini au nom du dossier et au fichier | 57 | $remplacement = array('$1-mini$2', '$1-mini$2'); |
| 58 | $content = preg_replace($pattern, '$1$2-mini$3-mini$4', $content); | 58 | $content = preg_replace($pattern, $remplacement, $content); |
| 59 | } | ||
| 60 | 59 | ||
| 61 | return $content; | 60 | return $content; |
| 62 | } | 61 | } |
diff --git a/public/css/donnees_hors_editeur.css b/public/css/donnees_hors_editeur.css index 409dc59..620c6f8 100644 --- a/public/css/donnees_hors_editeur.css +++ b/public/css/donnees_hors_editeur.css | |||
| @@ -25,7 +25,7 @@ td p{margin: 0px;} | |||
| 25 | .image{width: fit-content;margin: 0px;text-align: center;margin: auto;/*height: 100%;*/} | 25 | .image{width: fit-content;margin: 0px;text-align: center;margin: auto;/*height: 100%;*/} |
| 26 | /*.image img{width: 100%;}*/ | 26 | /*.image img{width: 100%;}*/ |
| 27 | img{max-width: 100%;} | 27 | img{max-width: 100%;} |
| 28 | .image-style-side{float: right;} | 28 | .image-style-side{float: right; margin: 15px 0;} |
| 29 | .image-style-side:not(.image_resized){max-width: 50%;} | 29 | .image-style-side:not(.image_resized){max-width: 50%;} |
| 30 | .image>figcaption{padding: 7px; text-align: center; font-size: small; background-color: #f0f0f0;} | 30 | .image>figcaption{padding: 7px; text-align: center; font-size: small; background-color: #f0f0f0;} |
| 31 | 31 | ||
diff --git a/view/password.php b/view/password.php index c52274e..a72766e 100644 --- a/view/password.php +++ b/view/password.php | |||
| @@ -93,6 +93,7 @@ $header = ob_get_clean(); | |||
| 93 | 93 | ||
| 94 | // messages d'erreur | 94 | // messages d'erreur |
| 95 | $errorPassword = '<p class="avertissement" >Mauvais mot de passe</p>'; | 95 | $errorPassword = '<p class="avertissement" >Mauvais mot de passe</p>'; |
| 96 | $errorNonValidCaptcha = '<p class="avertissement" >Captcha non valide, veuillez saisir un nombre entier.</p>'; | ||
| 96 | $errorCaptcha = '<p class="avertissement" >Erreur au test anti-robot</p>'; | 97 | $errorCaptcha = '<p class="avertissement" >Erreur au test anti-robot</p>'; |
| 97 | $errorBadCharacters = '<p class="avertissement" >Caractères interdits: espaces, tabulations, sauts CR/LF.</p>'; | 98 | $errorBadCharacters = '<p class="avertissement" >Caractères interdits: espaces, tabulations, sauts CR/LF.</p>'; |
| 98 | $messageDeconnect = "<p class='connexionP connexionFooter' ><i>N'oubliez de cliquer sur 'déconnexion' quand vous aurez fini.</i></p>"; | 99 | $messageDeconnect = "<p class='connexionP connexionFooter' ><i>N'oubliez de cliquer sur 'déconnexion' quand vous aurez fini.</i></p>"; |
diff --git a/à faire après livraison.txt b/à faire après livraison.txt index fb6dcbb..06f3f8e 100644 --- a/à faire après livraison.txt +++ b/à faire après livraison.txt | |||
| @@ -2,6 +2,8 @@ variable de session avec vérification du captcha | |||
| 2 | 2 | ||
| 3 | changer la police des titres pour une qui supporte les lettres accentuées | 3 | changer la police des titres pour une qui supporte les lettres accentuées |
| 4 | 4 | ||
| 5 | images d'en-tête svg? | ||
| 6 | |||
| 5 | changer la polices dans les images de BD (si je trouve mieux que comic sans MS) | 7 | changer la polices dans les images de BD (si je trouve mieux que comic sans MS) |
| 6 | 8 | ||
| 7 | images des articles en grand et miniature, Zoom sur images (articles) | 9 | images des articles en grand et miniature, Zoom sur images (articles) |
| @@ -18,8 +20,6 @@ créer page musique | |||
| 18 | 20 | ||
| 19 | n'utiliser que les grandes images dans le menu | 21 | n'utiliser que les grandes images dans le menu |
| 20 | 22 | ||
| 21 | images d'en-tête svg? | ||
| 22 | |||
| 23 | déconnexion automatique quand inactivité | 23 | déconnexion automatique quand inactivité |
| 24 | 24 | ||
| 25 | dans installation.php, utiliser la racine dans config.php pour adapter le .htaccess (si c'est possible) | 25 | dans installation.php, utiliser la racine dans config.php pour adapter le .htaccess (si c'est possible) |
