Avatar billede nemlig Professor
16. januar 2025 - 15:43 Der er 8 kommentarer og
1 løsning

Tjek input for tilladte tegn

Hejsa.
Jeg har et script, som danner en PDF-fil ud fra indholdet i et input-felt.
Til at danne PDF-filen anvender jeg et bibliotek, der hedder www.fpdf.org.
Dette bibliotek håndterer ikke tegnsættet UTF-8, men input-feltet (scriptet) er lavet med tegnsættet UTF-8.
Derfor konverterer jeg UTF-8 til ISO-8859-1 når PDF-filen dannes.
Det gør jeg med denne funktion:
function utf8_iso($utf){     
  $utf = iconv('UTF-8', 'ISO-8859-1',$utf);
  $utf = htmlspecialchars_decode($utf,ENT_QUOTES);
  return $utf;
}

Jeg mangler at lave en validering på infput-feltet, således der kun accepteres tegn fra tegnsættet ISO-8859-1.

Nogen forslag til, hvordan jeg kan tjekke for tilladte tegn?
Avatar billede ejvindh Ekspert
16. januar 2025 - 20:06 #1
Jeg tænker der er nogle gode forslag her:
https://stackoverflow.com/questions/6334134/fpdf-utf-8-encoding-how-to

Enten konvertere strengen med iconv, eller bruge en udgave af fpdf, der kan håndtere utf-8: http://fpdf.org/en/script/script92.php

Eller selvfølgelig bruge alternative biblioteker (mPDF or TCPDF), der kan håndtere utf-8.
Avatar billede NicoIversen Mester
16. januar 2025 - 22:18 #2
For at validere, at input-feltet kun indeholder tegn, der er tilladt i ISO-8859-1 (Latin-1), kan du bruge en regular expression (regex) til at tjekke, om strengen kun indeholder tegn fra dette tegnsæt.

ISO-8859-1 (Latin-1) omfatter tegn fra 0x00 til 0xFF (alle ASCII-tegn samt nogle specialtegn). Du kan bruge en regex, der matcher alle tegn indenfor dette interval. Her er et eksempel på en funktion, der validerer, at input-strengen kun indeholder tegn fra ISO-8859-1:

```php
function validate_iso8859_1($input) {
    // Regex, der matcher kun tegn i ISO-8859-1
    if (preg_match('/^[\x00-\xFF]*$/', $input)) {
        return true; // Input er valid
    } else {
        return false; // Input indeholder ugyldige tegn
    }
}
```

Denne funktion vil returnere `true`, hvis strengen kun indeholder tegn fra ISO-8859-1, og `false` hvis der er tegn, der ikke er tilladt i ISO-8859-1.

**Sådan virker det:**
- `[\x00-\xFF]`: Dette betyder "alle tegn fra 0x00 til 0xFF", som dækker hele ISO-8859-1 tegnsættet.
- `^` og `$`: Disse anker sikrer, at hele strengen kun indeholder tegn indenfor det tilladte interval (ingen andre tegn udenfor dette interval).

Du kan så bruge denne funktion til at validere input før du genererer PDF'en:

```php
$input = $_POST['input_field']; // Eksempel på at hente input fra et form

if (validate_iso8859_1($input)) {
    // Hvis input er valid, kan du fortsætte med at generere PDF'en
    $utf = utf8_iso($input);
    // Generer PDF med $utf
} else {
    echo "Input indeholder ugyldige tegn.";
}
```

Dette vil sikre, at kun tegn, der kan repræsenteres i ISO-8859-1, bliver accepteret. Hvis der er tegn udenfor dette interval, kan du f.eks. vise en fejlmeddelelse eller på anden måde håndtere fejlinput.
Avatar billede KombiPartner Juniormester
17. januar 2025 - 20:47 #3
Prøv at spørg ChatGPT. Det plejer jeg at bruge til hjælp :)
Avatar billede nemlig Professor
19. januar 2025 - 16:21 #4
#1 Tak for godt input - det vil jeg helt klart gå efter, men opgaven er måske lidt omfattende, da jeg har defineret en del funktioner med baggrund i FPDF. Måske de også vil virke med tFPDF. JEg har + 100 programfiler, der skal tjekkes.
Så i første omgang bliver det brandslukning, og så er #2 er hurtig løsning.

#2. Tak for et meget specifikt forslag, som jeg i første omgang vil benytte. På sigt vil løsningen med håndtering af UTF8 være langt at foretrække.

Men jeg har nu prøvet dit forslag således:
$input = $_POST['vilkaarLejekontrakt'];
if (preg_match('/^[\x00-\xFF]*$/', $input)) {
  // Input er valid
} else {
  $fejl = "Vilkår for lejekontrakt indeholder ikke tilladte karakterer";
}

Der er noget som ikke spiller korrekt, da jeg har testet med bullettegn, bred bindestreg og Eurotegn, og disse fanges IKKE som forkerte.
Avatar billede ejvindh Ekspert
20. januar 2025 - 10:43 #5
#4: Alt i orden. Jeg er ikke lige så stærk i preg_match. Men måske kan følgende bruges i stedet?

$input = $_POST['vilkaarLejekontrakt'];
$utf_input = iconv('UTF-8', 'ISO-8859-1', $input);
if (strcmp($input, $utf_input) == 0) {
  // Input er valid
} else {
  $fejl = "Vilkår for lejekontrakt indeholder ikke tilladte karakterer";
}
Avatar billede nemlig Professor
20. januar 2025 - 10:52 #6
#5 Det begynder at ligne noget da de særlige tegn nu "fanges". Men den er lige restriktiv nok, da de danske æøåÆØÅ også "fanges" som ej tilladte.
Avatar billede nemlig Professor
20. januar 2025 - 11:05 #7
#5 Det ser ud til at spille, med denne lille ekstra kode-linje:

$input = str_replace( array( 'æ' , 'ø', 'å', 'Æ' , 'Ø', 'Å' ), ' ', $input);

Så ser det sådan her ud:
$input = $_POST['vilkaarLejekontrakt'];
$input = str_replace( array( 'æ' , 'ø', 'å', 'Æ' , 'Ø', 'Å' ), ' ', $input);
$utf_input = iconv('UTF-8', 'ISO-8859-1', $input);
if (strcmp($input, $utf_input) == 0) {
  // Input er valid
} else {
  $fejl = "Vilkår for lejekontrakt indeholder ikke tilladte karakterer";
}
Avatar billede ejvindh Ekspert
20. januar 2025 - 14:52 #8
Ja, den burde løse det. Så skal du dog være opmærksom på, at hvis du går videre i koden med at bruge $input, så har du altså fjernet de danske tegn fra variablen :)
Avatar billede nemlig Professor
20. januar 2025 - 22:31 #9
Nemlig - jeg benytter kun $input til valideringen.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester