157 @type ast.AST |
157 @type ast.AST |
158 @return flag indicating an assignement |
158 @return flag indicating an assignement |
159 @rtype bool |
159 @rtype bool |
160 """ |
160 """ |
161 assigned = False |
161 assigned = False |
162 if self.__ignoreNodes: |
162 if ( |
163 if isinstance(self.__ignoreNodes, (list, tuple, object)): |
163 self.__ignoreNodes and |
164 if isinstance(node, self.__ignoreNodes): |
164 isinstance(self.__ignoreNodes, (list, tuple, object)) and |
165 return assigned |
165 isinstance(node, self.__ignoreNodes) |
|
166 ): |
|
167 return assigned |
166 |
168 |
167 if isinstance(node, ast.Expr): |
169 if isinstance(node, ast.Expr): |
168 assigned = self.isAssigned(node.value) |
170 assigned = self.isAssigned(node.value) |
169 elif isinstance(node, ast.FunctionDef): |
171 elif isinstance(node, ast.FunctionDef): |
170 for name in node.args.args: |
172 for name in node.args.args: |
171 if isinstance(name, ast.Name): |
173 if ( |
172 if name.id == self.var_name.id: |
174 isinstance(name, ast.Name) and |
173 # If is param the assignations are not affected |
175 name.id == self.var_name.id |
174 return assigned |
176 ): |
|
177 # If is param the assignations are not affected |
|
178 return assigned |
175 |
179 |
176 assigned = self.isAssignedIn(node.body) |
180 assigned = self.isAssignedIn(node.body) |
177 elif isinstance(node, ast.With): |
181 elif isinstance(node, ast.With): |
178 for withitem in node.items: |
182 for withitem in node.items: |
179 varId = getattr(withitem.optional_vars, 'id', None) |
183 varId = getattr(withitem.optional_vars, 'id', None) |
180 if varId == self.__varName.id: |
184 assigned = ( |
181 assigned = node |
185 node |
182 else: |
186 if varId == self.__varName.id else |
183 assigned = self.isAssignedIn(node.body) |
187 self.isAssignedIn(node.body) |
|
188 ) |
184 elif isinstance(node, ast.Try): |
189 elif isinstance(node, ast.Try): |
185 assigned = [] |
190 assigned = [] |
186 assigned.extend(self.isAssignedIn(node.body)) |
191 assigned.extend(self.isAssignedIn(node.body)) |
187 assigned.extend(self.isAssignedIn(node.handlers)) |
192 assigned.extend(self.isAssignedIn(node.handlers)) |
188 assigned.extend(self.isAssignedIn(node.orelse)) |
193 assigned.extend(self.isAssignedIn(node.orelse)) |
192 assigned.extend(self.isAssignedIn(node.body)) |
197 assigned.extend(self.isAssignedIn(node.body)) |
193 elif isinstance(node, (ast.If, ast.For, ast.While)): |
198 elif isinstance(node, (ast.If, ast.For, ast.While)): |
194 assigned = [] |
199 assigned = [] |
195 assigned.extend(self.isAssignedIn(node.body)) |
200 assigned.extend(self.isAssignedIn(node.body)) |
196 assigned.extend(self.isAssignedIn(node.orelse)) |
201 assigned.extend(self.isAssignedIn(node.orelse)) |
197 elif isinstance(node, ast.AugAssign): |
202 elif ( |
198 if isinstance(node.target, ast.Name): |
203 isinstance(node, ast.AugAssign) and |
199 if node.target.id == self.__varName.id: |
204 isinstance(node.target, ast.Name) and |
200 assigned = node.value |
205 node.target.id == self.__varName.id |
|
206 ): |
|
207 assigned = node.value |
201 elif isinstance(node, ast.Assign) and node.targets: |
208 elif isinstance(node, ast.Assign) and node.targets: |
202 target = node.targets[0] |
209 target = node.targets[0] |
203 if isinstance(target, ast.Name): |
210 if isinstance(target, ast.Name): |
204 if target.id == self.__varName.id: |
211 if target.id == self.__varName.id: |
205 assigned = node.value |
212 assigned = node.value |
206 elif isinstance(target, ast.Tuple): |
213 elif isinstance(target, ast.Tuple): |
207 pos = 0 |
214 for pos, name in enumerate(target.elts): |
208 for name in target.elts: |
|
209 if name.id == self.__varName.id: |
215 if name.id == self.__varName.id: |
210 assigned = node.value.elts[pos] |
216 assigned = node.value.elts[pos] |
211 break |
217 break |
212 pos += 1 |
|
213 |
218 |
214 return assigned |
219 return assigned |
215 |
220 |
216 |
221 |
217 def evaluateVar(xssVar, parent, until, ignoreNodes=None): |
222 def evaluateVar(xssVar, parent, until, ignoreNodes=None): |
229 @return flag indicating a secure evaluation |
234 @return flag indicating a secure evaluation |
230 @rtype bool |
235 @rtype bool |
231 """ |
236 """ |
232 secure = False |
237 secure = False |
233 if isinstance(xssVar, ast.Name): |
238 if isinstance(xssVar, ast.Name): |
234 if isinstance(parent, ast.FunctionDef): |
239 if ( |
235 for name in parent.args.args: |
240 isinstance(parent, ast.FunctionDef) and |
236 if name.arg == xssVar.id: |
241 any(name.arg == xssVar.id for name in parent.args.args) |
237 return False # Params are not secure |
242 ): |
|
243 return False # Params are not secure |
238 |
244 |
239 analyser = DeepAssignation(xssVar, ignoreNodes) |
245 analyser = DeepAssignation(xssVar, ignoreNodes) |
240 for node in parent.body: |
246 for node in parent.body: |
241 if node.lineno >= until: |
247 if node.lineno >= until: |
242 break |
248 break |