История изменений
Исправление vodz, (текущая версия) :
прав у скрипта не будет что бы наломать дров, как собственно и доступа у посторонних к файлам. Панелька нужна для пары хипстеров, что бы меня меньше дёргали. Я полностью согласен, что построчный вариант безопаснее,
Просто надо понимать, что обезопасивать надо не хипстеров друг от друга, а дать им безопасный вариант, чтобы они могли у себя в <body> написать $(rm -rf .)</body> Ведь ни один из приведенных символов в этом скрипте не требует экранирования в html-коде и потому непонятно, почему хипстер не может написать статью по поводу «rm -rf» или прогнать вот эту страницу лор-а через ваш парсер.
user_request=«${QUERY_STRING#$1=}»
Это совершенно дурацкая привычка при присваивании переменной из одной единственной переменной заключать её в кавычки, но не использовать кавычки где надо. На самом деле правильнее привычка:
user_request=${QUERY_STRING#"$1"=}
А вообще, с вашим скриптом даже лень разбираться, ибо не работает на простом примере:
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"=}
А вообще, с вашим скриптом даже лень разбираться, ибо не работает на простом примере:
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]}"