玩蛇网提供最新Python编程技术信息以及Python资源下载!

Python替换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个或者多个参数名值对同上面。。

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

http://stackoverflow.com/questions/4656843/jquery-get-querystring-from-url

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

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

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

已经搞定了,详情代码如下:
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

是这样么? (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说的方法

import urlparse

def url_replacer(url, _id, target_value):
    c_url_list = list(urlparse.urlparse(url))
    queries = [q.split('=') for q in c_url_list[4].split('&')]
    queries[_id - 1][1] = target_value
    c_url_list[4] = '&'.join(map(lambda l: '='.join(l), queries))
    return urlparse.urlunparse(c_url_list)

print url_replacer('http://www.waitalone.cn/index.php?id=../boot.ini&abc=456&xxx=ooo', 2, '123')

虽然实现了,但是很别扭。。不知道有没有第三方库提供这个功能

玩蛇网文章,转载请注明出处和文章网址:https://www.iplaypy.com/wenda/wd19153.html

相关文章 Recommend

玩蛇网Python互助QQ群,欢迎加入-->: 106381465 玩蛇网Python新手群
修订日期:2017年05月31日 - 11时14分13秒 发布自玩蛇网

您现在的位置: 玩蛇网首页 > Python问题解答 > 正文内容
我要分享到:

必知PYTHON教程 Must Know PYTHON Tutorials

必知PYTHON模块 Must Know PYTHON Modules