pasasの日記: エスケープとセキュリティホール
日記 by
pasas
重要な処理を行う前に、その処理に渡す変数をエスケープしていない例をよくみかける。
以下、PHP を使った例。
(当然、どの言語でも共通のネタ。ユーザが入力する例としてわかりやすいので PHP で解説。)
ユーザがフォームに入力した値を外部コマンドに渡してその結果を得るような場合に、以下のように書くとセキュリティホールになる。
<?
# $EMAIL - ユーザがフォームに入力したメールアドレス
#
$cmd = "/xxx/yyy/zzz/bin/registration ".$EMAIL;
if( ( $pp = popen( $cmd, "r")) == false ) {
die("popen()");
exit;
}
# 何かの処理をここでやる
pclose( $pp);
?>
このときユーザが入力フォームに "xxx@yyy.zzz.jp ; rm -rf ~/" なんて入力したら大変なことになる。
これは popen だけでなく system や、また SQL 文でも注意すべき問題だと思う。
というわけで、ユーザが入力可能な変数は万全を期すためにもすべての変数をエスケープするべきだと思う。
(PHP ではシェルコマンド用に escapeshellcmd() 関数があるし、DB 用には addslashes() 関数がある。)