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

プログラミング言語「Python」に関するカテゴリーです。

PILを使わないでpngファイルの作成

Pythonを使って画像ファイルを扱いたい場合、PILかPillowを使うのがほとんどだと思いますが、レンタルサーバーなど、ライブラリを自由にインストールできない環境で使えなくて困ることが稀にあります。

そういう場合に便利なのがPyPNGというライブラリです。

GitHub – drj11/pypng: Pure Python library for PNG image encoding/decoding
https://github.com/drj11/pypng

pure Pythonで書かれていて、他のライブラリにも依存していないのでファイル1個をコピーするだけで使えます。

pngファイルの作成

>>> import png
>>> width, height = 21, 7
>>> writer = png.Writer(width, height, greyscale=True, bitdepth=1)
>>> f = open('abc.png', 'wb')
>>> writer.write(f, [
... '001110001111000011100',
... '010001001000100100010',
... '010001001000100100000',
... '011111001111000100000',
... '010001001000100100000',
... '010001001000100100010',
... '010001001111000011100' ])
>>> f.close()

作成したファイル

abc.png

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

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