AJAX Chat

Sockets, TCP/IP, (XML-)RPC und ähnliche Themen gehören in dieses Forum
nemomuk
User
Beiträge: 862
Registriert: Dienstag 6. November 2007, 21:49

AJAX Chat

Beitragvon nemomuk » Mittwoch 30. Januar 2008, 23:59

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!
Benutzeravatar
veers
User
Beiträge: 1219
Registriert: Mittwoch 28. Februar 2007, 20:01
Wohnort: Zürich (CH)
Kontaktdaten:

Beitragvon veers » Donnerstag 31. Januar 2008, 00:09

Sicherheits Warnung:
SQL Injections möglich
Cross Site Scripting möglich
...
;)
My Website - 29a.ch
"If privacy is outlawed, only outlaws will have privacy." - Phil Zimmermann
nemomuk
User
Beiträge: 862
Registriert: Dienstag 6. November 2007, 21:49

Beitragvon nemomuk » Donnerstag 31. Januar 2008, 00:18

Diese Sache kannst du mir gerne auch beantworten. Wie kann ich diese Sicherheitslücken beseitigen?

Aber zurück zum eigentlich Thema, jemand eine Ahnung?
Benutzeravatar
veers
User
Beiträge: 1219
Registriert: Mittwoch 28. Februar 2007, 20:01
Wohnort: Zürich (CH)
Kontaktdaten:

Beitragvon veers » Donnerstag 31. Januar 2008, 08:22

My Website - 29a.ch

"If privacy is outlawed, only outlaws will have privacy." - Phil Zimmermann
nemomuk
User
Beiträge: 862
Registriert: Dienstag 6. November 2007, 21:49

Beitragvon nemomuk » Donnerstag 31. Januar 2008, 08:55

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
Benutzeravatar
BlackVivi
User
Beiträge: 762
Registriert: Samstag 9. Dezember 2006, 14:29
Kontaktdaten:

Beitragvon BlackVivi » Donnerstag 31. Januar 2008, 09:33

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.
Benutzeravatar
veers
User
Beiträge: 1219
Registriert: Mittwoch 28. Februar 2007, 20:01
Wohnort: Zürich (CH)
Kontaktdaten:

Beitragvon veers » Donnerstag 31. Januar 2008, 12:02

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).
My Website - 29a.ch

"If privacy is outlawed, only outlaws will have privacy." - Phil Zimmermann
nemomuk
User
Beiträge: 862
Registriert: Dienstag 6. November 2007, 21:49

Beitragvon nemomuk » Donnerstag 31. Januar 2008, 15:02

Vielen Dank!

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

Hat einer eine Idee zum eigentlich Problem?
Benutzeravatar
Leonidas
Administrator
Beiträge: 16023
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Beitragvon Leonidas » Donnerstag 31. Januar 2008, 20:47

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

[wiki]Parametrisierte SQL-Queries[/wiki]
My god, it's full of CARs! | Leonidasvoice vs Modvoice

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder