Webセキュリティ対策

2608 ワード

日常のWeb開発で発生するいくつかのセキュリティ問題を簡単にまとめ、Flaskフレームワークを例に挙げます.
インジェクション攻撃
注入攻撃は主にシステムコマンド注入、SQL注入、NoSQL注入、ORM注入などが含まれています.ここではSQL注入について簡単に紹介します.
攻撃の原理
SQL文を作成する際に、ユーザーから直接入力された入力をパラメータとして文字列をつなぎ合わせてSQLクエリに挿入すると、攻撃者はSQL文を利用してデータベースの情報を改ざんし、盗むことができます.
攻撃の例
@app.route('/student')
def get_table():
    password = request.args.get('password')
    cur = db.execute('SELECT * FROM students WHERE password='%s;'
                        % password)
    results = cur.fetchall()
    return results

攻撃者が入力した値が「or 1=1--」の場合、studentsテーブルのすべてのデータが返されることを意味します.または「;drop table users;--」と入力するとstudentsテーブルのすべてのデータが削除されます.
主な防犯方法
  • ORM
  • を使用
  • 検証入力タイプ
  • エスケープ特殊文字
  • XSS攻撃
    XSS(Cross-Site Scripting)は、クロスステーションスクリプト攻撃であり、CSS積層スタイルシートとネーミング競合を回避するためにXでCross(クロス)を表す
    攻撃の原理
    XSSは実は注入攻撃の一種であり,被攻撃者のウェブサイトにコードを注入することで,ユーザがアクセスすると注入された悪意のあるスクリプトを実行する.このうち,XSS攻撃は主に反射型XSS攻撃と記憶型XSS攻撃の2種類に分けられる.
    攻撃例
    反射型XSS攻撃
    反射型XSSは非永続型XSSとも呼ばれ、あるサイトにXSSの脆弱性がある場合、URLから悪意のあるスクリプトを注入することができ、ユーザーがこのURLにアクセスすると攻撃スクリプトを実行する.
    @app.route('hello')
    def hello():
        name = request.args.get('name')
        response = '

    Hello, %s

    ' % name return response

    ユーザーがjavascriptコードを入力し、http://example.com/hello/alert('hahah');にアクセスすると、クライアントが応答を紹介すると、ブラウザはこのコードを実行します.もちろん、このサンプルコードは脅威になりませんが、これは任意のjsコードを実行することができ、攻撃者が何をするかを知っていることを意味します.
    ストレージ型XSS攻撃
    ストレージ型XSSは永続型XSSとも呼ばれ、反射型XSSと同様の動作をするが、インプラントされた悪意のあるコードをデータベースに格納し、メッセージエリアにリダイレクトコードを書き込むなど、ユーザーがメッセージエリアページにアクセスする際に悪意のあるサイトにリダイレクトされる.
    防犯措置
  • HTMLエスケープ
  • 認証ユーザ入力
  • CSRF攻撃
    CSRF(Cross Site Request Forgery)とは、ドメイン間で偽造を要求することを指し、近年一般に知られつつある攻撃方式である.
    攻撃の原理
    攻撃者は,ユーザがブラウザに保存した認証情報を利用して,対応するサイトに偽造要求を送信する.ユーザーがAサイトにログインした場合、認証情報はクッキーに保存され、ユーザーが悪意のあるサイトBにアクセスした場合、攻撃者はBサイトを通じて偽造の要求をAサイトサーバーに提出し、Aサイトが自分のサイトからの要求だと勘違いし、攻撃者に一部の情報の改ざんに成功させることができる.
    攻撃例
    サーバ側がユーザーアカウントを削除するビュー操作が
    @app.route('/account/delete')
    def delete_account():
        if not current_user.authenticated:
            abort(401)
        current_user.delete()
        return 'deleted!'

    ユーザがログインすると、https://example.com/account/deleteにアクセスするとアカウントが削除され、攻撃者のウェブサイト上で画像を表示するimgを作成すると、その中のsrcの属性が削除アカウントのURLを加え、ユーザがBサイトにアクセスすると、ブラウザ解析ページが自動的にそのリンクに要求を送信し、このときあなたのログイン情報はブラウザのクッキーに保存されるので、Bサイトにアクセスするだけでアカウントが削除されます.
    防犯措置
  • HTTPメソッド
  • を正しく使用する.
  • CSRFトークン有効
  • ここで、CSRFトークンは比較的一般的な方法であり、具体的には、フォームのコミットに擬似乱数、すなわちCSRFトークン(token)を追加する方法であり、ここでは詳細に説明しない.