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  [ 1 Beitrag ] 
Autor Nachricht
 Betreff des Beitrags: Rack::NoTags
BeitragVerfasst: 14 Nov 2009, 17:14 
Offline
Lehrling

Registriert: 25 Mai 2009, 12:48
Beiträge: 91
Wohnort: Berlin
Hab mich kurzfristig entschlossen, doch noch beim CodeRack.org contest mitzumachen:

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
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
# # # #
# Rack::NoTags removes < and > from all incoming requests
# http://rbjl.net/12-rack-notags
#
# (c) 2009 Jan Lelis
# This software is licensed under the MIT license.
# # # #

module Rack
class NoTags
# see at bottom for the Patterns

def initialize(app, mode = :brackets_only, ignore = {})
@app = app
@patterns = Patterns[mode.to_sym] # mode selects the right pattern set
@ignore = ignore # if one entry of the ignore list matchs a post param,
# nothing will be filtered
end

def call(env)
# get params in a nice format
post_params = Rack::Utils.parse_query(env['rack.input'].read, "&")
get_params = Rack::Utils.parse_query(env['QUERY_STRING'], "&")


# remove @patterns
unless ignore?(post_params)
post_params = strip_all(post_params)
get_params = strip_all(get_params)
end

# update envirionment
env['rack.input'] = StringIO.new(Rack::Utils.build_query(post_params))
env['QUERY_STRING'] = Rack::Utils.build_query(get_params)

# call framework
@app.call(env)
end

private

# check if param is on ignore list
def ignore?(params)
ret = false

@ignore.each{ |ign_param, ign_value|
params.each{ |param, value|
if !value.is_a?(Array) &&
ign_param.to_s == param.to_s &&
ign_value.to_s == value.to_s

ret = true
end
}
}

ret
end

# applies each 'to-substitute'-pattern to the string
def strip(string)
begin
@patterns.each{ |replacement, patterns|
patterns.each{ |pattern|
string = string.gsub(pattern, replacement)
}
}
end while catch :still_some do
# check if there is still any pattern that needs to be aplied
@patterns.each{ |_, patterns|
patterns.each{ |pattern|
if string[pattern] # like =~ but =~ is not
# defined for two strings
throw :still_some, true
end
}
}
false
end

string
end

# looks at every param-element an sends it to the strip method
def strip_all(params)
ret = {}
params.each{ |param, value|
ret[strip(param)] = value.is_a?(Array) ? value.map{|v|strip(v)} : strip(value)
}

ret
end


Patterns = { # replacement => [ array, of, patterns ]

:brackets_only => {
'&lt;' => %w[ < %3C ],
'&gt;' => %w[ > %3E ] },

# similar to Racks escape_html + url_encoded forms
:valid_xml => {
'&lt;' => %w[ < %3C ],
'&gt;' => %w[ > %3E ],
'&amp;' => %w[ & %26 ],
'&#39;' => %w[ ' %27 ],
'&quot;' => %w[ " %22 ] },

# encodings which might be interpreted as < or > in some situations
:paranoid => {
'' => %w[ < > %3C %3E ] + [
/&[lg]t;?/i,
/&#0{0,5}6[02];?/,
/&#x0{0,5}3[ce];?/i ]},

# tries to filter out easy javascript injections
:filter_script => {
### warning ###
# it is *not* recommended to use this mode in production!
# this is only a weak test, there are too many ways of xss...
# note that this also affects the normal use of "script" (not only script tags)
's_c_r_i_p_t' => [
/(s|%73|&#x0*?73|&#0*?115);?((\s|&#x?0*?9|&#x0*?a|&#0*?10|&#x0*?d|&#*?13);?)*(c|%63|&#x0*?63|&#0*?99);?((\s|&#x?0*?9|&#x0*?a|&#0*?10|&#x0*?d|&#*?13);?)*(r|%72|&#x0*?72|&#0*?114);?((\s|&#x?0*?9|&#x0*?a|&#0*?10|&#x0*?d|&#*?13);?)*(i|%69|&#x0*?69|&#0*?105);?((\s|&#x?0*?9|&#x0*?a|&#0*?10|&#x0*?d|&#*?13);?)*(p|%70|&#x0*?70|&#0*?112);?((\s|&#x?0*?9|&#x0*?a|&#0*?10|&#x0*?d|&#*?13);?)*(t|%74|&#x0*?74|&#0*?116);?/im
],

#/(s|%73|&#x0*?73|&#0*?115);? ((\s|&#x?0*?9|&#x0*?a|&#0*?10|&#x0*?d|&#*?13);?)*
# (c|%63|&#x0*?63|&#0*?99);? ((\s|&#x?0*?9|&#x0*?a|&#0*?10|&#x0*?d|&#*?13);?)*
# (r|%72|&#x0*?72|&#0*?114);? ((\s|&#x?0*?9|&#x0*?a|&#0*?10|&#x0*?d|&#*?13);?)*
# (i|%69|&#x0*?69|&#0*?105);? ((\s|&#x?0*?9|&#x0*?a|&#0*?10|&#x0*?d|&#*?13);?)*
# (p|%70|&#x0*?70|&#0*?112);? ((\s|&#x?0*?9|&#x0*?a|&#0*?10|&#x0*?d|&#*?13);?)*
# (t|%74|&#x0*?74|&#0*?116);?/im

# there is a lot more to do to catch everything... here are some ideas:
'i_f_r_a_m_e' => [ /iframe/i ],
'e_x_p_r_e_s_s_i_o_n' => [ /expression/i ],
'o_n_l_o_a_d' => [ /onload/i ] # ...and another thousand eventhandlers

# anti remote file inclusion? ...
}
}

end
end

Bin gespannt auf euer Feedback :)

_________________
fresh / irbtools / ripltools / github / J-_-L


Nach oben
 Profil  
 
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 1 Beitrag ] 

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: