如何替换 url 中的参数值? - 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

如何替换 url 中的参数值?

  •  
  •   hack2012 Dec 17, 2014 7735 views
    This topic created in 4164 days ago, the information mentioned may be changed or developed.
    大家好,我是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 replies    2014-12-19 11:19:13 +08:00
    Delbert
        1
    Delbert  
       Dec 17, 2014
    先用=进行split,
    之后对每个元素用&进行split,
    替换掉[0],
    依次循环呗。
    kmvan
        2
    kmvan  
       Dec 17, 2014
    py 这么麻烦,果然 php 才是最好的语言
    timonwong
        3
    timonwong  
       Dec 17, 2014
    bits = list(urlparse.urlparse(url))
    qs = urlpare.parse_qs(bits[4]) # 注意value是一个list
    # 修改qs,略
    bits[4] = urllib.urlencode(qs, True)
    url = urlparse.urlunparse(bits)
    realityone
        4
    realityone  
       Dec 17, 2014 via iPhone
    也可以对&来split,然后再对=split
    替换掉之后join回来

    这些参数有点奇怪啊…
    jarlyyn
        5
    jarlyyn  
       Dec 17, 2014
    感觉你是需要克隆一个字典
    hack2012
        7
    hack2012  
    OP
       Dec 17, 2014
    有人能写出一个完整的代码吗?
    hack2012
        8
    hack2012  
    OP
       Dec 17, 2014
    @kmvan 哥,你用php折腾一个出来也可以的呀,我好参考改成python版的。
    kingxsp
        9
    kingxsp  
       Dec 17, 2014
    purl 库应该是你需要的
    kmvan
        10
    kmvan  
       Dec 17, 2014 via Android
    @hack2012 哥,你用php折腾一个出来也可以的呀,我好参考改成python版的。
    参考 wp 的 add_query_arg().
    timonwong
        11
    timonwong  
       Dec 17, 2014   1
    @hack2012
    完整的我已经给了
    hack2012
        12
    hack2012  
    OP
       Dec 17, 2014
    @timonwong 感谢兄弟提供的代码,但是中间的处理,我也不会做,哥能帮我写个完整的代码实现吗?
    mythhack
        13
    mythhack  
       Dec 17, 2014
    大概是 拆分?号 然后拆分=号 然后你就懂了
    robbielj
        14
    robbielj  
       Dec 17, 2014   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
       Dec 17, 2014
    谢谢楼上的兄弟!!
    hack2012
        16
    hack2012  
    OP
       Dec 19, 2014
    感谢楼上所有提供思路的兄弟们,目前已经得到了解决,最终代码如下!

    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
       Dec 19, 2014
    这里代码居然不能高亮显示,请大家这里看吧。。

    http://www.waitalone.cn/replace-url-params.html
    About     Help     Advertise     Blog     API     FAQ     Solana     2788 Online   Highest 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 46ms UTC 15:40 PVG 23:40 LAX 08:40 JFK 11:40
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86