Visualizzazione dei risultati da 1 a 3 su 3
  1. #1

    script CGI/C si esegue per metà

    Salve a tutti, essendo il mio primo post vorrei innanzitutto ringraziare la community di HTML.it, da sempre un punto di riferimento per me sia per le ottime guide, sia per le pronte, gentili ed utili risposte degli utenti. GRAZIE!

    Venendo al problema in oggetto:
    Premetto che non ne so nulla di webserver, mi sono avvicinato due giorni fa al campo per un progettino hobbystico per il quale ho necessità di controllare una porta parallela attraverso il browser.

    Parto da una configurazione default di Apache2 con cgi.load abilitato, lo script CGI l'ho realizzato in C (unico linguaggio di programmazione che conosco).
    Posiziono lo script in /usr/lib/cgi-bin (come di default).
    Siccome il programma utilizza la funzione ioperm(), procedo nel seguente modo:
    imposto come proprietario "root"
    codice:
    # chown root:root [programma].cgi
    imposto il permesso suid
    codice:
    # chmod u+s [programma].cgi
    Eseguendo da shell l'output è quello atteso, richiedendolo ad apache tramite browser, invece, il codice html che mi viene inviato si ferma a metà.

    per maggiore chiarezza vi posto il main:

    codice:
    int main()
     {
      char* query;
      unsigned int relstat[7];
      
      printf("Content-type: text/html\n\n");
      printf("<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n");
      printf("<html xmlns=\"http://www.w3.org/1999/xhtml\">\n");
      printf("<head>\n");
      printf("<meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\" />\n");
      printf("<title>Documento senza titolo</title>\n");
      printf("</head>\n\n");
      printf("<body>\n");
      
      if (ioperm(DATA,3,1)) {
       printf("
    
    Sorry, you were not able to gain access to the ports
    \n");
        printf("You must be root to run this program</p>\n");
        exit(0);
        }
       if ((query=getenv("QUERY_STRING"))!=NULL){
                                                 switch(*(query + FID_LEN))
                                                 {
                                                  case 'u' :
                                                  outb(accendi((query + FID_LEN * 2 + 4)), DATA);
                                                  break;
                                                  case 'd' :
                                                  outb(spegni((query + FID_LEN * 2 + 4)), DATA);
                                                  break;
                                                  default :
                                                  exit(1);
                                                  break;
                                                  }
       }
       
        printf("
    \n
    \n
    \n
    \n
    \n
    \n");
        printf("<table width=\"700\" border=\"1\" align=\"center\">\n");
        printf("<tr align=\"center\" valign=\"middle\">\n");
        printf("<td>RELAY 1</td>\n\
        <td>RELAY 2</td>\n\
        <td>RELAY 3</td>\n\
        <td>RELAY 4</td>\n\
        <td>RELAY 5</td>\n\
        <td>RELAY 6</td>\n\
        <td>RELAY 7</td>\n");
        printf("</tr>\n");
        
        printf("<tr align=\"center\" valign=\"middle\">\n");
        get_stat(relstat);
        int i;
        for(i=0; i<=6; i++){
                 if (relstat[i]==0) printf("<td height=\"100\" bgcolor=\"#FF0000\"><a href=\"/cgi-bin/LPTRELhttp.cgi?switch=u&nrelay=%d\">OFF</a></td>\n", (i+1));
                 else printf("<td height=\"100\" bgcolor=\"#00FF00\"><a href=\"/cgi-bin/LPTRELhttp.cgi?switch=d&nrelay=%d\">ON</a></td>\n", (i+1));
                 }
        printf("</table>\n</body>\n</html>");
        
        return(0);
    }
    precisamente facendo più prove ho concluso che procede senza intoppi fino al primo if (nel senso che se rimuovo il suid, ricevo anche la risposta prevista nel caso non riesca ad ottenere i permessi sulla porta).

    Controllando error.log non mi segnala nessun errore (anche se impostato ad "emerg").
    La domanda è, come si spiega questo comportamento ?

    Scusate la prolissità, l'abilità di sintesi proprio non mi appartiene

    p.s. lo script prevede che per la sola consultazione dello stato della porta, non gli venga passata nessuna veriabile, quindi dal browser vi accedo solo con
    codice:
    http://indirizzoip/cgi-bin/[programma].cgi
    e dunque il secondo if dovrebbe essere non soddisfatto e quindi ignorato.

    p.p.s. dimenticavo: il tutto su Ubuntu desktop.

  2. #2
    OK mi rispondo da solo: inserendo il primo post scriptum, mi è venuto il dubbio che QUERY_STRING non fosse comunque vuoto, come invece pensavo.

    Quindi ho rimosso "exit(1)" dal caso "default" nello switch presente nel secondo if, e così, almeno a prima vista, lo script mi ritorna tutta la pagina html.

    Dunque ora la domanda muta: cosa è presente nella variabile QUERY_STRING, se lo script viene richiamato solo con
    codice:
    http://indirizzoip/cgi-bin/[programma].cgi
    ?

  3. #3
    Ho controllato tramite qualche printf() in più nello script ed effettivamente QUERY_STRING contiene solo l'eventuale stringa successiva al "?", come avevo letto in più di un documento.

    L'errore penso che fosse nel valore passato allo switch attraverso il puntatore query.
    Comunque ho risolto utilizzando l'operatore di accesso ad array (il che rende anche la cosa più comprensibile):

    codice:
    int main()
     {
      char* query;
      unsigned int relstat[7];
      
      printf("Content-type: text/html\n\n");
      printf("<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n");
      printf("<html xmlns=\"http://www.w3.org/1999/xhtml\">\n");
      printf("<head>\n");
      printf("<meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\" />\n");
      printf("<title>Documento senza titolo</title>\n");
      printf("</head>\n\n");
      printf("<body>\n");
      
      if (ioperm(DATA,3,1)) {
       printf("
    
    Sorry, you were not able to gain access to the ports
    \n");
        printf("You must be root to run this program</p>\n</body>\n</html>");
        exit(0);
        }
       if ((query=getenv("QUERY_STRING"))!=NULL){
                                                 switch(query[7])
                                                 {
                                                  case 'u' :
                                                  outb(accendi(&query[16]), DATA);
                                                  break;
                                                  case 'd' :
                                                  outb(spegni(&query[16]), DATA);
                                                  break;
                                                  default :
                                                  break;
                                                  }
       }
       
        printf("
    \n
    \n
    \n
    \n
    \n
    \n");
        printf("<table width=\"700\" border=\"1\" align=\"center\">\n");
        printf("<tr align=\"center\" valign=\"middle\">\n");
        printf("<td>RELAY 1</td>\n\
        <td>RELAY 2</td>\n\
        <td>RELAY 3</td>\n\
        <td>RELAY 4</td>\n\
        <td>RELAY 5</td>\n\
        <td>RELAY 6</td>\n\
        <td>RELAY 7</td>\n");
        printf("</tr>\n");
        
        printf("<tr align=\"center\" valign=\"middle\">\n");
        get_stat(relstat);
        int i;
        for(i=0; i<=6; i++){
                 if (relstat[i]==0) printf("<td height=\"100\" bgcolor=\"#FF0000\"><a href=\"/cgi-bin/[programma].cgi?switch=u&nrelay=%d\">OFF</a></td>\n", (i+1));
                 else printf("<td height=\"100\" bgcolor=\"#00FF00\"><a href=\"/cgi-bin/[programma].cgi?switch=d&nrelay=%d\">ON</a></td>\n", (i+1));
                 }
        printf("</table>\n</body>\n</html>");
        
        return(0);
    }
    Così funziona tutto.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.