Seite 1 von 1

AJAX Chat

Verfasst: Mittwoch 30. Januar 2008, 23:59
von nemomuk
Hallo,

ich versuche gerade einen AJAX Chat zu basteln. Serverseitig Python.
Nun funktioniert mein Script wunderbar, in allen Brwosern außer im IE (6 und 7).

Code: Alles auswählen

var anzahl = 0;
var ajax_counter = 0;
var http_request = new Array;
var inhalt = new Array;
var aktiv = window.setInterval("interval()",5000);
function interval() {
	ajax_counter++;
	var send = inhalt.join("");
	inhalt = new Array;
	Ajax(ajax_counter,send,anzahl);
	anzahl = 0;
}
function absenden() {
	anzahl++;
	text = "&text" + anzahl + "=" + document.getElementById("text").value;
	von = "&von" + anzahl + "=" + document.getElementById("meinname").value;
	an = "&an" + anzahl + "=" + document.getElementById("an").value;
	inhalt.push(text,von,an);
	document.getElementById('ausgabe').innerHTML = document.getElementById('ausgabe').innerHTML + "Ich: " + document.getElementById("text").value + "<br />";
	scrollen();
}
function scrollen() {
	document.getElementById("chattext").scrollTop = document.getElementById("ausgabe").offsetHeight - 200;
}
function Ajax(counter,send,inhalt_anzahl) {
	http_request[counter] = false;
	if (window.XMLHttpRequest) {
		http_request[counter] = new XMLHttpRequest();
		if (http_request[counter].overrideMimeType) {
			http_request[counter].overrideMimeType('text/xml');
		}
	} 
	else if (window.ActiveXObject) {
		try {
			http_request[counter] = new ActiveXObject("Msxml2.XMLHTTP");
		} 
		catch (e) {
			try {
				http_request[counter] = new ActiveXObject("Microsoft.XMLHTTP");
			} 
			catch (e) {}
		}
	}
	if (!http_request[counter]) {
		return false;
	}
	http_request[counter].open('GET', 'chat.py?anzahl=' + String(inhalt_anzahl) + "&name=" + document.getElementById("meinname").value + send, true);
			http_request[counter].onreadystatechange = function(){
		if (http_request[counter].readyState == 4) {
			if (http_request[counter].status == 200) {
				document.getElementById('ausgabe').innerHTML = document.getElementById('ausgabe').innerHTML + http_request[counter].responseText;
				scrollen();
			}
		}
	};
	http_request[counter].send(null);
}

Code: Alles auswählen

print "Content-Type: text/html\n"

import cgi
form = cgi.FieldStorage()
import time
import MySQLdb

#Eingaben in Datenbank speichern
anzahl = form.getfirst("anzahl",0)
for x in range(1,int(anzahl) + 1):
	text1 = form.getfirst("text%s" %x,"")
	von1 = form.getfirst("von%s" %x,"")
	an1 = form.getfirst("an%s" %x,"")
	anfrage_speichern = connection.cursor()
	if text1 != "":
		anfrage_speichern.execute("INSERT INTO chat(text,von,an,wann,gelesen) VALUES('%s','%s','%s','%s','0')" %(text1,von1,an1,time.strftime("%d.%m.%Y %H:%M", time.localtime())))

#Datenausgabe		
meinname = form.getfirst("name","")
anfrage_ausgabe = connection.cursor()
anfrage_ausgabe.execute("SELECT von,wann,text,id FROM chat WHERE gelesen='0' AND an='%s'" %meinname)
result_ausgabe = anfrage_ausgabe.fetchall()
for y in result_ausgabe:
	von2,wann2,text2,id2 = y
	print "%s %s: %s<br />" %(wann2,von2,text2)
	anfrage_ausgabe.execute("UPDATE chat SET gelesen='1' WHERE id='%s'" %id2)
So, nun erfindet der IE leider des öfteren einfach Irgendwelche responseText Ergebnisse, die der Server definitiv nicht sendet. Habt ihr eine Ahnung was hier falsch ist?

das ganze könnt ihr hier testen. Einfach zwei Brwoserfenster öffnen meinname und an müssen natürlich angepasst werden, damit das Skript weiß, welche Datenbankeinträge an euch senden soll.

www.homepages4you.de/chat_index.html

Vielen Dank!

Verfasst: Donnerstag 31. Januar 2008, 00:09
von veers
Sicherheits Warnung:
SQL Injections möglich
Cross Site Scripting möglich
...
;)

Verfasst: Donnerstag 31. Januar 2008, 00:18
von nemomuk
Diese Sache kannst du mir gerne auch beantworten. Wie kann ich diese Sicherheitslücken beseitigen?

Aber zurück zum eigentlich Thema, jemand eine Ahnung?

Verfasst: Donnerstag 31. Januar 2008, 08:22
von veers

Verfasst: Donnerstag 31. Januar 2008, 08:55
von nemomuk
Vielen Dank!

Das wusste ich ja eigentlich auch schon. Nur hat mir Google jetzt auch nichts ausgespuckt zum speziellen Thema Sicherheit in Webanwendungen.

Wie macht man das sinnvoll?
Mir reicht gerne eine Link, in dem all dies beschrieben wird - nur leider kann ich diesen selbst nicht finden)

MfG

Verfasst: Donnerstag 31. Januar 2008, 09:33
von BlackVivi
Gegen die injections solltest du bei den SQL-Strings nicht mit %s und sowas arbeiten, sondern lieber mit dem, was dir execute anbietet. Damit wird sowas automatisch verhindert.

Gegen Cross-Site Scripting gibts einfach'ne simple Methode --> Bei eingaben alle < und > gegen irgendwas ersetzen. Natürlich gibt es bestimmt 100mal bessere Methoden und das ist auch nicht 100% sicher, aber es ist diese grobe logische Sicherheit, die man zumindest am Anfang braucht.

Verfasst: Donnerstag 31. Januar 2008, 12:02
von veers
BlackVivi hat geschrieben:Scripting gibts einfach'ne simple Methode --> Bei eingaben alle < und > gegen irgendwas ersetzen. Natürlich gibt es bestimmt 100mal bessere Methoden und das ist auch nicht 100% sicher, aber es ist diese grobe logische Sicherheit, die man zumindest am Anfang braucht.
Das hält dann aber auch höchstens bis ein String in einem Attribut ausgegeben wird.

Ich empfehle da eher cgi.escape(text, True).

Verfasst: Donnerstag 31. Januar 2008, 15:02
von nemomuk
Vielen Dank!

@BlsckVivi: Wo finde ich eine Anleitung fuer das mit execute?

Hat einer eine Idee zum eigentlich Problem?

Verfasst: Donnerstag 31. Januar 2008, 20:47
von Leonidas
SchneiderWeisse hat geschrieben:@BlsckVivi: Wo finde ich eine Anleitung fuer das mit execute?
[wiki]Parametrisierte SQL-Queries[/wiki]