Parses given page content for possible forms (Note: still not implemented for Python3) >>> findPageForms(' ', 'http://www.site.com') == set([('http://www.si
(content, url, raiseException=False, addToTargets=False)
| 4659 | return retVal |
| 4660 | |
| 4661 | def findPageForms(content, url, raiseException=False, addToTargets=False): |
| 4662 | """ |
| 4663 | Parses given page content for possible forms (Note: still not implemented for Python3) |
| 4664 | |
| 4665 | >>> findPageForms('<html><form action="/input.php" method="POST"><input type="text" name="id" value="1"><input type="submit" value="Submit"></form></html>', 'http://www.site.com') == set([('http://www.site.com/input.php', 'POST', 'id=1', None, None)]) |
| 4666 | True |
| 4667 | """ |
| 4668 | |
| 4669 | class _(six.StringIO, object): |
| 4670 | def __init__(self, content, url): |
| 4671 | super(_, self).__init__(content) |
| 4672 | self._url = url |
| 4673 | |
| 4674 | def geturl(self): |
| 4675 | return self._url |
| 4676 | |
| 4677 | if not content: |
| 4678 | errMsg = "can't parse forms as the page content appears to be blank" |
| 4679 | if raiseException: |
| 4680 | raise SqlmapGenericException(errMsg) |
| 4681 | else: |
| 4682 | logger.debug(errMsg) |
| 4683 | |
| 4684 | forms = None |
| 4685 | retVal = set() |
| 4686 | response = _(content, url) |
| 4687 | |
| 4688 | try: |
| 4689 | forms = ParseResponse(response, backwards_compat=False) |
| 4690 | except ParseError: |
| 4691 | if re.search(r"(?i)<!DOCTYPE html|<html", content or "") and not re.search(r"(?i)\.js(\?|\Z)", url): |
| 4692 | dbgMsg = "badly formed HTML at the given URL ('%s'). Going to filter it" % url |
| 4693 | logger.debug(dbgMsg) |
| 4694 | filtered = _("".join(re.findall(FORM_SEARCH_REGEX, content)), url) |
| 4695 | |
| 4696 | if filtered and filtered != content: |
| 4697 | try: |
| 4698 | forms = ParseResponse(filtered, backwards_compat=False) |
| 4699 | except: |
| 4700 | errMsg = "no success" |
| 4701 | if raiseException: |
| 4702 | raise SqlmapGenericException(errMsg) |
| 4703 | else: |
| 4704 | logger.debug(errMsg) |
| 4705 | except: |
| 4706 | pass |
| 4707 | |
| 4708 | for form in forms or []: |
| 4709 | try: |
| 4710 | for control in form.controls: |
| 4711 | if hasattr(control, "items") and not any((control.disabled, control.readonly)): |
| 4712 | # if control has selectable items select first non-disabled |
| 4713 | for item in control.items: |
| 4714 | if not item.disabled: |
| 4715 | if not item.selected: |
| 4716 | item.selected = True |
| 4717 | break |
| 4718 |
no test coverage detected
searching dependent graphs…