Могут ли злонамеренные пользователи изменять viewstate?
Если ViewStatemac включен в приложении ASP.NET, может ли пользователь изменить содержимое ViewState и успешно передать его обратно на сервер?
У меня есть приложение (написанное кем-то другим), использующее то, что есть во ViewState, для создания не параметризованного ORDER BY
предложение в запросе SQL. Должен ли я беспокоиться о внедрении SQL?
2 ответа
Если ViewStateMAC включен, злоумышленник должен иметь возможность взломать "машинный ключ", чтобы изменить ViewState, поэтому он должен быть достаточно безопасным, если это значение остается закрытым.
Значение установлено в коде позади (например, ViewState["OrderBy"]
) а не через контроль? Если это так, это не подлежит проверке событий.
Да, вы можете изменить состояние представления и опубликовать его, просто скопировав страницу, вставив ее на локальный сайт в виде HTML, и измените ее.
Однако при повторной публикации проверка не будет выполнена и не будет принята asp.net, если у вас открыто свойство EventValidation - оно открыто по умолчанию.
asp.net сохраняет хеш-файл для каждого элемента управления и каждого события на странице этого свойства и проверяет его при обратной передаче. Если это не удастся, то это не продолжение. Если у вас есть это близко, то он может делать то, что вы говорите.
Посмотрите эту простую HTML-форму:
<form name="input" action="someaction.asp" method="post">
<select name="sel">
<option value="1" >Milk</option>
<option value="2" >Coffee</option>
<option value="3" >Tea</option>
</select>
<input type="submit" value="Submit">
</form>
любой может изменить <option value="1" >Milk</option>
в <option value="1 OR 1=1" >Milk</option>
и отправьте его обратно, как есть, так что вам нужно добавить хеш-код перед его рендерингом и опубликовать его вместе с остальными, и проверить, что значения совпадают (вернуть тот же хеш).
Некоторые сайты и кодировщики выбирают для шифрования каждое значение в обратной записи, если вы, например, видите amazon, вы заметите такие строки:
<input name="offeringID.1" value="y3A0L7tSnS%2B7LBLvI....morehere" type="checkbox" id="fbt_x_check" style="display: none;" class="check" checked="checked">
И если вы используете собственный HTML-контроль, вам нужно добавить свою личную проверку значений, чтобы избежать изменения.
Разработчики asp.net решили создать общие хэш-значения для всех элементов управления и оставить их в EventValidation.
Так что оставьте EventValidation включенным, и модификация не удастся.