Todoの編集画面や作成画面のメモ欄において,HTMLタグの中に"<b onmousemove='alert()'>"や<img src='htt' 'onerror=alert()'>"などの属性を埋め込むことができます。終了タグは、必要に応じてつけてください。
HTMLタグやMarkdownの便利機能のせい。
HTMLタグの使用を禁止すれば、ぱっと見は大丈夫に見えるかもしれないが、実際はMarkdownだけでもXSSは起こせる。 構文解析を行いスクリプトを検出するか、Markdownの使用は諦めてください。
SQLインジェクションとは、Webアプリケーションにおいて、不正なSQL文を実行させる攻撃のことです。クライアントから送られてきたデータをそのままSQL文に埋め込んでしまうと、SQL文を改竄されてしまう可能性があります。
Todoリスト一覧画面においては公開可能と設定されたTodoリストのみが表示されるようになっています。しかし、検索欄に' OR 'a'='a
と入力すると、全てのTodoリストが表示されます。
該当の検索欄に入力された文字列をそのままSQL文に埋め込んでいるためです。
Railsのコードは以下のようになっています。
@todos = Todo.where("public=true AND title='#{params[:todo]}'")
これにより以下のようなSQL文が実行されることになります。
SELECT "todos".* FROM "todos" WHERE (public=true AND title='検索文字列')
そのため検索文字列に' OR 'a'='a
を入力すると、SQL文が
SELECT "todos".* FROM "todos" (public=true AND title='' OR 'a'='a')
となり、全てのTodoリストが表示されてしまいます。
Railsでは、SQL文に埋め込む文字列を?
で指定することで、SQLインジェクションを防ぐことができます。
@todos = Todo.where("public=true AND title = ?", params[:todo])
この記述方法では内部で文字列がサニタイズされて'
が''
に置き換わり攻撃を防ぐことができます。