Проверка как URI - хорошее начало. После этого проверьте, что scheme
является опцией, указанной в белом списке, например http
/ https
. После этого убедитесь, что вы его кодируете перед его выходом (см. Ссылку OWASP). В основном, вы делаете именно то, что вы делаете для любой кодировки атрибутов html, за исключением того, что вам также нужно знать о вредоносных программах.
Замечания: javascript:alert(1);
(схема проверки), https://example.com?xss=" onclick=alert(1);//
(выход выхода).
См.:
Что касается второй части вашего вопроса, как только пользователь нажимает на ссылку и идет на новый сайт, это уже не XSS на вашем сайте. Предоставление пользователям возможности добавления любого URL-адреса может быть опасным, даже если это не уязвимость XSS. Они могут по-прежнему ссылаться на вредоносные сайты, незаконный контент и т. Д. Для них вы можете утверждать, что API репутации сайта , такой как Google, предоставляет , но даже это не является пуленепробиваемым.
Ваша логика сбита с толку, почему вы выполняете итерацию по списку удаления, 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
, содержащего повторяющиеся значения.
Если 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]
Вам нужно будет один раз просмотреть список дел:
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]
Ну, это решение было бы намного приятнее, если бы был способ вернуть список, меньший, чем первое вхождение данного элемента.
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)]
Но это становится смешным.
Полагаю, я оставлю свой ответ как доказательство того, что один вариант - плохая идея для этой проблемы.