素人開発者が戯言

そんな技術備忘録。カテゴリの偏りからすでに得た知識も書くかも。←そんなことはなかった

スポンサーサイト 

--/--/--
--. --:--

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

[edit]

| CM: -- | TB: --

page top

ちゃんとロックされるfile_get_contents | file 

2010/11/29
Mon. 00:47

前回の記事、file_put_contentsの罠にて標準関数の脆弱性について触れましたが、読み込みを行う場合にもロックは必要です。
例によってfile_get_contents等の関数はロックしてくれません。

そんなわけで、以下は安全安心なfile_get_contents関数およびfile関数です。
file関数の方はFILE_SKIP_EMPTY_LINESとFILE_IGNORE_NEW_LINESの二点のフラグに対応しています。


function _file_get_contents($fname) {
if ($fp = fopen($fname, 'c')) {
flock($fp, LOCK_EX);
$buf = '';
while ($get = fgets($fp, 1024)) $buf .= $get;
fclose($fp);
return $buf;
} else {
return false;
}
}

function _file($fname) {
$buf = array();
$flg = func_get_args(1);
$f_FSEL = $flg & FILE_SKIP_EMPTY_LINES;
$f_FINL = $flg & FILE_IGNORE_NEW_LINES;
if ($fp = fopen($fname, 'r')) {
flock($fp, LOCK_EX);
while ($get = fgets($fp, 1024)) {
if ($f_FSEL) {
if (trim($get) == '') continue;
}
$buf[] = ($f_FINL) ? trim($get) : $get;
}
fclose($fp);
return $buf;
} else {
return false;
}
}
スポンサーサイト

[edit]

| CM: 1 | TB: 0

page top

この記事に対するコメント

気づいた事を2点ほど。

・_file_get_contents()で使用しているfopen()は、'c'モードではなく'r'モードでオープン。

・PHP5.3.2からはflock($fp, LOCK_UN);を明示しないといけません。

通りすがり #- | URL | 2011/11/08 12:22 * edit *

page top

コメントの投稿

Secret

page top

トラックバック

トラックバックURL
→http://ntter0.blog76.fc2.com/tb.php/14-2e5ae1b8
この記事にトラックバックする(FC2ブログユーザー)

page top

2015-12

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。