1

Temat: CGI nie działa metoda POST, ale GET już tak

Cześć,

Mam prostą stronę, podaje login i hasło i wysyłam je do skryptu SH (w ciągach input type nie ma znaku "<" bo forum nie przyjmuje wiadomości).

<!DOCTYPE html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-2" />
<title>Polecenie</title>

<form action="/cgi-bin/ps.sh" method="get">

<div>
<fieldset>
<legend align="center">Formularz do wypełnienia </legend>

<p align="center">open</p>
<table align="center" bgcolor="silver">
<tr>
 <td>
    Podaj login:  input type="text" name="login">
 </td>
 </tr>
 <tr>
     <td>
      Podaj haslo: input type="password" name="password">
 </tr>
 <tr>
    <td colspan="2" align="center">
     input type="submit" value="Wyslij" />
     input type="reset" value="Resetuj" />
<td>
     </tr>
     <table>
</div></form>
</fieldset>
</head>

Ale metoda POST nie wysyła danych, natomast GET tak. 
Skąd wiem, co wysyłam? Bo skypt SH to:

#!/bin/sh
login=`echo "$QUERY_STRING" | sed -n 's/^.*login=\([^&]*\).*$/\1/p' | sed "s/[%20+]/ /g"`
pass=`echo "$QUERY_STRING" | sed -n 's/^.*password=\([^&]*\).*$/\1/p' | sed "s/%20/ /g"`
echo "Content-type: text/plain"
echo ""
echo "========"
echo "Serwer Software = $SERVER_SOFTWARE"
echo "Serwer name= $SERVER_NAME"
echo "Gateway Inteface= $GATEWAY_INTERFACE"
echo "Serwer prokolo = $SERVER_PROTOCOL"
echo "Serwer post = $SERVER_PORT"
echo "request method = $REQUEST_METHOD"
echo "path info = $PATH_INFO"
echo "path translated = $PATH_TRANSLATED"
echo "script name = $SCRIPT_NAME"
echo "query string = $QUERY_STRING"
echo "remonte host = $REMOTE_HOST"
echo "remonte addr = $REMOTE_ADDR"
echo "auth type = $AUTH_TYPE"
echo "remonte user = $REMOTE_USER"
echo "remonte ident = $REMOTE_IDENT"
echo "content type = $CONTENT_TYPE"
echo "content lenght = $CONTENT_LENGTH"
echo "http accept = $HTTP_ACCEPT"
echo "http user agent = $HTTP_USER_AGENT"
echo "======="

Wynik działania dla POST to:

========
Serwer Software = lighttpd/1.4.30
Serwer name= xxxxxxx.xxx
Gateway Inteface= CGI/1.1
Serwer prokolo = HTTP/1.1
Serwer post = 81
request method = POST
path info = 
path translated = 
script name = /cgi-bin/ps.sh
query string = 
remonte host = 
remonte addr = xx.xx.xx.xx
auth type = 
remonte user = 
remonte ident = 
content type = application/x-www-form-urlencoded
content lenght = 27
http accept = text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
http user agent = Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.71 Safari/537.36
=======

Czyli query string jest pusty.  Jak pisałem, dla GET działa.

Testowałem dla HTTP oraz HTTPS,  dla lighttpd oraz uhttpd, na róznych przeglądarach, ciągle to samo.  Jakieś sugestie?

Pozdrawiam, Krzysiek

2

Odp: CGI nie działa metoda POST, ale GET już tak

if [ "$REQUEST_METHOD" = "POST" ]; then
    read -t 3 QUERY_STRING
    eval $(echo "$QUERY_STRING"|awk -F'&' '{for(i=1;i<=NF;i++){print $i}}')
    tmp=$(uhttpd -d $passwd)

Fragment z mojego projektu "blokada", tam ą dane wysyłane postem. Najpierw sobie odczytaj zawartość do QUERY_STRING

Masz niepotrzebny router, uszkodzony czy nie - chętnie przygarnę go.

3

Odp: CGI nie działa metoda POST, ale GET już tak

Cezary, dziękuje działa (co prawda w SH będzie to wyglądać tak)

if [ "$REQUEST_METHOD" == "POST" ]; then
    read -t 3 QUERY_STRING
    eval $(echo "$QUERY_STRING"|awk -F'&' '{for(i=1;i<=NF;i++){print $i}}')
fi

Ale dlaczego trzeba tak kombinować?

4

Odp: CGI nie działa metoda POST, ale GET już tak

To nie kombinacja tylko normalnie zachowanie. Przy get masz parametry od razu podane bo są w url. Przy post lecą później i trzeba to sobie po prostu odczytać specjalnie.

Masz niepotrzebny router, uszkodzony czy nie - chętnie przygarnę go.

5

Odp: CGI nie działa metoda POST, ale GET już tak

Cezary, jednak coś nie tak, post podaje mi tylko pierwszy człon, drugiego z hasłem nie ma. Otrzymuje tylko (echo $QUERY STRING):

query string = login=root

6

Odp: CGI nie działa metoda POST, ale GET już tak

Pokaż całość co teraz zrobiłeś.

Masz niepotrzebny router, uszkodzony czy nie - chętnie przygarnę go.

7

Odp: CGI nie działa metoda POST, ale GET już tak

root@OpenWrt:/www/skrypt/cgi-bin# cat ps.sh
#!/bin/sh
if [ "$REQUEST_METHOD" == "POST" ]; then
        read -t 3 QUERY_STRING
        eval $(echo "$QUERY_STRING"|awk -F'&' '{for(i=1;i<=NF;i++){print $i}}')
fi
hjk=$QUERY_STRING
login=`echo "$QUERY_STRING" | sed -n 's/^.*login=\([^&]*\).*$/\1/p' | sed "s/[%20+]/ /g"`
pass=`echo "$QUERY_STRING" | sed -n 's/^.*passwd=\([^&]*\).*$/\1/p' | sed "s/%20/ /g"`
echo "Content-type: text/plain"
echo ""
echo "========"
echo "Serwer Software = $SERVER_SOFTWARE"
echo "Serwer name= $SERVER_NAME"
echo "Gateway Inteface= $GATEWAY_INTERFACE"
echo "Serwer prokolo = $SERVER_PROTOCOL"
echo "Serwer post = $SERVER_PORT"
echo "request method = $REQUEST_METHOD"
echo "path info = $PATH_INFO"
echo "path translated = $PATH_TRANSLATED"
echo "script name = $SCRIPT_NAME"
echo "query string = $QUERY_STRING"
echo "remonte host = $REMOTE_HOST"
echo "remonte addr = $REMOTE_ADDR"
echo "auth type = $AUTH_TYPE"
echo "remonte user = $REMOTE_USER"
echo "remonte ident = $REMOTE_IDENT"
echo "content type = $CONTENT_TYPE"
echo "content lenght = $CONTENT_LENGTH"
echo "http accept = $HTTP_ACCEPT"
echo "http user agent = $HTTP_USER_AGENT"
echo "======="
echo "Login:  $login"
echo "Passwd: $pass"
echo "oryginal query: $hjk"
if [ "$pass" != "XXXX" ] && [ "$login" == "YYY" ]; then

KOD WŁAŚCIWY - DZIAŁA

        else
                echo "Bledy login lub haslo"
fi
exit 0
root@OpenWrt:/www/skrypt# cat open.html
<!DOCTYPE html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Polecenie</title>
<form action="/cgi-bin/ps.sh" method="post" enctype="text/plain" onreset="if (!confirm('Czy na pewno chcesz wyczyscic caly formularz?')) return false">
<div>

<fieldset>
<legend align="center">Formularz do wypelnienia open</legend>

<table align="center" bgcolor="silver">
<tr>
 <td>
    Podaj login: input type="text" name="login">
 </td>
 </tr>
 <tr>
     <td>
      Podaj haslo: input type="password" name="passwd">
 </tr>
 <tr>
    <td colspan="2" align="center">
     input type="submit" value="Wyslij" />
     input type="reset" value="Resetuj" />
<td>
     </tr>
     <table>
</div></form>
</fieldset>

</head>

8

Odp: CGI nie działa metoda POST, ale GET już tak

Pomijając fakt że ten html jest paskudny (formularz w head?)  - to usunięcie enctype="text/plain" spowoduje że będzie działać dobrze. Jak upierasz się przy przy tym enctype="text/plain" to zrób read tyle razy ile zmiennych masz (w tym przypadku  dwa razy do dwóch różnych zmiennych).

Masz niepotrzebny router, uszkodzony czy nie - chętnie przygarnę go.

9

Odp: CGI nie działa metoda POST, ale GET już tak

co do stylu to racja, dzięki za uwagę (dopieoro przyswajam więdzę w temacie HTMLa).

Co do głównego pytania będę testował.

10

Odp: CGI nie działa metoda POST, ale GET już tak

Po modyfikacji pozornie działa, ale musi jakiś niewidoczny znak jeszcze wrzucać w ciąg loginu, bo nie działa jakbym chciał:

#!/bin/sh
if [ "$REQUEST_METHOD" == "POST" ]; then
        read -t 3 QUERY_STRING
        eval $(echo "$QUERY_STRING"|awk -F'&' '{for(i=1;i<=NF;i++){print $i}}')
fi
login=`echo "$QUERY_STRING" | sed -n 's/^.*login=\([^&]*\).*$/\1/p' | sed "s/[%20+]/ /g"`
#pass= `echo "$QUERY_STRING" | sed -n 's/^.*passwd=\([^&]*\).*$/\1/p' | sed "s/%20/ /g"`
aaa=$QUERY_STRING

if [ "$REQUEST_METHOD" == "POST" ]; then
        read -t 3 QUERY_STRING
        eval $(echo "$QUERY_STRING"|awk -F'&' '{for(i=1;i<=NF;i++){print $i}}')
fi
bbb=$QUERY_STRING

#login=`echo "$QUERY_STRING" | sed -n 's/^.*login=\([^&]*\).*$/\1/p' | sed "s/[%20+]/ /g"`
pass=`echo "$QUERY_STRING" | sed -n 's/^.*passwd=\([^&]*\).*$/\1/p' | sed "s/%20/ /g"`

echo "Content-type: text/plain"
echo ""

echo "Login:  $login"
echo "Passwd: $pass"
echo "oryginal query aaa :$aaa"
echo "oryginal query bbb :$bbb"

if [ "$login" == "root" ]; then
        echo "=================LOGIN OK==============="
fi

Wynik dla testowego hasła "12345" i login "root":

Login:  root
Passwd: 12345
oryginal query aaa :login=root
oryginal query bbb :passwd=12345

Warunek nie działa, czyli login musi mieć jakieś niewidoczne znaki dodane.

11

Odp: CGI nie działa metoda POST, ale GET już tak

Znak końca nowej linii?

Zauważ że ten eval sam już rozkłada parametry i robi z nich zmienne. Nie musisz ponownie wyciągać danych, więc albo wywal eval albo wywal te swoje sedy.

Masz niepotrzebny router, uszkodzony czy nie - chętnie przygarnę go.

12

Odp: CGI nie działa metoda POST, ale GET już tak

Cezary, Twoje evale robią

login=root
passwd=12345

a sedy

root
12345

i takie właśnie chce mieć zmienne.

Na pewno coś jest w SEDach, w domu będę myślał.

13

Odp: CGI nie działa metoda POST, ale GET już tak

eval robi z tego zmienną. Wiec po wykonaniu go masz zmienne $login i $passwd  z zawartością do których możesz się od razu odwołać.
Zrób sobie echo "$login" i echo "$passwd" po evalach i zobaczysz jak to wygląda.

Masz niepotrzebny router, uszkodzony czy nie - chętnie przygarnę go.

14

Odp: CGI nie działa metoda POST, ale GET już tak

Racja, tworzą się zmienne, ale ciągle mam problem ze loginem:

#!/bin/sh
if [ "$REQUEST_METHOD" == "POST" ]; then
        read -t 3 QUERY_STRING
        eval $(echo "$QUERY_STRING"|awk -F'&' '{for(i=1;i<=NF;i++){print $i}}')
fi
aaa=$QUERY_STRING

if [ "$REQUEST_METHOD" == "POST" ]; then
        read -t 3 QUERY_STRING
        eval $(echo "$QUERY_STRING"|awk -F'&' '{for(i=1;i<=NF;i++){print $i}}')
fi
bbb=$QUERY_STRING


echo "Content-type: text/plain"
echo ""

if [ "$login" == "root" ]; then
        echo "=================LOGIN OK==============="
fi

if [ "$passwd" == "12345" ]; then
        echo "=================HASLO OK==============="
fi

echo "========"
echo "Login:  $login"
echo "Passwd: $passwd"
echo "oryginal query aaa :$aaa"
echo "oryginal query bbb :$bbb"

wynik na root/12345

=================HASLO OK===============
========
Login:  root
Passwd: 12345
oryginal query aaa :login=root
oryginal query bbb :passwd=12345

15

Odp: CGI nie działa metoda POST, ale GET już tak

Wywal w końcu ten enctype="text/plain" i ładnie się to przeparsuje.

Masz niepotrzebny router, uszkodzony czy nie - chętnie przygarnę go.

16

Odp: CGI nie działa metoda POST, ale GET już tak

działa smile

dziękuje bardzo.

17

Odp: CGI nie działa metoda POST, ale GET już tak

Cezary podpowiesz jak z routera wysłać taką oto komendę:

http://192.168.0.170/relay.cgi?pulse1=pulse

to komenda pobudzająca przekaźnik jak w przeglądarkę wklepie działa

18

Odp: CGI nie działa metoda POST, ale GET już tak

Tak po prostu...

wget -O /dev/null http://192.168.0.170/relay.cgi?pulse1=pulse
Masz niepotrzebny router, uszkodzony czy nie - chętnie przygarnę go.

19

Odp: CGI nie działa metoda POST, ale GET już tak

A jeśli trzeba się zalogować pierwszy raz przed wydaniem tego polecenia czyli strona prosi o login i hasło to da się to zaszyć w powyższej komendzie?

20

Odp: CGI nie działa metoda POST, ale GET już tak

Jeżeli to zwykłe okienko (basic realm) to

wget -O /dev/null http://user:pass@192.168.0.170/relay.cgi?pulse1=pulse

Jeżeli to jakiś js to nie dasz rady.

Masz niepotrzebny router, uszkodzony czy nie - chętnie przygarnę go.

21

Odp: CGI nie działa metoda POST, ale GET już tak

W chrome wget -O /dev/null http://admin:12345678@192.168.0.170/relay.cgi?pulse1=pulse zadziałało oczywiście wcześniej sprawdziłem, że bez hasła nie wpuszcza a na openwrt nie chce działać

root@OpenWrt:~# wget -O /dev/null http://admin:12345678@192.168.0.170/relay.cgi?
pulse1=pulse
Downloading 'http://admin:12345678@192.168.0.170/relay.cgi?pulse1=pulse'
Connecting to 192.168.0.170:80
HTTP error 401
root@OpenWrt:~#

22

Odp: CGI nie działa metoda POST, ale GET już tak

Nie jesteś zautoryzowany. Albo dałeś zle dane albo to jest inaczej zrobione (np. przez formularz w html). Jak to jest zrobione? Pokaz screenshota z oknem logowania.

Masz niepotrzebny router, uszkodzony czy nie - chętnie przygarnę go.

23

Odp: CGI nie działa metoda POST, ale GET już tak

https://zapodaj.net/df294c139fecc.png.html

24

Odp: CGI nie działa metoda POST, ale GET już tak

Zwykłe. Powinno działać w takim formacie jak podałem.

Masz niepotrzebny router, uszkodzony czy nie - chętnie przygarnę go.

25 (edytowany przez tomciu 2021-03-22 20:07:46)

Odp: CGI nie działa metoda POST, ale GET już tak

@smereka
tego wgeta to masz pełną wersję z repo openwrt?
Próbowałeś go aktualizować?