• perl Regexp =?utf-8?B?ZsO8?= =?utf-8?Q?r?= printable Unicode Characters

    From Marc Haber@21:1/5 to All on Thu Oct 31 19:00:01 2024
    [Argh, tut mir leid, ich wollte den Thread nicht hijacken. Bitte hier antworten]

    Hallo,

    in adduser möchten wir so viele und verrückte Usernamen erlauben wie möglich. Ich arbeite im Moment daran, dass das in perl geschriebene
    adduser im Taint-Modus laufen kann.

    Dazu brauche ich einen Regulären Ausdruck für alle sinnvollen Zeichen,
    die in einem Unix-Pfad auftauchen können. Ich weiß, dass formal alles
    außer \0x0 auftauchen darf, aber Steuerzeichen, Unprintables und
    Invisibles möchte ich doch gerne ausschließen.

    Die Testsuite von adduser testen wir zum Beispiel die Erzeugung von
    /home/ÿar und /home/ʙɄȘ˳, und ich möchte gerne eine _positive_ Character Class verwenden. Ja, auch Emojis in Usernamen sollten funktionieren.

    Aktuell verwende ich

    qr/[-_\.+!\$%&()\]\[;0-9a-zA-Z\/{}>*'@]*/

    Aber das reicht offensichtlich nicht.

    Wie drücke ich das in perl aus? Wie eklig wird das?

    Grüße
    Marc

    -- ----------------------------------------------------------------------------- Marc Haber | "I don't trust Computers. They | Mailadresse im Header Leimen, Germany | lose things." Winona Ryder | Fon: *49 6224 1600402 Nordisch by Nature | How to make an American Quilt | Fax: *49 6224 1600421

    --- SoupGate-Win32 v1.05
    * Origin: fsxNet Usenet Gateway (21:1/5)
  • From [email protected]@21:1/5 to All on Thu Oct 31 22:50:01 2024
    Hallo Marc,

    31.10.2024 18:56:07 Marc Haber <[email protected]>:

    [..]
    Dazu brauche ich einen Regulären Ausdruck für alle sinnvollen Zeichen,
    die in einem Unix-Pfad auftauchen können. Ich weiß, dass formal alles außer \0x0 auftauchen darf, aber Steuerzeichen, Unprintables und
    Invisibles möchte ich doch gerne ausschließen.

    Die Testsuite von adduser testen wir zum Beispiel die Erzeugung von /home/ÿar und /home/ʙɄȘ˳, und ich möchte gerne eine _positive_ Character
    Class verwenden. Ja, auch Emojis in Usernamen sollten funktionieren.

    Aktuell verwende ich

    qr/[-_\.+!\$%&()\]\[;0-9a-zA-Z\/{}>*'@]*/

    Aber das reicht offensichtlich nicht.

    Wie drücke ich das in perl aus? Wie eklig wird das?

    Ein erster (defensiver) Stupser:
    ====
    use v5.14;
    # ...
    qr/[\w\d\.+!\$%&()\]\[;\/{}>*'@_-]+/aai;
    ====

    da fehlt ggfs. noch was ;) RTFM: 'perldoc perlre', Abschnitt "Modifiers",
    (bes. "Character set modifiers"), Abschnitt
    "Regular Expressions" (bes. "Escape sequences"
    und "Character Classes and other Special Escapes")
    sowie 'perldoc perlrecharclass'.

    HTH,
    -dnh

    --- SoupGate-Win32 v1.05
    * Origin: fsxNet Usenet Gateway (21:1/5)
  • From Marc Haber@21:1/5 to [email protected] on Sat Nov 2 19:10:01 2024
    On Thu, 31 Oct 2024 22:21:20 +0100 (GMT+01:00), [email protected] wrote:
    Ein erster (defensiver) Stupser:
    ====
    use v5.14;
    # ...
    qr/[\w\d\.+!\$%&()\]\[;\/{}>*'@_-]+/aai;
    ====

    Hurga. Das ist aber schwere Kost, daran muss ich erstmal kauen. Kann
    ein paar Tage dauern.

    da fehlt ggfs. noch was ;) RTFM: 'perldoc perlre', Abschnitt "Modifiers", >(bes. "Character set modifiers"), Abschnitt
    "Regular Expressions" (bes. "Escape sequences"
    und "Character Classes and other Special Escapes")

    Das ist mir zu theoretisch ;-) /aa ist restriktiver als /a, und das
    soll mir helfen?

    sowie 'perldoc perlrecharclass'.

    Interessant wären hier die Unicode Properties. Gibt es da vielleicht
    eine Property "printable" oder "word character"? Können wir davon
    ausgehen dass es jenseits der 256 keine "bösen" Zeichen mehr gibt, die
    man definitiv nicht in einem Usernamen haben möchte? Vermutlich nicht,
    weil es gibt doch z.B. Zeichen die die Schreibrichtung umschalten, und
    die verschieden langen Spaces will man glaube ich auch nicht?

    Um perlunicode, perlunitut und perluniintro zu lesen brauch ich auch
    eine Weile. Eine vorgekaut funktionierende Lösung würde ich auch
    nehmen.

    Grüße
    Marc
    --
    ---------------------------------------------------------------------------- Marc Haber | " Questions are the | Mailadresse im Header Rhein-Neckar, DE | Beginning of Wisdom " |
    Nordisch by Nature | Lt. Worf, TNG "Rightful Heir" | Fon: *49 6224 1600402

    --- SoupGate-Win32 v1.05
    * Origin: fsxNet Usenet Gateway (21:1/5)
  • From [email protected]@21:1/5 to All on Sun Nov 3 14:20:02 2024
    Hallo Marc,

    02.11.2024 19:05:44 Marc Haber <[email protected]>:

    On Thu, 31 Oct 2024 22:21:20 +0100 (GMT+01:00), [email protected] wrote:
    Ein erster (defensiver) Stupser:
    ====
    use v5.14;
    # ...
    qr/[\w\d\.+!\$%&()\]\[;\/{}>*'@_-]+/aai;
    ====

    Hurga. Das ist aber schwere Kost, daran muss ich erstmal kauen. Kann
    ein paar Tage dauern.

    Jo.

    da fehlt ggfs. noch was ;) RTFM: 'perldoc perlre', Abschnitt "Modifiers",
    (bes. "Character set modifiers"), Abschnitt
    "Regular Expressions" (bes. "Escape sequences"
    und "Character Classes and other Special Escapes")

    Das ist mir zu theoretisch ;-) /aa ist restriktiver als /a, und das
    soll mir helfen?

    So wie ich das lese schon...
    'perldoc perlunicode' hat auch ne Übersicht.

    sowie 'perldoc perlrecharclass'.

    Interessant wären hier die Unicode Properties. Gibt es da vielleicht
    eine Property "printable" oder "word character"?

    Jep.

    Können wir davon
    ausgehen dass es jenseits der 256 keine "bösen" Zeichen mehr gibt, die
    man definitiv nicht in einem Usernamen haben möchte? Vermutlich nicht,
    weil es gibt doch z.B. Zeichen die die Schreibrichtung umschalten, und
    die verschieden langen Spaces will man glaube ich auch nicht?

    Genau.

    Um perlunicode, perlunitut und perluniintro zu lesen brauch ich auch
    eine Weile. Eine vorgekaut funktionierende Lösung würde ich auch
    nehmen.

    Kann sein ich habs gefunden:

    "\p{Graph}"
           Matches any character that is graphic.
           Theoretically, this means a character that on a
           printer would cause ink to be used.

    Evtl. noch
    "\p{Word}"
           This is the same as "\w", including over 100_000
           characters beyond ASCII.

    oder
    \p{L}  # Letters
    \p{N}  # Numbers
    \p{S}  # Symbols
    \p{P}  # Punctuation

    Also:
    qr/^[\p{Graph}]+$/aa;
    qr/^[\p{L}\p{N}\p{S}\p{P}]+$/aa;

    ggfs. noch die Emojis \p{Emoticons}.
    Zumindest versteh ich die Doku so.

    Und dann gibts seit v5.18 Mengen Ops, siehe 'Extended Bracketed Character Classes' in perlrecharclass, z.B.

    qr/^(?[ \p{print} - ( \p{Space} + \p{Private_Use} ) ])+$/aa;

    Ich blick da aber auch nicht ganz durch.

    HTH,
    -dnh

    --- SoupGate-Win32 v1.05
    * Origin: fsxNet Usenet Gateway (21:1/5)
  • From Marc Haber@21:1/5 to [email protected] on Tue Nov 5 22:20:01 2024
    Hallo,

    On Sun, Nov 03, 2024 at 01:53:50PM +0100, [email protected] wrote:
    02.11.2024 19:05:44 Marc Haber <[email protected]>:

    On Thu, 31 Oct 2024 22:21:20 +0100 (GMT+01:00), [email protected] wrote:
    Ein erster (defensiver) Stupser:
    ====
    use v5.14;
    # ...
    qr/[\w\d\.+!\$%&()\]\[;\/{}>*'@_-]+/aai;
    ====

    Hurga. Das ist aber schwere Kost, daran muss ich erstmal kauen. Kann
    ein paar Tage dauern.

    Jo.

    Schaltet /aai nicht Unicode quasi ab, weil \w nur ascii matched?

    Kann sein ich habs gefunden:

    "\p{Graph}"
           Matches any character that is graphic.
           Theoretically, this means a character that on a
           printer would cause ink to be used.

    Evtl. noch
    "\p{Word}"
           This is the same as "\w", including over 100_000
           characters beyond ASCII.

    \p{Word} würde mir besser gefallen, das tut aber nicht so wie ich es
    denke. Beispielcode weiter unten.

    Also:
    qr/^[\p{Graph}]+$/aa;
    qr/^[\p{L}\p{N}\p{S}\p{P}]+$/aa;

    Ergibt das mit /aa einen Sinn? In meinem Beispiel sehe ich keinen
    Unterschied zwischen "bare", "/aa" und "/aai".

    Hier mal ein Beispielprogramm:

    [47/5070]mh@swivel:~/tmp $ cat keks
    #!/bin/perl -w

    use strict;

    use constant {
    remax => qr/[\p{Word}\d\.+!\$%&()\]\[;\/{}>*'\@\_-]/aai,
    regraph => qr/[\p{Graph}]/aa,
    regraphaai=> qr/[\p{Graph}]/aai,
    regraphbare=> qr/[\p{Graph}]/,
    reword => qr/^[\p{Word}]$/aa,
    rewordaai => qr/^[\p{Word}]$/aai,
    rewordbare => qr/^[\p{Word}]$/,
    };

    my $string="homeÿar";
    #my $string="/home/ar";

    sub sanitize_string {
    my ($input, $pattern) = @_;
    if ($input =~ qr/^($pattern+)$/) {
    return $1;
    } else {
    return "Input $input does not match $pattern";
    }
    }

    print( sanitize_string( $string, remax ), "\n" );
    print( sanitize_string( $string, regraph ), "\n" );
    print( sanitize_string( $string, regraphaai ), "\n" );
    print( sanitize_string( $string, regraphbare ), "\n" );
    print( sanitize_string( $string, reword ), "\n" );
    print( sanitize_string( $string, rewordaai ), "\n" );
    print( sanitize_string( $string, rewordbare ), "\n" );

    [48/5070]mh@swivel:~/tmp $ ./keks
    Input homeÿar does not match (?^aai:[\p{Word}\d\.+!\$%&()\]\[;/{}>*'\@\_-]) homeÿar
    homeÿar
    homeÿar
    Input homeÿar does not match (?^aa:^[\p{Word}]$)
    Input homeÿar does not match (?^aai:^[\p{Word}]$)
    Input homeÿar does not match (?^:^[\p{Word}]$)
    [49/5070]mh@swivel:~/tmp $

    ÿ ist "Latin small letter y with diaeresis", 0xFF, und sollte auf
    \p{Word} matchen? Da es auf \p{Graph} matched scheint UTF-8 Processing
    hier eingeschaltet zu sein.#

    Ideen? Oder sollte ich mir sowas lieber de.comp.lang.perl gehen?

    Grüße
    Marc


    -- ----------------------------------------------------------------------------- Marc Haber | "I don't trust Computers. They | Mailadresse im Header Leimen, Germany | lose things." Winona Ryder | Fon: *49 6224 1600402 Nordisch by Nature | How to make an American Quilt | Fax: *49 6224 1600421

    --- SoupGate-Win32 v1.05
    * Origin: fsxNet Usenet Gateway (21:1/5)