Skip to content

Latest commit

 

History

History
45 lines (35 loc) · 2.22 KB

Answer.md

File metadata and controls

45 lines (35 loc) · 2.22 KB

脆弱性一覧

XSS

具体例

Todoの編集画面や作成画面のメモ欄において,HTMLタグの中に"<b onmousemove='alert()'>"や<img src='htt' 'onerror=alert()'>"などの属性を埋め込むことができます。終了タグは、必要に応じてつけてください。

原因

HTMLタグMarkdownの便利機能のせい。

対策

HTMLタグの使用を禁止すれば、ぱっと見は大丈夫に見えるかもしれないが、実際はMarkdownだけでもXSSは起こせる。 構文解析を行いスクリプトを検出するか、Markdownの使用は諦めてください。

SQLインジェクション

概要

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])

この記述方法では内部で文字列がサニタイズされて'''に置き換わり攻撃を防ぐことができます。