Programming」カテゴリーアーカイブ

プログラミング全般に関するカテゴリーです。

SQLインジェクション

システムで想定外のSQLコマンドを実行する攻撃手法

例えば、変数whereに適切な条件が設定されることを想定して

statement = "SELECT * FROM table WHERE " + where + " ;"
db.execute(statement)

のようなスクリプトを作ったとします。

ここで、where

where = "name; DROP TABLE table;"

のような値が入っていた場合に、次のようなコマンドが実行されることになり、セキュリティ上のリスクとなるようです。

SELECT * FROM table WHERE name;
DROP TABLE table;

この手法は、入力(今の場合は変数where)を適切にエスケープすることで回避可能なようです。

Python

PythonでSQLiteを使う場合は、文字列操作でSQLコマンドを作らないで、次のようにした方が良いそうです。

db.execute("SELECT * FROM table WHERE name=?", (name,))

Python製CGIのデバッグ

ローカルPCでの開発中は逐一エラーを確認しながらデバッグできますが、サーバーにアップロードしてしまうと、デバッグが大変になってしまいます。

そういう時は、cgitbで簡単にデバッグできます。

#!/usr/bin/env python

import cgitb
cgitb.enable()

# 以下、実行したいスクリプト
raise Exception('error')

こんな感じにしておけば、エラーが発生した場所や内容が確認できるようになります。

ロリポップでweb.pyが使えなくなった

ロリポップのサーバーを新サーバーに移行したら、Pythonのフレームワーク「web.py」が使えなくなってしまいました。

WEBサーバー移設メンテナンスのお知らせ – 2016年01月15日 12時00分 / メンテナンス情報 / お知らせ – レンタルサーバーならロリポップ!
https://lolipop.jp/info/mainte/5189/

原因はよく分かりませんがmime.typesでPermission deniedとなるようです。

Permission denied: '/etc/mime.types'

ということで、システムを少し変更してみました。

web.pyはPython3で使えないため、システムを移行させる良い機会だったと考えることにしたいと思います。


実は、このエラーには経験があって、xreaのサーバーが更新された際にもweb.pyでエラーになり、web.pyの利用を断念したことがあります。GMO系列のサーバーということで、同じ理由なのかなと想像します。(さくらインターネットでは問題なく使えています。)