вложенные циклы для удаления элементов в списке

Проверка как URI - хорошее начало. После этого проверьте, что scheme является опцией, указанной в белом списке, например http / https. После этого убедитесь, что вы его кодируете перед его выходом (см. Ссылку OWASP). В основном, вы делаете именно то, что вы делаете для любой кодировки атрибутов html, за исключением того, что вам также нужно знать о вредоносных программах.

Замечания: javascript:alert(1); (схема проверки), https://example.com?xss=" onclick=alert(1);// (выход выхода).

См.:

Что касается второй части вашего вопроса, как только пользователь нажимает на ссылку и идет на новый сайт, это уже не XSS на вашем сайте. Предоставление пользователям возможности добавления любого URL-адреса может быть опасным, даже если это не уязвимость XSS. Они могут по-прежнему ссылаться на вредоносные сайты, незаконный контент и т. Д. Для них вы можете утверждать, что API репутации сайта , такой как Google, предоставляет , но даже это не является пуленепробиваемым.

-1
задан Pikachu the Purple Wizard 19 January 2019 в 00:45
поделиться

4 ответа

Ваша логика сбита с толку, почему вы выполняете итерацию по списку удаления, del1, а затем внутри итерации по s (или l).

Это не имеет смысла.

Вместо этого просто удалите элементы из del1, как вы идете.

l = [1,5,10,5,10]
del1 = [5,10]
a = []
for element in l:
   if element in del1:
       del1.remove(element)
   else:
       a.append(element)

давая a как [1, 5, 10].


Более эффективный способ - использовать объект collections.Counter.

import collections
l = [1,5,10,5,10]
del1 = [5,10]
a = []
dels_to_go = collections.Counter(del1)
for element in l:
    if dels_to_go[element]:
        dels_to_go[element] -= 1
    else:
        a.append(element)

, который дает тот же вывод, что и раньше.


Обратите внимание, у вас может возникнуть желание использовать set(), но это не сработает в случае del1, содержащего повторяющиеся значения.

0
ответ дан Joe Iddon 19 January 2019 в 00:45
поделиться

Если del1 не содержит дубликатов, вы можете сделать del1 набором для более эффективных поисков, избегать добавления элементов в l - a, если элемент находится в наборе, и удалить элемент из набор, как только он был обнаружен:

del1 = set(del1)
a = []
for i in l:
    if i in del1:
        del1.remove(i)
        continue
    a.append(i)

a становится:

[1, 5, 10]
0
ответ дан blhsing 19 January 2019 в 00:45
поделиться

Вам нужно будет один раз просмотреть список дел:

lst= [1,5,10,5,10]
del1=[5,10]
res = lst[:]

for elem in del1:
    try:
        res.remove(elem)
    except ValueError:
        pass
res

Выход: [1, 5, 10]

0
ответ дан PMende 19 January 2019 в 00:45
поделиться

Ну, это решение было бы намного приятнее, если бы был способ вернуть список, меньший, чем первое вхождение данного элемента.

def remove1(lst, elem):
  lst.remove(elem)
  return lst

cpy = lst[:]
res = [x for x in lst if x not in del1 or x in remove1(cpy, x)]

Но это не будет работать, если в del1 есть повторяющиеся записи. Это будет работать,

res = [x for x in lst if x not in dlt or x in remove1(cpy, x) and x not in remove1(dlt, x)]

Но это становится смешным.

Полагаю, я оставлю свой ответ как доказательство того, что один вариант - плохая идея для этой проблемы.

0
ответ дан okovko 19 January 2019 в 00:45
поделиться
Другие вопросы по тегам:

Похожие вопросы: