如何替换url中的参数值?

大家好,我是python新手,想写一个测试目录遍历的小脚本,遇到了问题,求各位大牛指教!

python 2.7.8 windows 7 x64位

测试url:http://www.waitalone.cn/index.php?id=123&abc=456&xxx=ooo

其实参数名值对个数不是固定的,这里我只是以3个为准测试。

payloads = ('../boot.ini','../etc/passwd','../windows/win.ini','../../boot.ini','../../etc/passwd')

我想要实现的是这样的功能,首先遍历payloads,然后使用其payload替换url中的参数值,但是要在替换第一个参数值的时候其它两个或者多个参数名值对保护不变,举例如下:

http://www.waitalone.cn/index.php?id=../boot.ini&abc=456&xxx=ooo
http://www.waitalone.cn/index.php?id=../etc/passwd&abc=456&xxx=ooo
.....
http://www.waitalone.cn/index.php?id=../../etc/passwd&abc=456&xxx=ooo

当替换第2个参数值的时候其它的不变:

http://www.waitalone.cn/index.php?id=123&abc=../boot.ini&xxx=ooo
...
http://www.waitalone.cn/index.php?id=123&abc=../../etc/passwd&xxx=ooo

第3个或者多个参数名值对同上面。。

我只知道如何一次性的把所有的参数值给替换掉,但是不知道如何保持其它两个不变,求大牛们指教!

阅读 15.9k
4 个回答
✓ 已被采纳新手上路,请多包涵

已经搞定了,详情代码如下:
http://www.waitalone.cn/replace-url-params.html

def url_values_plus(url, vals):
ret = []
u = urlparse.urlparse(url)
qs = u.query
pure_url = url.replace('?'+qs, '')
qs_dict = dict(urlparse.parse_qsl(qs))
for val in vals:
    for k in qs_dict.keys():
        tmp_dict = copy.deepcopy(qs_dict)
        tmp_dict[k] = val
        tmp_qs = urllib.unquote(urllib.urlencode(tmp_dict))
        ret.append(pure_url + "?" + tmp_qs)
return ret

创建方法时第一个传参数为你的payloads,第二个参数和第三个参数设为带默认值的参数例如

def test(payloads,abc='456',xxx='123')

调用的时候只需要给第一个参数,因为第二,第三个参数都是由默认值的.
当然你也可以用python的可变参数或关键参数.

是这样么? (python3.x)

url = 'http://www.waitalone.cn/index.php?id=%s&abc=%s&xxx=%s'
payloads = ['../boot.ini', '../etc/passwd', '../windows/win.ini', '../../boot.ini', '../../etc/passwd']

def f(id='123', abc='456', xxx='000') :
print(url % (id, abc, xxx))

for payload in payloads :
f(id=payload)
f(abc=payload)
f(xxx=payload)

就是@MIllyn说的方法

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题