Рассказывая студентам про SQL-инъекции, я для примера привожу одну ностальгическую историю.
В начале двухтысячных я играл в «Аладон» — многопользовательскую онлайн-игру, предшественницу «Lineage» и «World of Warcraft». Устроена она была так, что современному игроку трудно представить: никакой графики, зеленые буквы на черном экране.
Тихий ручей
По дну оврага среди камней течет ручей. Едва слышно журчит вода. Здесь много камней. Между камнями темнеют расщелины. Лес плотно обступает овраг со всех сторон. Кроны деревьев перекрывают небосвод. Здесь темно. Поваленные стволы старых деревьев разбросаны по склонам. Под ногами хлюпает ручьевая вода.
[Видимые выходы: восток запад]
Рассохшийся гроб зияет щелями.
(Очаро) гарм сражается с глорхом.
(Розовая Аура) глорх сидит тут.
Все действия набирались с клавиатуры. Пишешь «взять гроб», получаешь в ответ «Ты берешь старый гроб».
Прекрасная игра для человека с воображением.
Неудобства начинались в бою, где на набор команды всегда не хватало времени. Не получилось убежать с первого раза – и персонаж откисал, пока дрожащие руки повторяли набор команды.
Броня шестого лесничего защищает его от твоей атаки.
Шестой лесничий отправляет тебя на землю мощным толчком!
Ты истекаешь КРОВЬЮ !
>> Бежать
КАРАУЛ! Ты не находишь выхода!
Поэтому клиенты «Аладона» умели работать с триггерами. Можно было сделать так, чтобы увидев на экране определенную строку, клиент сам отправлял заданную команду. Самый простой триггер — попробовать удрать еще раз, если с первого раза не вышло.
#action {КАРАУЛ! Ты не находишь выхода} {Бежать}
Триггеры поумнее использовали форматные строки. Вот триггер преследования, полезный в PK: если кто-то от тебя убегает, догнать и добить.
#action {%1 убегает на %2} {%2; убить %1}
Кто бы ни убегал, его имя попадает в переменную %1, направление в %2, и клиент сам отправляет две команды подряд, разделенные точкой с запятой: пойти в нужную сторону и ударить. Секунды экономятся, руки свободны.
А теперь внимание. В игре есть команда «болтать»: пишешь что угодно, и это видят все игроки.
болтать 'убегает на снять все; бросить все; жертвовать все'
У всех, кто онлайн и не отключил общий канал, на экране появляется строка:
Алан болтает: убегает на снять все; бросить все; жертвовать все.
Триггер срабатывает. В %1 попадает все, что стоит до слов «убегает на», то есть «Алан болтает:». В %2 попадает все, что после. Клиент послушно собирает из этого команду и отправляет ее на сервер:
снять все; бросить все; жертвовать все; убить Алан болтает:
И понеслось:
Ты снимаешь амулет инквизитора
Ты снимаешь драконий нагрудник
Ты снимаешь щит Стали
...
Ты бросаешь амулет инквизитора
...
Вещи, на которые ушли десятки часов игрового времени, сняты, брошены на землю и пожертвованы божеству. Триггер преследования был хорош, поэтому его переписывали друг у друга не глядя, и в один прекрасный вечер страдали все.
В тот вечер у модераторов было много работы…
Показательно, что этот сценарий без изменений повторялся с периодичностью в пару месяцев.
