Seite 1 von 1

probleme mit eval

Verfasst: Samstag 30. Dezember 2006, 22:12
von Costi
ich bin grad dabei mein im letzten thread geposteten script uebersichtlicher zu schreieben. meien idee ist die, das jeden eingelogten benutzer die webpage ueber eien klasse kriegen (was ist sauberer als eien klasse?). jeder eingelogte benutyer hat auch seiene individuelle klasse (VirtualFiles), so dass ich mich nicht darum kuemern muss wie daten, die nur fuer die aktuele season sind gespeichert werden

hab jetzt aber ein kleiens problem mit eval, koennt ihr mir sagen wie zeiele 66 richtig lauten muesste?

danke

edit:
die beschreibung ist mir nicht ganz gelungen, kugt euch am besten nur den code an ( :

Code: Alles auswählen



import socket
import cgi

def notFound(param):
	return "file not found/you not requeted any file"

def login(param):
	print "login wird durchlaufen"
	return "you loged in", True

def parseReq(req):
	method, req, proto = resp.split(" ", 2)#vileicht auch 2
	#try:
	if method == "GET":
			try:
				query = req.split("?")[1]
			except:
				query = ""
	elif method == "POST":
		query = resp.split("\r\n\r\n")[1]
	#except.. . .er.b
	param = cgi.parse_qs(query)
	param2 = {}
	for key, val in param.iteritems():
		param2.update({key: "".join(val)})
	param = param2
	return param


class VirtualFiles:
	def __init__(self):
		self.cmdData = []
	
	def edit(self):
		print "edit wird urchlaufen!!"
		return "edit"
		

seasons = {}
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind(("", 80))
s.listen(10)


defs = []
for i in dir(VirtualFiles):
	if not i.startswith("_"): #sich an der convention halten
		defs.append(i)
print "defs ist", defs
while 1:
	socket, ip = s.accept()
	ip = ip[0]
	print "connected by", ip
	resp = socket.recv(512)
	param = parseReq(resp)
	print "param", param
	if not ip in seasons:
		html, bool = login(param)
		if bool:
			seasons.update({ip: VirtualFiles()})
	else:
		if "action" in param and param["action"] in defs:
			eval("html = seasons[ip]." + param["action"] + "()")
		else:
			html = notFound(param)
	socket.send(html)
	socket.close()

:lol:

Verfasst: Samstag 30. Dezember 2006, 22:16
von Joghurt
Sie muss ganz weg! Eval in einer Webanwendung ist ganz, ganz schlecht.

Was z.B. wenn ich als Skript-Kiddie folgendes oder ähnliches als Parameter übergebe?
";import os; os.remove("/etc/passwd")"

Verfasst: Samstag 30. Dezember 2006, 22:22
von Costi
es wird kein benutzer-input direkt geEVALt,
es werden nur funktions-namen der klasse 'VirFiles", die nicht mit "_" anfangen mit eval genomen

Verfasst: Samstag 30. Dezember 2006, 22:29
von BlackJack
Trotzdem sollte man von `eval()` Abstand nehmen. Vor allem wenn es nicht notwendig ist:

Code: Alles auswählen

    html = getattr(seasons[ip], param['action'])()
(Kann es sein das `seasons` eigentlich `sessions` heissen soll?)