【发布时间】:2017-03-19 06:06:08
【问题描述】:
我尝试使用 shell 脚本发出松弛通知。
JSON 参数由 MySql 查询获得的变量组成。
#!/bin/sh
#MySQL RO Access
host='mysqlserver.com'
userdb='slackro'
password='password'
db='db'
#Slack information
hook='https://hook.slack'
user='slackusr'
channel='o_channel'
emoji='slackusr'
#Query
id=`mysql -D $db -u $userdb -p$password -e 'SELECT id FROM ticket WHERE tn ='$1'' -h $host | sed -e '1d'`
tn=`mysql -D $db -u $userdb -p$password -e 'SELECT tn FROM ticket WHERE tn ='$1'' -h $host | sed -e '1d'`
title=`mysql -D $db -u $userdb -p$password -e 'SELECT title FROM ticket WHERE tn ='$1'' -h $host | sed -e '1d' | sed "s/'/ /g" | sed "s/°//g" | sed "s/ /_/g" `
customer=`mysql -D $db -u $userdb -p$password -e 'SELECT customer_id FROM ticket WHERE tn ='$1'' -h $host | sed -e '1d'`
msj=`mysql -D $db -u $userdb -p$password -e 'SELECT a_body FROM article WHERE ticket_id ='$id' ORDER BY id DESC LIMIT 1' -h $host | sed -e '1d'`
url='http://iiabox.infra.ultra.sur.top/otrs/index.pl?Action=AgentTicketZoom;TicketID'$1
#Message
curl -X POST -H 'Content-type: application/json' --data '{"username": "slackusr","icon_emoji": ":slackusr:","attachments": [{"fallback": "New Ticket","pretext": "New ticket from '$customer'","title": "'$title'","title_link": "'$url'","text": "'$msj'","color": "#006495"}]}' $hook
当我执行这个脚本时,我会得到类似的东西
curl -X POST -H 'Content-type: application/json' --data '{"username": "OTRS","icon_emoji": ":slackusr:","attachments": [{"fallback" : "新票","pretext": "来自 my@email.com 的新票","title": "Prueba' de Notificación '6","title_link": "http://site/otrs/index.pl?Action=AgentTicketZoom;TicketID2016110472000067" “文本”:“塞拉多”,“颜色”:“#006495”}]}'https://hooks.slack.com/ curl:(6)无法解析主机:de curl:(6)无法解析主机:xn--notificacin-zeb curl:(3)[globbing]第152列中不匹配的右大括号/括号
我不明白为什么变量 $title 的结果显示 "Prueba' de Notificación '6"
如果我用 echo 打印 $title 变量,我会得到:"Prueba de Notificación 6" 在第一个空格之前和最后一个空格之后没有简单的引号。
我能做什么?
【问题讨论】:
-
此代码中存在严重的、影响安全的错误。如果有人给出
1' OR '1' == '1的票号或'; DROP TABLE ticket; --的票号,你认为会发生什么? -
为了安全地形成 JSON,而不是字符串连接(这使您负责正确引用),请使用理解语法的工具,例如
jq。 -
...对于 shell 端的其他错误,请参阅 shellcheck.net