LINUX.ORG.RU

История изменений

Исправление vodz, (текущая версия) :

прав у скрипта не будет что бы наломать дров, как собственно и доступа у посторонних к файлам. Панелька нужна для пары хипстеров, что бы меня меньше дёргали. Я полностью согласен, что построчный вариант безопаснее,

Просто надо понимать, что обезопасивать надо не хипстеров друг от друга, а дать им безопасный вариант, чтобы они могли у себя в <body> написать $(rm -rf .)</body> Ведь ни один из приведенных символов в этом скрипте не требует экранирования в html-коде и потому непонятно, почему хипстер не может написать статью по поводу «rm -rf» или прогнать вот эту страницу лор-а через ваш парсер.

user_request=«${QUERY_STRING#$1=}»

Это совершенно дурацкая привычка при присваивании переменной из одной единственной переменной заключать её в кавычки, но не использовать кавычки где надо. На самом деле правильнее привычка:

user_request=${QUERY_STRING#"$1"=}
В вашем случае это может и не так, вдруг вы захотите указать как «button*», но в общем виде чаще всего надо именно так.

А вообще, с вашим скриптом даже лень разбираться, ибо не работает на простом примере:

QUERY_STRING="button1=123+error&button2=is%20ok"

Так что я бы сделал как-то так:

#!/bin/bash

QUERY_STRING="button1=123+%?error&button2=is%20%%ok"

declare -A param
while IFS='=' read -r -d '&' key value && [[ -n "$key" ]]; do
    value=${value//+/ }
    v=
    while true; do
        b=${value%%%*} # before %XX
        v+=$b
        [[ "$b" = "$value" ]] && break
        value=${value#"$b%"}
        if [[ "${value}" = [0-9a-fA-F][0-9a-fA-F]* ]]; then
                b=2
                printf -v h "\\x${value:0:2}"
        else
                if [[ "${value}" = [0-9a-fA-F]* ]]; then
                        b=1
                        printf -v h "\\x${value:0:1}"
                elif [[ "${value}" = %* ]]; then
                        b=1
                        h="%"
                else            # %strange
                        continue
                fi
        fi
        v+=$h
        value=${value:b}
    done
    param["$key"]=$v
done <<<"${QUERY_STRING}&"

echo "${param[button1]}"
echo "${param[button2]}"

Исходная версия vodz, :

прав у скрипта не будет что бы наломать дров, как собственно и доступа у посторонних к файлам. Панелька нужна для пары хипстеров, что бы меня меньше дёргали. Я полностью согласен, что построчный вариант безопаснее,

Просто надо понимать, что обезопасивать надо не хипстеров друг от друга, а дать им безопасный вариант, чтобы они могли у себя в <body> написать $(rm -rf .)</body> Ведь ни один из приведенных символов в этом скрипте не требует экранирования в html-коде и потому непонятно, почему хипстер не может написать статью по поводу «rm -rf» или прогнать вот эту страницу лор-а через ваш парсер.

user_request=«${QUERY_STRING#$1=}»

Это совершенно дурацкая привычка при присваивании переменной из одной единственной переменной заключать её в кавычки, но не использовать кавычки где надо. На самом деле правильнее привычка:

user_request=${QUERY_STRING#"$1"=}
В вашем случае это может и не так, вдруг вы захотите указать как «button*», но в общем виде чаще всего надо именно так.

А вообще, с вашим скриптом даже лень разбираться, ибо не работает на простом примере:

QUERY_STRING="button1=123+error&button2=is%20ok"

Так что я бы сделал как-то так:

#!/bin/bash

QUERY_STRING="button1=123+%?error&button2=is%20%%ok"

declare -A param
while IFS='=' read -r -d '&' key value && [[ -n "$key" ]]; do
    value=${value//+/ }
    v=
    while true; do
        b=${value%%%*} # before %XX
        v+=$b
        [[ "$b" = "$value" ]] && break
        value=${value#"$b%"}
        if [[ "${value}" = [0-9a-fA-F][0-9a-fA-F]* ]]; then
                b=2
                printf -v h "\\x${value:0:2}"
        else
                if [[ "${value}" = [0-9a-fA-F]* ]]; then
                        b=1
                        printf -v h "\\x${value:0:1}"
                elif [[ "${value}" = %* ]]; then
                        b=1
                        h="%"
                else            # %strange
                        b=0
                        h=
                fi
        fi
        v+=$h
        value=${value:b}
    done
    param["$key"]=$v
done <<<"${QUERY_STRING}&"

echo "${param[button1]}"
echo "${param[button2]}"