2009-07-30 9 views
4

Je dois passer le contenu de la zone de texte dans une variable. c'est-à-dire que tout ce qui est tapé dans la texbox de la page html doit être passé à une variable. C'est parce que j'appelle HTML (CGI aussi) dans la programmation de shell Linux. J'ai besoin de manipuler cette variable comme je veux. Avez-vous une idée de le faire?Programmation CGI avec des scripts shell

Ce que je dois faire est, je veux obtenir l'adresse MAC comme une entrée de l'utilisateur. c'est-à-dire que nous devrions avoir une page HTML avec une zone de texte, cet utilisateur pourra entrer l'adresse MAC. par conséquent, tout utilisateur entrant dans la zone de texte doit être passé à une variable.

Une fois que nous aurons la variable, ce script ajoutera automatiquement cette adresse MAC dans le pare-feu Linux pour refuser l'accès.

Le code doit être similaire à ce qui suit:

!/bin/bash 

echo "Content-type: text/html" 

echo "" 

echo "" 

echo "enter the MAC address " 

iptables -A INPUT -m mac --mac-source $mac_address -j DROP 

service iptables save 

service iptables restart 

j'enregistrer ce fichier (test.cgi) sous/var/www/cgi-bin et je lancer ce script depuis Firefox.

Donc le problème maintenant j'ai la variable $mac_address. Le CGI ne transmet pas l'entrée textbox dans la variable $ mac_address.

+5

Je pense que vous devez être plus clair dans ce que vous voulez réaliser. Peut-être un exemple? –

Répondre

3

D'abord, lisez le CGI primer.

Vous aurez besoin d'une page HTML avec le code comme ceci:

<form method="get" action="/cgi-bin/my-fw-script.sh"> 
    <p>Gimme an IP address: <input name="addr"></p> 
    <input type="submit">Block IP</input> 
</form> 

Lorsque l'utilisateur clique sur le bouton Envoyer le formulaire, votre programme CGI Bash sera exécuté. (/path/to/cgi-bin/my-fw-script.sh dans l'exemple ci-dessus.) La saisie de texte se fera dans la variable d'environnement QUERY_STRING, sous la forme variable = valeur. Pour les entrées simples, vous pouvez simplement appeler la fonction Bash eval pour transformer cela en une variable Bash:

#!/bin/sh 
eval $QUERY_STRING 
echo You asked me to block $addr. 

Cela ne fonctionne que pour un seul champ d'entrée et se cassent s'il y a des espaces ou d'autres caractères spéciaux. J'imagine que la chose de bash_cgi que quelqu'un d'autre a recommandé s'occupera de ces détails pour vous. Faites comme l'exemple ci-dessus seulement si ce programme restera très simple. Par ailleurs, vous ne voulez certainement pas ajouter d'adresses MAC au pare-feu. Cela ne fonctionne que pour les hôtes qui se trouvent sur le même réseau local que la zone pare-feu. Les paquets provenant d'un autre réseau local, d'Internet, etc. auront l'adresse MAC de la passerelle du réseau local. Vous devriez probablement bloquer les hôtes par adresse IP à la place.

+0

merci pour votre courrier. mais le problème est que je dois prendre plus d'une entrée de l'utilisateur (comme deux appareils à la fois). comment puis-je adopter ce scirp? ces périphériques vont être dans un seul VLAN. donc pas de problème avec les fonctions de routage. –

+0

Voir http://hoohoo.ncsa.illinois.edu/cgi/security.html "Méfiez-vous de la déclaration eval" –

+0

En ce qui concerne les dangers de eval: oui, je sais. Je suppose que ce script va être bien protégé, car c'est une attaque DoS mûre tout seul. Il vaut certainement mieux ne pas être quelque chose que tout le monde peut accéder. Et oui, la défense en profondeur est aussi une bonne idée. En ce qui concerne le besoin d'entrées multiples: J'ai regardé la chose Bash.CGI recommandée par Montecristo, et cela répond à cela. Il utilise eval, cependant. –

4

La vraie réponse à cette question est . Votre serveur web semble fonctionner avec les privilèges root. C'est le premier non-non. Voulez-vous vraiment permettre au monde entier de bricoler avec votre configuration de pare-feu?

Vous n'avez aucun contrôle sur la façon dont votre script shell est appelé, ce qui lui est transmis. Vous ouvrez majeur trous de sécurité.

Voir les WWW Security FAQ on CGI scripts et Writing secure CGI scripts ainsi que CGI Security : Better Safe than Sorry.

+0

Même si vous avez peut-être raison, ce n'est pas une réponse à la question. Cela peut faire partie d'une réponse, mais ici, le sujet fait cgi avec un script shell. – shodanex

1

Découvrez bashlib - CGI programming with the bash shell

bashlib est un script shell qui rend la programmation CGI dans le shell bash plus facile, ou du moins plus tolérable. Il contient quelques fonctions que appelées automatiquement et placer des éléments de formulaire (à partir de POST et GET) et des cookies dans votre environnement. Il contient également la documentation complète sur la façon d'utiliser ces variables et comment configurer les cookies manuellement.

Il est super facile à utiliser et fait des chaînes url passant comme variables, etc un jeu d'enfant. Ne laissez pas les naysayers haïr sur bash comme un langage de script web. Il peut tenir le coup ... et c'est simple, omniprésent et efficace ... Cela va un peu à l'envers, mais si vous ne subissez pas facilement la pression des pairs, je dirais qu'il faut y aller.

#!/bin/bash 
# this sources bashlib into your current environment 
. /usr/local/lib/bashlib 
echo "Content-type: text/html" 
echo "" 
# OK, so we've sent the header... now send some content 
echo "<html><title>Crack This Server</title><body>" 

connexes et frais: xmlsh et shellinabox.

0

Désolé de garder rabâcher sur ce point, je pense juste il est trop amusant ...

Donc, pour le do-tout script CGI ultime, vérifier cela ...

avertissement ...pas pour les accros de sécurité ou toute personne qui ne sont pas parfaitement au courant de ce que le ci-dessous ... implique

#!/usr/bin/python 
# /var/www/cgi-bin/doanything.cgi r-xr-x--- wwwuser group 
# what does this do? LITERALLY ANYTHING. Usage: 
# http://server.local/cgi/doanything.cgi?DO="if you can think of how to bash it"; THEN="bash it"; echo $THEN 
# result: bash it 


import cgitb; cgitb.enable() 
import os, urllib, subprocess as sub 

# Retrieve the command from the query string and unencode the escaped %xx chars 
str_command = urllib.unquote(os.environ['QUERY_STRING']) 
p = sub.Popen(['/bin/bash', '-c', str_command], 
    stdout=sub.PIPE, stderr=sub.STDOUT) 
output = urllib.unquote(p.stdout.read()) 

print """\ 
Content-Type: text/html\n 
<html><body> 
<pre> 
<!-- UNCOMMENT THE FOLLOWING TO ECHO COMMAND --> 
<!-- $ %s --> 
%s 
</pre> 
</body></html> 
""" % (str_command, output) 
Questions connexes