form でtextarea を使って得た値への改行コードの処理について

  • ページ: BugTrack2
  • 投稿者: 名無しさん
  • 優先順位: 低
  • 状態: 提案
  • カテゴリー: その他
  • 投稿日: 2007-11-12 (月) 21:15:27
  • バージョン:

メッセージ

外部から送られてきたデータに対する、改行コードの処理などの疑問点を挙げます


  • 1 -- 1? 2016-10-31 (月) 10:57:57

改行コードの処理を2重にしている

システム系の昔からあるedit やpcomment などは、$vars['msg'] を使っているので、init.php で"\r" を取り除いています。
しかし、一部のプラグインでは$vars['msg'] に対してもう一度"\r" を取り除こうとしています。

  • cvs:lib/init.php (1.54) での事前処理部分
    // 整形: msg, 改行を取り除く
    if (isset($vars['msg'])) {
    	$get['msg'] = $post['msg'] = $vars['msg'] = str_replace("\r", '', $vars['msg']);
    }

cvs:plugin/insert.inc.php (1.15)

function plugin_insert_action()
{
	global $script, $vars, $cols, $rows;
	global $_title_collided, $_msg_collided, $_title_updated;

	if (PKWK_READONLY) die_message('PKWK_READONLY prohibits editing');
	if (! isset($vars['msg']) || $vars['msg'] == '') return;

	$vars['msg'] = preg_replace('/' . "\r" . '/', '', $vars['msg']);

cvs:plugin/memo.inc.php (1.16)

function plugin_memo_action()
{
	global $script, $vars, $cols, $rows;
	global $_title_collided, $_msg_collided, $_title_updated;

	if (PKWK_READONLY) die_message('PKWK_READONLY prohibits editing');
	if (! isset($vars['msg']) || $vars['msg'] == '') return;

	$memo_body = preg_replace('/' . "\r" . '/', '', $vars['msg']);

  • 1 -- 1? 2016-10-31 (月) 10:57:47

改行コードの処理を行っていない物がある

$vars['msg'] 以外のものは、改行コードの処理そのものをしていない*1ので、フォームでtextarea を使っているbugtrack や、tracker は"\r" をそのままページに記録してしまう可能性がある*2
更新衝突時の差分作成に関しては、lib/diff.php で改行コードの処理をしているし、"\r" が記録されたとしても再編集して記録すれば消えてしまうので、今までは特に問題にはならなかったようだ。

  • 一部訂正とお詫びを。file_write() の中で、"\r" の置換えしているので、問題となるのはこれを使わずに記録した時などに限定できそうです。
    共通した処理方法の決まりが無いのが問題かもしれませんが。 -- 2007-11-13 (火) 19:27:17


改行コードの処理がなぜ「"\r" を消す」なのか

そもそも改行コードは、LF("\n") 、CR("\r") 、CR+LF("\r\n") の3種類あるのに、
外部からの入力に対しての改行コードの処理は"\r" を消すというものであり、改行コードがCR でフォームのデータが渡された時のことを考えていないのではないか、
と思ったのですが、フォームのデータをブラウザがどのような規格(OS 依存?ソフト依存?)で送るかを知らないので、的外れな疑問かもしれません。

  • 追記。1.3 系ではすべてに対応していたように見えます。
    cvs:Attic/init.php(1.3 系、Rev. 1.20.2.25) からの抜粋
    // 整形: msg
    if (isset($vars['msg']))  {
    	$get['msg'] = $post['msg'] = $vars['msg'] = preg_replace("/((\x0D\x0A)|(\x0D)|(\x0A))/", "\n", $vars["msg"]);
    }
    cvs:lib/init.php (1.4 系、Rev. 1.54) からの抜粋
    // 整形: msg, 改行を取り除く
    if (isset($vars['msg'])) {
    	$get['msg'] = $post['msg'] = $vars['msg'] = str_replace("\r", '', $vars['msg']);
    }
    この入力データの改行コードがらみの部分が理由で、1.3 系から1.4 系への移行を促す時に妨げにならないのか、
    などといった視点からも話を聞いてみたいと思ったので、書きました。 -- 2007-11-13 (火) 19:27:17

  • 1 -- 1? 2016-10-31 (月) 10:57:54


*1 input_filter() でしているstr_replace() を使った置換えは"\0" のみ
*2 paraedit を使っている人はedit の$vars['original'] も対象

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2016-10-31 (月) 10:57:58
Site admin: PukiWiki Development Team

PukiWiki 1.5.2+ © 2001-2019 PukiWiki Development Team. Powered by PHP 5.6.40-0+deb8u7. HTML convert time: 0.250 sec.

OSDN