私はRuby on Rails 3.1.0を使用しています。データベース。"悪意のある"ユーザ入力をレールアプリケーションに拒否する一般的な方法があります
たとえば、URLを格納するデータベーステーブルの列があります。検証(長さチェックのみ)を受けたユーザーはhttp://<script>alert('hello!');</script>
のようなURLを送信できます。 私は上記のようなリンクを保存することを許可しないと思います...どのように私はそれを行うことができますか?
私はRuby on Rails 3.1.0を使用しています。データベース。"悪意のある"ユーザ入力をレールアプリケーションに拒否する一般的な方法があります
たとえば、URLを格納するデータベーステーブルの列があります。検証(長さチェックのみ)を受けたユーザーはhttp://<script>alert('hello!');</script>
のようなURLを送信できます。 私は上記のようなリンクを保存することを許可しないと思います...どのように私はそれを行うことができますか?
行うには、適切なものが想定さ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
これは正解です:-) –
@Sergio:私は真の怠惰を採用するように解析するのが嫌い、他の誰かが私のためにそれをするようにしてください、それは超効果的です。 –
これらのリンクはデータベースにありますが、害はありません。問題をレンダリングしようとすると、問題が発生することがあります。 Railsは、あなたが出力するほとんどのものをエスケープするのに良い仕事をします(私は確かにわからないので "すべて"と言うことを敢えてしませんでした)。
あなたは余分なことを確認し、文字列を自分で脱出することができます
CGI.escape your_link_url
はリンク:CGI.escape
私はそれらをレンダリングするときに問題があります: 'URI :: InvalidURIError'。 – user502052
@ user502052:それらをエスケープするか、そのままレンダリングするか? –
私は "そのまま"レンダリングします。 – user502052
あなたはそれが< '、 '>' URLずに有効なURLです検証するために正規表現を使用することができます。 HTMLはそれが適用される場所でエンコードします。
"そして、それが適用される場所でHTMLエンコードする"とはどういう意味ですか? – user502052
ユーザーへのリンクを表示している場合は、スクリプトが実行されないようにHTMLエンコードする必要があります。 – ysrb
「悪意のある」リンクを保存しないようにすることで、根本的な問題を解決したいと考えています。 – user502052
入力検証です。長さチェック以上のものを含めるように検証を拡張してください。これはデータベースとは関係ありません。後で出力に格納された値を使用するときには、出力エンコーディングを実行する必要があることに注意してください。 https://www.owasp.org/index.php/XSS_(Cross_Site_Scripting)_Prevention_Cheat_Sheet – Cheekysoft