セキュリティー対策、あれこれ
2008年2月3日
先の記事もそうであるが、セキュリティー対策のためのコードをいくつか追加したので、改めてメモ。
1)SQLインジェクション対策
sql::query()メソッドで、簡易プリペアードステートメントを使う。MySQL5やPostgreSQLほど本格的なプリペアードステートメントではないが、この方法でほぼ100%、SQLインジェクションは防げる。SQLステートメントでフィールド部分を入力値にしたがって変更したい場合は、core::fill()メソッドを用いて正規表現でホワイトリスト形式で入力値をチェックしながら値を挿入する。
2)XSS対策
core::echohtml()メソッドで、プリペアードステートメント様の機能が使える。正規表現で入力値をチェックすることも可能。
3)リモートスクリプトインクルード対策
クラス名を適切に選んでおけば、PHPファイルのインクルードはコアが自動的に行ってくれる。include, require などのステートメントを使うことはほとんどないはず。
4)ディレクトリトラバーサル対策
file_exists()の代わりに、core::checkFile()メソッドを使用する(下のコードを参照)。
5)ヌルバイト攻撃対策
リクエストにヌルバイトがあると、コア呼び出し時に自動的に停止する(先の記事のコードを参照)。
coreクラス
1)SQLインジェクション対策
sql::query()メソッドで、簡易プリペアードステートメントを使う。MySQL5やPostgreSQLほど本格的なプリペアードステートメントではないが、この方法でほぼ100%、SQLインジェクションは防げる。SQLステートメントでフィールド部分を入力値にしたがって変更したい場合は、core::fill()メソッドを用いて正規表現でホワイトリスト形式で入力値をチェックしながら値を挿入する。
2)XSS対策
core::echohtml()メソッドで、プリペアードステートメント様の機能が使える。正規表現で入力値をチェックすることも可能。
3)リモートスクリプトインクルード対策
クラス名を適切に選んでおけば、PHPファイルのインクルードはコアが自動的に行ってくれる。include, require などのステートメントを使うことはほとんどないはず。
4)ディレクトリトラバーサル対策
file_exists()の代わりに、core::checkFile()メソッドを使用する(下のコードを参照)。
5)ヌルバイト攻撃対策
リクエストにヌルバイトがあると、コア呼び出し時に自動的に停止する(先の記事のコードを参照)。
coreクラス
static public function checkFile($dir,$file){ if (strpos($fullpath=realpath($dir.$file),realpath($dir))===0) return file_exists($fullpath); exit('Are you trying the directory traversal?'); }