Bash
CGI लिपियों
खोज…
अनुरोध विधि: प्राप्त करें
GET
माध्यम से CGI-Script को कॉल करना काफी आसान है।
पहले आपको स्क्रिप्ट के encoded url
की आवश्यकता होगी।
फिर आप एक प्रश्न चिह्न जोड़ते हैं ?
चर के बाद।
- हर चर में दो खंड होने चाहिए = ।
पहला खंड हमेशा प्रत्येक चर के लिए एक विशिष्ट नाम होना चाहिए,
जबकि दूसरे भाग में केवल इसके मूल्य हैं - चर को अलग किया जाता है &
- स्ट्रिंग की कुल लंबाई 255 वर्णों से ऊपर नहीं उठनी चाहिए
- नाम और मान html-एन्कोडेड होने चाहिए (प्रतिस्थापित करें: </, / ?: @ & = + $ )
संकेत:
Html- रूपों का उपयोग करते समय अनुरोध विधि इसे स्वयं द्वारा उत्पन्न की जा सकती है।
अजाक्स के साथ आप सभी को एनकोडर्इ और एनकोडाउरीकोम्पोनेंट के माध्यम से एन्कोड कर सकते हैं
उदाहरण:
http://www.example.com/cgi-bin/script.sh?var1=Hello%20World!&var2=This%20is%20a%20Test.&
अनुरोध को अधिक सुरक्षित बनाने के लिए सर्वर को केवल क्रॉस-ऑरिजिनल रिसोर्स शेयरिंग (कोर) के माध्यम से संवाद करना चाहिए। इस शोकेस में हम Data-Type
जिसे हम उपयोग करना चाहते हैं, यह निर्धारित करने के लिए कॉर्स का उपयोग करते हैं।
कई Data-Types
हम चुन सकते हैं, जिनमें से सबसे आम हैं ...
- पाठ / html
- पाठ / सादे
- आवेदन / json
अनुरोध भेजते समय, सर्वर कई पर्यावरण चर भी बनाएगा। अभी के लिए सबसे महत्वपूर्ण पर्यावरण चर $REQUEST_METHOD
और $QUERY_STRING
।
रिक्वेस्ट मेथड GET
होना है और कुछ नहीं!
क्वेरी स्ट्रिंग में सभी html-endoded data
।
लिपी
#!/bin/bash
# CORS is the way to communicate, so lets response to the server first
echo "Content-type: text/html" # set the data-type we want to use
echo "" # we dont need more rules, the empty line initiate this.
# CORS are set in stone and any communication from now on will be like reading a html-document.
# Therefor we need to create any stdout in html format!
# create html scructure and send it to stdout
echo "<!DOCTYPE html>"
echo "<html><head>"
# The content will be created depending on the Request Method
if [ "$REQUEST_METHOD" = "GET" ]; then
# Note that the environment variables $REQUEST_METHOD and $QUERY_STRING can be processed by the shell directly.
# One must filter the input to avoid cross site scripting.
Var1=$(echo "$QUERY_STRING" | sed -n 's/^.*var1=\([^&]*\).*$/\1/p') # read value of "var1"
Var1_Dec=$(echo -e $(echo "$Var1" | sed 's/+/ /g;s/%\(..\)/\\x\1/g;')) # html decode
Var2=$(echo "$QUERY_STRING" | sed -n 's/^.*var2=\([^&]*\).*$/\1/p')
Var2_Dec=$(echo -e $(echo "$Var2" | sed 's/+/ /g;s/%\(..\)/\\x\1/g;'))
# create content for stdout
echo "<title>Bash-CGI Example 1</title>"
echo "</head><body>"
echo "<h1>Bash-CGI Example 1</h1>"
echo "<p>QUERY_STRING: ${QUERY_STRING}<br>var1=${Var1_Dec}<br>var2=${Var2_Dec}</p>" # print the values to stdout
else
echo "<title>456 Wrong Request Method</title>"
echo "</head><body>"
echo "<h1>456</h1>"
echo "<p>Requesting data went wrong.<br>The Request method has to be \"GET\" only!</p>"
fi
echo "<hr>"
echo "$SERVER_SIGNATURE" # an other environment variable
echo "</body></html>" # close html
exit 0
Html-डॉक्यूमेंट इस तरह दिखेगा ...
<html><head>
<title>Bash-CGI Example 1</title>
</head><body>
<h1>Bash-CGI Example 1</h1>
<p>QUERY_STRING: var1=Hello%20World!&var2=This%20is%20a%20Test.&<br>var1=Hello World!<br>var2=This is a Test.</p>
<hr>
<address>Apache/2.4.10 (Debian) Server at example.com Port 80</address>
</body></html>
चर का उत्पादन इस तरह दिखेगा ...
var1=Hello%20World!&var2=This%20is%20a%20Test.&
Hello World!
This is a Test.
Apache/2.4.10 (Debian) Server at example.com Port 80
नकारात्मक पक्ष प्रभाव ...
- सभी एन्कोडिंग और डिकोडिंग न तो अच्छे लगते हैं, लेकिन जरूरत है
- अनुरोध सार्वजनिक पठनीय होगा और एक ट्रे को पीछे छोड़ देगा
- अनुरोध का आकार सीमित है
- क्रॉस-साइड-स्क्रिप्टिंग (XSS) से सुरक्षा की आवश्यकता
अनुरोध विधि: POST / w JSON
SSL
साथ संयोजन में अनुरोध विधि POST
का उपयोग करने से डेटाट्रांसफर अधिक सुरक्षित हो जाता है।
के अतिरिक्त...
- अधिकांश एन्कोडिंग और डिकोडिंग की आवश्यकता नहीं है
- URL किसी एक को दिखाई देगा और उसे url इनकोडेड करना होगा।
डेटा अलग से भेजा जाएगा और एसएसएल के माध्यम से सुरक्षित किया जाना चाहिए - डेटा का आकार लगभग असम्बद्ध है
- अभी भी क्रॉस-साइड-स्क्रिप्टिंग (XSS) से सुरक्षा की आवश्यकता है
इस प्रदर्शन को सरल रखने के लिए हम JSON डेटा प्राप्त करना चाहते हैं
और संचार क्रॉस-ऑरिजनल रिसोर्स शेयरिंग (कोर) से अधिक होना चाहिए।
निम्नलिखित स्क्रिप्ट दो अलग - अलग सामग्री-प्रकार भी प्रदर्शित करेगी।
#!/bin/bash
exec 2>/dev/null # We dont want any error messages be printed to stdout
trap "response_with_html && exit 0" ERR # response with an html message when an error occurred and close the script
function response_with_html(){
echo "Content-type: text/html"
echo ""
echo "<!DOCTYPE html>"
echo "<html><head>"
echo "<title>456</title>"
echo "</head><body>"
echo "<h1>456</h1>"
echo "<p>Attempt to communicate with the server went wrong.</p>"
echo "<hr>"
echo "$SERVER_SIGNATURE"
echo "</body></html>"
}
function response_with_json(){
echo "Content-type: application/json"
echo ""
echo "{\"message\": \"Hello World!\"}"
}
if [ "$REQUEST_METHOD" = "POST" ]; then
# The environment variabe $CONTENT_TYPE describes the data-type received
case "$CONTENT_TYPE" in
application/json)
# The environment variabe $CONTENT_LENGTH describes the size of the data
read -n "$CONTENT_LENGTH" QUERY_STRING_POST # read datastream
# The following lines will prevent XSS and check for valide JSON-Data.
# But these Symbols need to be encoded somehow before sending to this script
QUERY_STRING_POST=$(echo "$QUERY_STRING_POST" | sed "s/'//g" | sed 's/\$//g;s/`//g;s/\*//g;s/\\//g' ) # removes some symbols (like \ * ` $ ') to prevent XSS with Bash and SQL.
QUERY_STRING_POST=$(echo "$QUERY_STRING_POST" | sed -e :a -e 's/<[^>]*>//g;/</N;//ba') # removes most html declarations to prevent XSS within documents
JSON=$(echo "$QUERY_STRING_POST" | jq .) # json encode - This is a pretty save way to check for valide json code
;;
*)
response_with_html
exit 0
;;
esac
else
response_with_html
exit 0
fi
# Some Commands ...
response_with_json
exit 0
आपको इस स्क्रिप्ट पर POST
माध्यम से JSON-Data भेजते समय एक उत्तर के रूप में {"message":"Hello World!"}
मिलेगा। हर चीज को html डॉक्यूमेंट प्राप्त होगा।
महत्वपूर्ण भी $JSON
के varialbe है। यह चर XSS से मुक्त है, लेकिन फिर भी इसमें गलत मान हो सकते हैं और इसे पहले सत्यापित करने की आवश्यकता है। कृपया यह ध्यान में रखें।
यह कोड JSON के बिना समान काम करता है।
आप इस तरह से कोई भी डेटा प्राप्त कर सकते हैं।
आपको अपनी आवश्यकताओं के लिए बस Content-Type
को बदलना होगा।
उदाहरण:
if [ "$REQUEST_METHOD" = "POST" ]; then
case "$CONTENT_TYPE" in
application/x-www-form-urlencoded)
read -n "$CONTENT_LENGTH" QUERY_STRING_POST
text/plain)
read -n "$CONTENT_LENGTH" QUERY_STRING_POST
;;
esac
fi
अंतिम लेकिन कम से कम, सभी अनुरोधों का जवाब देने के लिए मत भूलना, अन्यथा तीसरे पक्ष के प्रोग्राम को पता नहीं चलेगा कि क्या वे सफल हुए