2012-01-11 1 views
0

Я использую Ruby on Rails 3.1.0, и я хотел бы знать, что является обычной практикой, чтобы предотвратить хранение «вредоносных» значений в база данных.Существует обычная практика отклонения «вредоносного» пользователя от приложения rails

Например, у меня есть столбец таблицы базы данных, чтобы хранить URL-адреса. Пользователь, проходящий проверку (просто проверка длины), может отправить URL-адрес, например http://<script>alert('hello!');</script>. Я не хотел бы хранить ссылки, как указано выше ...как я могу это сделать?

+1

ввода-валидация является, где это необходимо, чтобы остановить; расширьте свою проверку, чтобы включить проверку длины. Это не связано с базами данных. Помните, что вам также потребуется выполнить кодирование вывода, когда позже используйте сохраненные значения в вашем выходе. См. Https://www.owasp.org/index.php/XSS_(Cross_Site_Scripting)_Prevention_Cheat_Sheet – Cheekysoft

ответ

3

Правильная вещь, чтобы сделать, это использовать URI для анализа предполагаемого URL, а затем проверить каждый компонент:

validate :url_check 

def url_check 
    u = URI.parse(self.url) 
    # check u.scheme, u.userinfo, etc. and call errors.add(:url, '...') 
    # if something is invalid. 
rescue URI::InvalidURIError 
    errors.add(:url, 'You are being naughty.') 
end 
+0

Теперь это правильный ответ :-) –

+0

@ Серхио: Я ненавижу парсинг, поэтому я использую True Lazy, и пусть кто-то другой делает это для меня, это суперэффективно. –

1

Хотя эти ссылки находятся в базе данных, они не навредят. Проблемы могут возникать при попытке их рендерить. Rails отлично справляется с тем, чтобы избежать большинства вещей, которые вы выводили (я не осмелился сказать «все», потому что я точно не знаю).

Вы можете быть очень уверены и избежать строковых себя:

CGI.escape your_link_url 

Ссылка: CGI.escape

+0

У меня возникают проблемы при их рендеринге: 'URI :: InvalidURIError'. – user502052

+0

@ user502052: когда вы делаете их экранированными или как есть? –

+0

Я представляю "как есть". – user502052

0

Вы можете использовать регулярное выражение для проверки, что это действительный URL без '<', '>' URL. И HTML кодирует его там, где он применяется.

+0

Что вы подразумеваете под «И HTML кодируют его там, где он применяется»? – user502052

+0

Если вы показываете ссылку на пользователя, вам нужно закодировать HTML, чтобы сценарий не был выполнен. – ysrb

+0

Я хотел бы решить основную проблему, избегая хранения «вредоносных» ссылок. – user502052

Смежные вопросы