probleme mit eval

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Costi
User
Beiträge: 544
Registriert: Donnerstag 17. August 2006, 14:21

Samstag 30. Dezember 2006, 22:12

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:
Zuletzt geändert von Costi am Samstag 30. Dezember 2006, 22:19, insgesamt 1-mal geändert.
cp != mv
Joghurt
User
Beiträge: 877
Registriert: Dienstag 15. Februar 2005, 15:07

Samstag 30. Dezember 2006, 22:16

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")"
Costi
User
Beiträge: 544
Registriert: Donnerstag 17. August 2006, 14:21

Samstag 30. Dezember 2006, 22:22

es wird kein benutzer-input direkt geEVALt,
es werden nur funktions-namen der klasse 'VirFiles", die nicht mit "_" anfangen mit eval genomen
cp != mv
BlackJack

Samstag 30. Dezember 2006, 22:29

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?)
Antworten