問題:以下のコードはセキュリティ上大きな問題となる脆弱な処理が含まれています。セキュリティ上のベストプラクティス、他の自動ログインの実装方法と比較し、以下のコードの脆弱性を詳しく述べよ。
if (serendipity_authenticate_author(
$serendipity['POST']['user'],
$serendipity['POST']['pass'], false, $use_external)) {
if (empty($serendipity['POST']['auto'])) {
serendipity_deleteCookie('author_information');
return false;
} else {
$package = serialize(
array('username' =>
$serendipity['POST']['user'],
'password' =>
$serendipity['POST']['pass']));
serendipity_setCookie('author_information',
base64_encode($package));
return true;
}
// Now try login via COOKIE data
}
解答:次のブログエントリで解説します。(解説の必要は無いかもしれませんが)
備考:実際のブログアプリケーションのコードの一部です。このブログ(b2evolution)のログインコードも問題がありますが上記コードよりはましです。
追記:serendipity_setCookieがどのように定義されているかが分からないと正確に答えられないので張り付けます。このブログアプリケーションの開発元には適切な自動ログインの実装方法と共にレポートする予定です。
/**
* Set a Cookie via HTTP calls, and update $_COOKIE plus $serendipity['COOKIE'] array.
*
* @access public
* @param string The name of the cookie variable
* @param string The contents of the cookie variable
* @return null
*/
function serendipity_setCookie($name,$value) {
global $serendipity;
setcookie("serendipity[$name]", $value,
time()+60*60*24*30,
$serendipity['serendipityHTTPPath']);
$_COOKIE[$name] = $value;
$serendipity['COOKIE'][$name] = $value;
}