2012-01-11 7 views
0

私はRuby on Rails 3.1.0を使用しています。データベース。"悪意のある"ユーザ入力をレールアプリケーションに拒否する一般的な方法があります

たとえば、URLを格納するデータベーステーブルの列があります。検証(長さチェックのみ)を受けたユーザーはhttp://<script>alert('hello!');</script>のようなURLを送信できます。 私は上記のようなリンクを保存することを許可しないと思います...どのように私はそれを行うことができますか?

+1

入力検証です。長さチェック以上のものを含めるように検証を拡張してください。これはデータベースとは関係ありません。後で出力に格納された値を使用するときには、出力エンコーディングを実行する必要があることに注意してください。 https://www.owasp.org/index.php/XSS_(Cross_Site_Scripting)_Prevention_Cheat_Sheet – Cheekysoft

答えて

3

行うには、適切なものが想定さURLを解析し、各コンポーネントをチェックするためにURIを使用している:これを停止する必要がある場合

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

@Sergio:私は真の怠惰を採用するように解析するのが嫌い、他の誰かが私のためにそれをするようにしてください、それは超効果的です。 –

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

関連する問題