ACHTUNG. Das ist ein Archiv des alten forum.ruby-portal.de. Die aktuelle Mailingliste gibt es auf lists.ruby-lang.org/pipermail/ruby-de.

NOTICE. This is a ready-only copy of the old forum.ruby-portal.de. You can find the current mailing list at lists.ruby-lang.org/pipermail/ruby-de.

Die Programmiersprache Ruby

Blog|

Forum|

Wiki  


Alle Zeiten sind UTC + 1 Stunde [ Sommerzeit ]

Ein neues Thema erstellen Auf das Thema antworten  [ 42 Beiträge ]  Gehe zu Seite 1, 2, 3  Nächste
Autor Nachricht
 Betreff des Beitrags: Weiter im Text
BeitragVerfasst: 14 Jun 2004, 14:11 
Offline
Ex-Admin
Benutzeravatar

Registriert: 12 Mai 2003, 18:49
Beiträge: 890
Wohnort: Kiel
Moin!

Ich sollte zwar eigendlich an einem Projekt für die FH sitzen oder für die Prüfungen Ende des Monats lernen, aber da ich das eh nicht tue, dachte ich, ich könnte endlich mal was für's RubyBB tun.

Mein Text zu Subversion ist dann doch etwas länger geworden, als geplant. Er ist zwar nicht ganz fertig, aber im Grunde ist schon alles wichtige drin und mehr.

http://www.igels.net/subversion.html

Falls ihr sehr wenig Zeit habt, die Teile "Was ist ein Versionsverwaltungsystem?", "Was ist Subversion?", "Das Grundkonzept", "Der Check-Out" und "Der Commit" halte ich für die wichtigesten.

Es gibt natürlich auch einige GUIs für Subversion, siehe hier, für Windows hat mir TortoiseSVN sehr gut gefallen. Aber die Lektüre meiner oder eine andere Einführung in Subversion empfehle ich auch, wenn ihr nicht den Kosolenclienten einsetzen wollt, das Prinzip ist ja das selbe.

Ich werde jetzt gleich mal versuchen, die aktuelle Version ins Repository zu tun. Auf rubybb.org ist hoffendlich die aktuellste. ;)

Das RubyBB-Repository ist unter http://igel.dyndns.org/svn/rubybb zu erreichen. Commits können aktuell aber nur Bunny und ich machen, wer auch Schreibzugriff haben will, klickt hier.

iGEL

_________________



# Kein Kommentar!!


Nach oben
 Profil  
 
 Betreff des Beitrags: Re: Weiter im Text
BeitragVerfasst: 15 Jun 2004, 00:12 
Offline
Böser Admin 2
Benutzeravatar

Registriert: 17 Mär 2004, 17:03
Beiträge: 2544
Wohnort: Berlin
iGEL hat geschrieben:
http://www.igels.net/subversion.html
hab's ausgedruckt (!!!) und durchgelesen. sehr informativ. will haben ;)

zum thema "Weiter im Text": BBCode ist komplett überarbeitet und wird jetzt nur noch ein wenig getestet, danach lade ich die neue version hoch und außerdem eine dokumentation, über die ich diskutieren möchte.

imo ist BBCode nach dem design das modul, mit dem die user am meisten zu tun haben...da sollte nicht einer allein die entscheidungen treffen. wenn's nach mir geht, mache ich da draus noch ne programmiersprache :twisted:

_________________
Ruby-Mine | (almost) murphy.de | rubychan.de


Nach oben
 Profil  
 
 Betreff des Beitrags:
BeitragVerfasst: 15 Jun 2004, 10:35 
Offline
Schüler

Registriert: 02 Jun 2004, 15:58
Beiträge: 26
Es gibt leider kein Verzeichnis library im Reposity. Da sollte eine web.rb sein die zum arbeiten erforderlich ist.


Nach oben
 Profil  
 
 Betreff des Beitrags:
BeitragVerfasst: 15 Jun 2004, 21:24 
Offline
Obfuscator

Registriert: 20 Jul 2003, 22:14
Beiträge: 597
Zitat:
Es gibt leider kein Verzeichnis library im Reposity. Da sollte eine web.rb sein die zum arbeiten erforderlich ist.


Das Verzeichnis sollte eigentlich Vergangenheit sein(Es hatte sich nicht wirklich gelohnt). Die Datei müsste jetzt in drivers liegen. Ist da evt. etwas durcheinander gekommen? Mal schauen...

@iGEL: Der Text ist echt gut. Hab aber leider noch nicht alles verinnerlicht. Wenn man sich vornimmt sich mehr Zeit für etwas zunehmen, schneit etwas anders herein und man hat noch weniger Zeit. Schon komisch...


Nach oben
 Profil  
 
 Betreff des Beitrags:
BeitragVerfasst: 16 Jun 2004, 18:05 
Offline
Ex-Admin
Benutzeravatar

Registriert: 12 Mai 2003, 18:49
Beiträge: 890
Wohnort: Kiel
Moin!

So, nun hab ich die aktuelle Version ins Repository eingecheckt. Ich hoffe, ich hab nichts durcheinander gebracht, bei den ganzen verschobenen Versionen ist das gar nicht so einfach, alles zu verfolgen. Wäre euch dankbar, wenn ihr ab jetzt Subversion verwenden würdet. ;)

In der aktuellen Version gibt es ja, wenn ich das richtig sehe, nur noch das Grundgerüst, das eigendliche Forum muss neu geschrieben werden, oder?

iGEL

_________________



# Kein Kommentar!!


Nach oben
 Profil  
 
 Betreff des Beitrags:
BeitragVerfasst: 16 Jun 2004, 20:48 
Offline
Obfuscator

Registriert: 20 Jul 2003, 22:14
Beiträge: 597
Zitat:
In der aktuellen Version gibt es ja, wenn ich das richtig sehe, nur noch das Grundgerüst, das eigendliche Forum muss neu geschrieben werden, oder?


Richtig. Das Grundgerüst ist aber noch nicht 100% fertig. Das Cache-System usw. ist noch nicht richtig eingebaut usw. Aber das ist ja jetzt auch noch so wichtig. Ich habe schon mal der Registrierung angefangen.
Wenn du Zeit hast, könntes ja schon mal mit der Forenübersicht anfangen. Da hattes du dir doch eh schon Gedanken zu gemacht, oder(Unterforen usw.)?


Nach oben
 Profil  
 
 Betreff des Beitrags:
BeitragVerfasst: 16 Jun 2004, 22:49 
Offline
Ex-Admin
Benutzeravatar

Registriert: 12 Mai 2003, 18:49
Beiträge: 890
Wohnort: Kiel
Moin!

Das kann ich machen. Alternativ könnte ich mich um die Sessions kümmern, oder sind die fertig? Wie du siehst, in den eigendlichen Code habe ich noch nicht so viel reingeschaut. :oops:

Mal was anderes: Wollen wir vielleicht statt eines eigenen Datenbanklayers vielleicht ruby-dbi einsetzen? Ich befürchte nämlich, dass mit der bisherigen Methode SQL-Injections möglich sind. SQL-Injections sind Angriffe, bei denen der Angreifer die Parameter eines Scripts, die in SQL-Befehlen verwendet werden, so ändert, dass Daten auf nicht vorgesehene Weise ausgegeben, verändert oder gelöscht werden.

Also Beispielsweise:



@sql.query("DELETE FROM article WHERE arcticle_id = "+ @web.param["id"])

wäre sehr leicht angreifbar, in dem man das Scribt mit "?id=article_id" in der URL aufruft. Dann lautet der SQL-Befehl:



DELETE FROM article WHERE article_id = article_id

Es werden also alle Zeilen gelöscht, statt der einen, die gelöscht werden sollte.

Bei Heise gibt es einen Hintergrundartikel dazu: http://www.heise.de/security/artikel/43175/0

Beispiele: Statt:



query = @sql.query("SELECT id, name, date, posts, topics, last_action, `group`, karma FROM `members` WHERE `group` > 0 AND (name LIKE '"+@web.param["letter"]+"%' OR name LIKE '"+(@web.param["letter"]).downcase+"%')")

würde man



query = @sql.execute("SELECT id, name, date, posts, topics, last_action, `group`, karma FROM `members` WHERE `group` > 0 AND (name LIKE ? OR name LIKE ?)", @web.param["letter"]+"%", (@web.param["letter"]).downcase+"%")

schreiben. Ich denke, noch wird der Aufwand, das zu ändern recht einfach sein.

Ich probiere gleich mal aus, ob man ruby-dbi auch ohne Installation verwenden kann. Sollte theoretisch gehen, da es komplett in Ruby geschrieben ist.

Auf der anderen Seite könnte ich natürlich auch die bisherige Klasse so erweitern, dass sie Injections nicht zulässt.

Ausserdem würde ich die Einführung eines Prefix für die Tabellennamen vorschlagen, welches man in der config-Datei festlegen kann. Damit könnte man in der selben Datenbank unterschiedliche Foren laufen lassen, ausserdem wäre man vor Kollisionen mit anderen Anwendungen sicher. Also schreibt man statt "SELECT * FROM members" "SELECT * FROM #{SQLPREFIX }members". Also defautl für das Prefix würde ich "rubybb_" vorschlagen.

iGEL

_________________



# Kein Kommentar!!


Nach oben
 Profil  
 
 Betreff des Beitrags:
BeitragVerfasst: 17 Jun 2004, 14:51 
Offline
Geselle

Registriert: 04 Mär 2004, 20:19
Beiträge: 102
es ist wohl egal ob du eine eigene schnittstelle zu einer datenbank schreibst oder eine vorhandene wie dbi nimmst.. du kannst ja mit beiden systemen manipulierte sql anweisung an die datenbank schicken.. folglich kommt man wohl nicht darum herum die informationen zu prüfen.. ich nehme dafür meißt reguläre ausdrücke.. also in deinem bsp. hätte man z.b. nur auf sowas wie [0-9] geprüft und ansonsten die informationen verworfen.. um eine plausibiliätsprüfung kommt man dabei natürlich auch nicht drumherum.. sowas wie 'isOwnerOfPost' oder 'isAdmin' muss da natürlich noch drumherum..


btw. wäre es nicht sinnvoll den gesamten tabellen namen auszulagern??



bovi


Nach oben
 Profil  
 
 Betreff des Beitrags:
BeitragVerfasst: 17 Jun 2004, 15:56 
Offline
Schüler

Registriert: 02 Jun 2004, 15:58
Beiträge: 26
ich bins wieder ....
wie kommt man an die SQL-Struktur ran?


Nach oben
 Profil  
 
 Betreff des Beitrags:
BeitragVerfasst: 17 Jun 2004, 19:20 
Offline
Geselle

Registriert: 04 Mär 2004, 20:19
Beiträge: 102
wie meinst du das? -> "an die sql struktur rankommen"


Nach oben
 Profil  
 
 Betreff des Beitrags:
BeitragVerfasst: 17 Jun 2004, 19:35 
Offline
Obfuscator

Registriert: 20 Jul 2003, 22:14
Beiträge: 597
1. Zu SQL-Injections

Um SQL-Infections auszuschließen müssen alle Zeichenkette vorher mit der folgender Routine bearbeitet werden. iGEL sollte diese sehr bekannt vorkommen. :D

/drivers/sql.rb:


1
2
3
4

def addslashes(q)
q.gsub(/'|"|\\/) { |x| "\\" + x }
end


Da ich bei den ersten Versuch der Forensoftware, meisten immer Hashs gearbeitet habe: Hab ich mir direkt zwei weitere Methoden gebaut:

/drivers/sql.rb:


1
2
3
4
5

def squery(q, hsh)
hsh.each { |key, value| q.gsub!( "<#{key}>", addslashes(value))}
query(q)
end


/drivers/action.rb:


1
2
3
4
5
6

def cp_hsh(arr, hsh)
new_hsh = {}
arr.each { |key| new_hsh.update({key => hsh[key]}) }
new_hsh
end


Das ganze sieht dann in Aktion so aus:



1
2
3
4

sql_hsh = cp_hsh(%w[name email], @web.param)
q = "blabla WHERE name='<name>' AND email='<email>';"
@sql.squery(q, sql_hsh)


Wie findet ihr das?

Achja, zu den genannten Beispiel

Ich überprüfe ja die Länge letter. Da sollte meines erachtens keine SI möglich sein.



1
2

if @web.param["letter"].size > 1 then raise "letter_err" end


2. Es gibt ja scheinbar viel Treiber für Mysql

Deshalb sollten wir das ganze nicht auf einen fixieren. Ich habe mich damit noch nicht sehr stark auseinander gesetzt. Deshalb sind Lösungsvorschläge erwünscht.

3. Präfix

Das hatte ich mir auch schon überlegt. Werde mich darum kümmern. Bovi, wie meinst du das mit den ganzen Tabellennamen auslagern?

4. Wie kommt man an die SQL-Struktur ran?

Gute Frage. Kann man das bei den Quellcode beilegen?


Nach oben
 Profil  
 
 Betreff des Beitrags:
BeitragVerfasst: 17 Jun 2004, 19:56 
Offline
Schüler

Registriert: 02 Jun 2004, 15:58
Beiträge: 26
Die SQL-Struktur dabei zu legen wäre das mindeste was man tun könnte. Man kann ja das Programm nicht an mal ansatzweise test ohen Datenbank. Man könnte diese natürlich nachbauen, aber wer will das schon?

Ansonsten könnte man einen Script ala install oder setup schreiben, das die Einrichtug der Datenbank übernimmt. Den Prefix könnte man dann auch miteinbeziehen. ;)


Nach oben
 Profil  
 
 Betreff des Beitrags:
BeitragVerfasst: 17 Jun 2004, 21:13 
Offline
Böser Admin 2
Benutzeravatar

Registriert: 17 Mär 2004, 17:03
Beiträge: 2544
Wohnort: Berlin
bunny hat geschrieben:


1
2
3
 def addslashes(q)
q.gsub(/'|"|\\/) { |x| "\" + x }
end
gut zu wissen :)
aber, wie gesagt, ich hoffe, dass außer dem programmierer des DB-moduls niemand SQL-querys stellen muss.
btw:

1
2
3
 def addslashes(q)
q.gsub /(['"\\])/, '\\\\\1'
end
ist etwas schneller.

zu welcher klasse gehören denn diese ganzen funktionen? ich fände es Ruby-artiger, wenn man sie der Array- und Stringklasse zuordnen würde. ist aber nur ein vorschlag, kenne dein system ja nicht.

_________________
Ruby-Mine | (almost) murphy.de | rubychan.de


Nach oben
 Profil  
 
 Betreff des Beitrags:
BeitragVerfasst: 17 Jun 2004, 21:55 
Offline
Ex-Admin
Benutzeravatar

Registriert: 12 Mai 2003, 18:49
Beiträge: 890
Wohnort: Kiel
Moin!
Rambutan hat geschrieben:
Die SQL-Struktur dabei zu legen wäre das mindeste was man tun könnte. Man kann ja das Programm nicht an mal ansatzweise test ohen Datenbank.

Habe ich gerade getan, liegt in install/mysql.dump

Aber wie gesagt, es handelt sich dabei aktuell eigendlich nur um ein Grundgerüst, von Foren oder so ist noch nichts zu sehen!

Zitat:
Ansonsten könnte man einen Script ala install oder setup schreiben, das die Einrichtug der Datenbank übernimmt. Den Prefix könnte man dann auch miteinbeziehen. ;)

Ja, sowas will ich natürlich auch haben, aber dafür ist es noch etwas sehr früh. ;)

@bunny: Okay. Das sieht gut aus und sollte imho halten. :)

@murphey: Schick mir mal eine PN mit einem htpasswd-Verschlüsselten Passwort, dann kriegst du auch schreibzugriff auf's Repository und kannst sowas gleich anpassen. :)

iGEL

_________________



# Kein Kommentar!!


Nach oben
 Profil  
 
 Betreff des Beitrags:
BeitragVerfasst: 17 Jun 2004, 23:50 
Offline
Geselle

Registriert: 04 Mär 2004, 20:19
Beiträge: 102
@bunny:
ich meine man erstellt ne include datei in der man konstanten für die tabellennamen und spaltennamen erzeugt.. diese können dann verwendete werden ohne das sich jemand darum kümmern muss das diese vielleicht irgendwann geändert werden..

also statt:


1
2

aSQLString = 'SELECT ID,POST FROM POSTS WHERE ID = 1'


schreibt man dann:


1
2
3
4

aSQLString = 'SELECT ' + SPALTE_ID + ',' + SPALTE_POST
aSQLString += ' FROM ' + TABELLE_POSTS
aSQLString += ' WHERE ' + SPALTE_ID + ' = 1'


aber das ist ein ziemlich primitiver versuch redunanzen zu verhindern.. und weil wir ja ruby und nicht php programmieren sollte man vielleicht etwas weiter denken wie z.b.:


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79

class Database
def initialize(theDatabasename)
# create database object
end

def to_s
# returned the database name
end

def addTable(theTable)
# add a table object to this database
end

def createDatabase
# we create the database with the tables and columns
end
end

class Table
def initialize(theTablename)
# create table object
end

def to_s
# returned the table name
end

def addColumn(theColumn)
# add column object to this table
end
end

class Column
def initialize(theColumnName, theColumnTyp)
# create the column object
end

def to_s
# returned the column name
end

def check(theValue)
# here we check 'theValue' against the type of the column
end
end

# create a database object
aDatabase = Database.new('meineDatenbank')

# create the table object 'Member'
aTableMember = Table.new('Member')

# create columns
aColumnMemberID = Column.new('ID', 'integer')
aColumnMemberName = Column.new('MEMBER_NAME', 'varchar')

# add columns to table
aTableMember.addColumn(aColumnMemberID )
aTableMember.addColumn(aColumnMemberName)

# add the table
aDatabase .addTable(aTableMember)

# we create the database
aDatabase.create

# connect to a specific database (virtual method connectToDatabase)
connectToDatabase(aDatabase.to_s)

# we check the value for this column
if aColumnMemberName.check('bovi')
# we can add this name to the table
end

# we want to create a sql statement
aSqlString = 'SELECT ' + aColumnMemberID.to_s + ',' + aColumnMemberName.to_s
aSqlString += ' FROM ' + aColumnMember.to_s
aSqlString += ' WHERE ' + aColumnMemberID.to_s + ' = 1'


das sieht alles natürlich extrem viel aus hat aber viele gigantische vorteile..
1. es muss wirklich nur an einer stelle ein name für die datenbank, die tabelle und die spalten definiert werden(implementiert hier mit dem überschreiben der standard methode to_s).. für die spalten speziell kann man wie hier mit 'check' angedeutet eine methode erstellen die einen übergebenen wert gegen den spalten typ gegenprüft und dann eine aussage über die validität fällt..
2. die generierung der datenbank (tabellen, spalten) könnte aus den gleichen daten erstellt werden indem man wie hier angedeutet mit der methode 'create' die datenbank erstellt (vielleicht indem man einen dump anhand der tabellen und spalten objekte erzeugt und diesen an die datenbank schickt..)
3. wenn man das konzept noch ein wenig ausarbeitet könnte man auch eine alias methode erstellen die dann auf verschobene spalten weist.. dies hätte den vorteil das man das datenbank design teilweise ändern kann und trotzdem den vorhanden code erstmal weiterbenutzen kann bis man zeit hat ihn nachzuziehen.. aber ihr designt die datenbank bestimmt sogut das sowas nicht nötig ist, will ich zumindest hoffen.. (-:
4. man bekommt natürlich bei einem schreibfehler des tabellennamens gleich eine fehlermeldung das das objekt nicht gefunden wurde.. dies ist öfter ein wenig praktischer als sich durch die komischen datenbank eigenen fehlermeldungen zu wühlen..


das war jetzt natürlich nur kurzes brainstorming.. höchstwahrscheinlich wird es eine menge nachteile mit dieser lösung geben.. aber der weg den ich vorschlagen wollte ist hoffentlich ein wenig besser ersichtlich geworden -> nutzt so wenig wie möglich hardcodierte informationen.. besonders nicht solche die so oder so in der anfangsphase eines projektes geändert werden (wie z.b. die tabellen- und spaltennamen)..

bovi


Nach oben
 Profil  
 
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 42 Beiträge ]  Gehe zu Seite 1, 2, 3  Nächste

Alle Zeiten sind UTC + 1 Stunde [ Sommerzeit ]


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 3 Gäste


Du darfst keine neuen Themen in diesem Forum erstellen.
Du darfst keine Antworten zu Themen in diesem Forum erstellen.
Du darfst deine Beiträge in diesem Forum nicht ändern.
Du darfst deine Beiträge in diesem Forum nicht löschen.
Du darfst keine Dateianhänge in diesem Forum erstellen.

Suche nach:
cron