Mercurial > pub > Impl
comparison Lib/IMPL/DOM/Transform/QueryToDOM.pm @ 325:34a110d1f06c
added security check for the query transformation
author | cin |
---|---|
date | Mon, 27 May 2013 02:49:58 +0400 |
parents | b56b1ec33b59 |
children | 4cc6cc370fb2 |
comparison
equal
deleted
inserted
replaced
324:b1e7b55b4a38 | 325:34a110d1f06c |
---|---|
1 package IMPL::DOM::Transform::QueryToDOM; | 1 package IMPL::DOM::Transform::QueryToDOM; |
2 use strict; | 2 use strict; |
3 | 3 |
4 use IMPL::Const qw(:prop); | 4 use IMPL::Const qw(:prop); |
5 use IMPL::declare { | 5 use IMPL::declare { |
6 require => { | |
7 OutOfRangeException => '-IMPL::OutOfRangeException' | |
8 }, | |
6 base => [ | 9 base => [ |
7 'IMPL::DOM::Transform::ObjectToDOM' => '@_' | 10 'IMPL::DOM::Transform::ObjectToDOM' => '@_' |
8 ], | 11 ], |
9 props => [ | 12 props => [ |
10 prefix => PROP_RO, | 13 prefix => PROP_RO, |
11 delimiter => PROP_RO | 14 delimiter => PROP_RO |
12 ] | 15 ] |
13 }; | 16 }; |
17 | |
18 our $MAX_INDEX = 1024; | |
14 | 19 |
15 sub CTOR { | 20 sub CTOR { |
16 my ($this) = @_; | 21 my ($this) = @_; |
17 | 22 |
18 $this->templates->{'CGI'} = 'TransformCGI'; | 23 $this->templates->{'CGI'} = 'TransformCGI'; |
57 my $node = $data; | 62 my $node = $data; |
58 while ( my $part = shift @parts ) { | 63 while ( my $part = shift @parts ) { |
59 if (my ($name,$index) = ($part =~ m/^(\w+)(?:\[(\d+)\])?$/) ) { | 64 if (my ($name,$index) = ($part =~ m/^(\w+)(?:\[(\d+)\])?$/) ) { |
60 if (@parts) { | 65 if (@parts) { |
61 if(defined $index) { | 66 if(defined $index) { |
67 $this->ValidateIndex($index); | |
62 $node = ($node->{$name}[$index] ||= {}); | 68 $node = ($node->{$name}[$index] ||= {}); |
63 } else { | 69 } else { |
64 $node = ($node->{$name} ||= {}); | 70 $node = ($node->{$name} ||= {}); |
65 } | 71 } |
66 } else { | 72 } else { |
67 if(defined $index) { | 73 if(defined $index) { |
74 $this->ValidateIndex($index); | |
68 $node->{$name}[$index] = (@value == 1 ? $value[0] : \@value); | 75 $node->{$name}[$index] = (@value == 1 ? $value[0] : \@value); |
69 } else { | 76 } else { |
70 $node->{$name} = (@value == 1 ? $value[0] : \@value); | 77 $node->{$name} = (@value == 1 ? $value[0] : \@value); |
71 } | 78 } |
72 } | 79 } |
73 } | 80 } |
74 } | 81 } |
75 } | 82 } |
76 | 83 |
77 return $this->Transform($data); | 84 return $this->Transform($data); |
85 } | |
86 | |
87 sub ValidateIndex { | |
88 my ($this,$index) = @_; | |
89 | |
90 die OutOfRangeException->new() | |
91 unless $index >= 0 and $index <= $MAX_INDEX; | |
78 } | 92 } |
79 | 93 |
80 sub TransformAction { | 94 sub TransformAction { |
81 my ($this,$action) = @_; | 95 my ($this,$action) = @_; |
82 | 96 |