2017-06-02 45 views
-1

我試圖在一個字典的鑰匙替換一個SQL查詢字符串的字符OR NOT "[low_level_rand_num]"="[rand_num]"在一個字符串替換項目在字典匹配的密鑰是

replacements = { 
    '"[low_level_rand_num]"': str(random.randint(1, 13)), 
    '"[rand_num]"': str(random.randint(13, 26)), 
    '"[comment]"': random.choice(["--", "/*", "#", "*/", "'", '"', "`", "-"]), 
    '"[rand_string]"': "asdf", 
    '"[query]"': "test_col", 
    '"[big_int_1]"': str(random.randint(10000000000, 99999999999)), 
    '"[big_int_2]"': str(random.randint(10000000000, 99999999999)), 
    '"[encoding]"': random.choice(["utf8", "utf16", "utf32", "ascii"]), 
    '"[sleeper]"': str(random.randint(3, 9)) 
} 

使用string.replace()功能,像這樣:

def build_payloads(template): 
    replacements = { 
     '"[low_level_rand_num]"': str(random.randint(1, 13)), 
     '"[rand_num]"': str(random.randint(13, 26)), 
     '"[comment]"': random.choice(["--", "/*", "#", "*/", "'", '"', "`", "-"]), 
     '"[rand_string]"': rand_string_gen(), 
     '"[query]"': random_column(), 
     '"[big_int_1]"': str(random.randint(10000000000, 99999999999)), 
     '"[big_int_2]"': str(random.randint(10000000000, 99999999999)), 
     '"[encoding]"': random.choice(["utf8", "utf16", "utf32", "ascii"]), 
     '"[sleeper]"': str(random.randint(3, 9)) 
    } 
    for k in replacements.keys(): 
     if k in template: 
      print template.replace(k, replacements[k]) 

然而,每次我運行這個功能,我得到的輸出:

OR NOT 7="[rand_num]" 
OR NOT "[low_level_rand_num]"=21 

看來,它取代了字符串,但它並沒有讓它們被替換,我在做什麼錯誤的地方,字符串不會被替換,我該如何解決這個問題,並得到我的預期輸出OR NOT 7=21

+1

[''str.replace''](https://docs.python.org/3.5/library/stdtypes.html#str.replace) - >''返回字符串的副本與所有子字符串old的替換被new替換。「您將需要用str.replace的結果替換字符串 –

回答

0

字符串替換不是就地完成,更換後更新模板:

... 
for k in replacements: 
    if k in template: 
     template = template.replace(k, replacements[k]) 
     print template 

作爲一個側面說明,在字典鍵迭代時,你可以刪除.keys呼叫作爲迭代的字典將直接貫穿其鑰匙。

0

您只是輸出替換的結果,template本身不會改變。

template = "foo" 
print template.replace("foo","bar") #outputs 'bar' 
print template #outputs 'foo' 
template = template.replace("foo","bar") 
print template #outputs 'bar' 
相關問題