V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
hack2012
V2EX  ›  Python

如何替换 url 中的参数值?

  •  
  •   hack2012 · 2014-12-17 10:02:00 +08:00 · 7128 次点击
    这是一个创建于 3417 天前的主题,其中的信息可能已经有所发展或是发生改变。
    大家好,我是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个或者多个参数名值对同上面。。

    我只知道如何一次性的把所有的参数值给替换掉,但是不知道如何保持其它两个不变,求大牛们指教!
    17 条回复    2014-12-19 11:19:13 +08:00
    Delbert
        1
    Delbert  
       2014-12-17 10:39:01 +08:00
    先用=进行split,
    之后对每个元素用&进行split,
    替换掉[0],
    依次循环呗。
    kmvan
        2
    kmvan  
       2014-12-17 10:48:13 +08:00
    py 这么麻烦,果然 php 才是最好的语言
    timonwong
        3
    timonwong  
       2014-12-17 10:54:13 +08:00
    bits = list(urlparse.urlparse(url))
    qs = urlparse.parse_qs(bits[4]) # 注意value是一个list
    # 修改qs,略
    bits[4] = urllib.urlencode(qs, True)
    url = urlparse.urlunparse(bits)
    realityone
        4
    realityone  
       2014-12-17 10:54:26 +08:00 via iPhone
    也可以对&来split,然后再对=split
    替换掉之后join回来

    这些参数有点奇怪啊…
    jarlyyn
        5
    jarlyyn  
       2014-12-17 11:09:29 +08:00
    感觉你是需要克隆一个字典
    hack2012
        7
    hack2012  
    OP
       2014-12-17 14:42:35 +08:00
    有人能写出一个完整的代码吗?
    hack2012
        8
    hack2012  
    OP
       2014-12-17 14:50:38 +08:00
    @kmvan 哥,你用php折腾一个出来也可以的呀,我好参考改成python版的。
    kingxsp
        9
    kingxsp  
       2014-12-17 14:53:01 +08:00
    purl 库应该是你需要的
    kmvan
        10
    kmvan  
       2014-12-17 15:47:53 +08:00 via Android
    @hack2012 哥,你用php折腾一个出来也可以的呀,我好参考改成python版的。
    参考 wp 的 add_query_arg().
    timonwong
        11
    timonwong  
       2014-12-17 17:16:56 +08:00   ❤️ 1
    @hack2012
    完整的我已经给了
    hack2012
        12
    hack2012  
    OP
       2014-12-17 17:47:32 +08:00
    @timonwong 感谢兄弟提供的代码,但是中间的处理,我也不会做,哥能帮我写个完整的代码实现吗?
    mythhack
        13
    mythhack  
       2014-12-17 19:31:33 +08:00
    大概是 拆分?号 然后拆分=号 然后你就懂了
    robbielj
        14
    robbielj  
       2014-12-17 19:55:27 +08:00   ❤️ 1
    http://ideone.com/Jbfmst

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

    s1 = ['123']*5
    s2 = ['456']*5
    s3 = ['ooo']*5

    a = zip(payloads, s2, s3) + zip(s1, payloads, s3) + zip(s1, s2, payloads)

    for item in a:
    x, y, z = item
    print ("http://www.waitalone.cn/index.php?id=%s&abc=%s&xxx=%s" %(x,y,z))
    ```

    数量不多,随便了,多了可以loop
    hack2012
        15
    hack2012  
    OP
       2014-12-17 22:15:03 +08:00
    谢谢楼上的兄弟!!
    hack2012
        16
    hack2012  
    OP
       2014-12-19 11:17:20 +08:00
    感谢楼上所有提供思路的兄弟们,目前已经得到了解决,最终代码如下!

    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
    hack2012
        17
    hack2012  
    OP
       2014-12-19 11:19:13 +08:00
    这里代码居然不能高亮显示,请大家在这里看吧。。

    http://www.waitalone.cn/replace-url-params.html
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   3339 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 12:09 · PVG 20:09 · LAX 05:09 · JFK 08:09
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.