summaryrefslogtreecommitdiff
path: root/plugins/rand-quote
diff options
context:
space:
mode:
authorMarc Cornellà <hello@mcornella.com>2021-11-09 09:31:09 +0100
committerMarc Cornellà <hello@mcornella.com>2021-11-11 22:45:24 +0100
commit72928432f1ddaa244e02067dd7fc14948a4a5ce4 (patch)
tree6fa5d3e58a3b73bfa85791a0e2d736ee12671827 /plugins/rand-quote
parenta263cdac9c15de4003d3289a53cad1d19c8cfb3f (diff)
downloadzsh-72928432f1ddaa244e02067dd7fc14948a4a5ce4.tar.gz
zsh-72928432f1ddaa244e02067dd7fc14948a4a5ce4.tar.bz2
zsh-72928432f1ddaa244e02067dd7fc14948a4a5ce4.zip
fix(plugins): fix potential command injection in `rand-quote` and `hitokoto`
The `rand-quote` plugin uses quotationspage.com and prints part of its content to the shell without sanitization, which could trigger command injection. There is no evidence that this has been exploited, but this commit removes all possibility for exploit. Similarly, the `hitokoto` plugin uses the hitokoto.cn website to print quotes to the shell, also without sanitization. Furthermore, there is also no evidence that this has been exploited, but with this change it is now impossible.
Diffstat (limited to 'plugins/rand-quote')
-rw-r--r--plugins/rand-quote/rand-quote.plugin.zsh23
1 files changed, 16 insertions, 7 deletions
diff --git a/plugins/rand-quote/rand-quote.plugin.zsh b/plugins/rand-quote/rand-quote.plugin.zsh
index 371b997d3..23c21dc8f 100644
--- a/plugins/rand-quote/rand-quote.plugin.zsh
+++ b/plugins/rand-quote/rand-quote.plugin.zsh
@@ -1,14 +1,23 @@
if ! (( $+commands[curl] )); then
- echo "rand-quote plugin needs curl to work" >&2
- return
+ echo "rand-quote plugin needs curl to work" >&2
+ return
fi
function quote {
- emulate -L zsh
- Q=$(curl -s --connect-timeout 2 "http://www.quotationspage.com/random.php" | iconv -c -f ISO-8859-1 -t UTF-8 | grep -m 1 "dt ")
+ setopt localoptions nopromptsubst
- TXT=$(echo "$Q" | sed -e 's/<\/dt>.*//g' -e 's/.*html//g' -e 's/^[^a-zA-Z]*//' -e 's/<\/a..*$//g')
- WHO=$(echo "$Q" | sed -e 's/.*\/quotes\///g' -e 's/<.*//g' -e 's/.*">//g')
+ # Get random quote data
+ local data
+ data="$(command curl -s --connect-timeout 2 "http://www.quotationspage.com/random.php" \
+ | iconv -c -f ISO-8859-1 -t UTF-8 \
+ | command grep -a -m 1 'dt class="quote"')"
- [[ -n "$WHO" && -n "$TXT" ]] && print -P "%F{3}${WHO}%f: “%F{5}${TXT}%f”"
+ # Exit if could not fetch random quote
+ [[ -n "$data" ]] || return 0
+
+ local quote author
+ quote=$(sed -e 's|</dt>.*||g' -e 's|.*html||g' -e 's|^[^a-zA-Z]*||' -e 's|</a..*$||g' <<< "$data")
+ author=$(sed -e 's|.*/quotes/||g' -e 's|<.*||g' -e 's|.*">||g' <<< "$data")
+
+ print -P "%F{3}${author}%f: “%F{5}${quote}%f”"
}