2013-04-02 3 views
0
import os 
def find_method(name): 
     i = 0 
     found_dic = { "$_GET":[], "$_POST":[], "include":[], "require":[], "mysql_query":[], "SELECT":[], "system":[], "exec":[], "passthru":[], "readfile":[], "fopen":[], "eval":[] } 

     for x in file(name, "r"): 
       i += 1 
       for key in found_dic: 
         if x.strip().find(key) != -1: 
           found_dic[key].append("LINE:"+str(i)+":" + x.strip()) 

     print "="*20, name, "="*20 
     for key in found_dic: 
       if found_dic[key]: 
         print " ", "-"*10, key, "-"*10 
         for r in found_dic[key]: 
           print " ",r 

def search(dirname): 
     flist = os.listdir(dirname) 
     for f in flist: 
       next = os.path.join(dirname, f) 
       if os.path.isdir(next): 
         search(next) 
       else: 
         doFileWork(next) 

def doFileWork(filename): 
     ext = os.path.splitext(filename)[-1] 
     #if ext == '.html': print filename 
     if ext == '.php': 
       # print "target:" + filename 
       find_method(filename) 
  1. как я могу печатать только результаты. его печатает все имя файла, хотя файл не имеет никакого результата. Я хочу сделать имя файла печати, если у него есть какой-либо результат в немPython: Печать результат только

  2. Речь идет о поиске слова, но оно показывает, что каждое слово включает в себя (например, для привязки), а также находит слово в предложении и печатает все предложения, которые я хочу найти только слово «включить», не включенное в предложение. это очень трудно объяснить .. я надеюсь понять .. srry

+3

Боюсь, я не понимаю. Примеры, вероятно, пройдут долгий путь. Переименование 'x',' i', 'r' и, возможно,' key' и 'found_dic' в нечто более читаемое, вероятно, будет иметь большое значение для облегчения путаницы для простых смертных, таких как я. – femtoRgon

+1

ты не дал нам свою полную программу. 'found_dic' никогда не определяется, и ни один из них не является' i'. – MattDMo

+0

также, пожалуйста, исправьте свой отступ - должно быть 4 пробела на отступ, без пробелов и вкладок – MattDMo

ответ

0

Я надеюсь, что это то, что вы просили:

for i, line in enumerate(file(name, "r")): 
    found = False 
    for key in found_dic: 
     if key in line.strip(): 
      found_dic[key].append("LINE:"+str(i)+":" + key) 
      found = True 

    if found: 
     print "="*20, name, "="*20 
     for key in found_dic: 
      if found_dic[key]: 
       print " ", "-"*10, key, "-"*10 
       for r in found_dic[key]: 
        print " ",r 

Вы должны проверить, если вы нашли что-то, если вы хотите напечатать имя, когда вы действительно что-то нашли. Кроме того, вы объединяете только ключ в строке 5, потому что ключ - это то, что вы ищете. И вы только хотите добавить то, что ищете.

Дальнейшие изменения: Я использовал функцию перечисления в строке i, ее намного проще и удобнее читать, чем увеличивать ваш собственный i.

Я также изменил условие в строке 10. Использование в ключевое слово здесь является более простым и читаемым способом ...

+0

thx для того, чтобы помогать мне, но там есть некоторые проблемы с этим, например, это пример моего инструмента ====/var/www/html/zboard/zboard.php ==================== ---------- exec ---------- LINE: 288: $ a_setup = ""; else $ a_setup = "

0

Похоже, что может быть проблема с отступом первой команды печати, вы печатают «имя», но оно находится за пределами цикла for.

Попробуйте заселять свой словарь, а затем печать словаря, вдоль линий:

with open(your_file) as f: 
    found_dic = {} 
    key = 'your_key' 

    # populate the dictionary 
    found_dic[key] = [i for i in f if key in i and i not in found_dic] 

с этим в качестве отправной точки, мы надеемся, вы можете форматировать результат в словарь, как вам нужно. Только строки, содержащие «ключ», будут находиться в файле found_dic, поэтому вы сможете распечатать их в любом формате, который вам нравится.

Надеюсь, что это поможет

Смежные вопросы