書き込み時、bbs-main.phpでエラー #14
Labels
No Label
bug
discussion
documentation
duplicate
enhancement
feature
help wanted
invalid
Priority
High
Priority
Low
Priority
Medium
question
wontfix
No Milestone
No project
No Assignees
9 Participants
Notifications
Due Date
No due date set.
Dependencies
No dependencies set.
Reference: stat2/delightly-v2fork#14
Loading…
Reference in New Issue
No description provided.
Delete Branch "%!s(<nil>)"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
オフショアで、以下のような書き込み時エラーが出ているようです
$LTLがnullになっているようです
該当箇所のリンク貼っておきますね
9bc45bc4d2/test/bbs-main.php (L978)
文字化けしててわかりませんが、
というスレタイのスレが原因のようです
エンコード周りでエラーが出ているのかもしれませんね
https://www.php.net/manual/ja/function.json-decode.php
とあるので、jsonのデコードに失敗しているのが原因だと思いますが...
はるひさんから「たぶん改行コードが悪さをしている」とあったのですが、おそらくJSON_UNESCAPED_UNICODEでjsonをエンコードしているので、改行コードがそのまま突っ込まれているのが原因かなと思います。
何かエスケープしたくない理由があるのでなければ、エンコードするときのフラグを変えるのがいいかと思います。
エスケープが必要なら、スレタイ追加の時に手動で改行コードなどを全部除去するしかないかもしれませんね。
ありがとうございます。
エスケープ処理と思われる場所です。jsonファイルについては一回削除しないとダメなようでした。
直接このバグと関係しているかはわかりませんが、\n \r 以外のエスケープが必要な文字(\b \tなど)がreplaceされていないのが気になります。
https://www.ipentec.com/document/json-character-escape
可能ならJSON_UNESCAPED_UNICODE を使わないのが手っ取り早い修正ではあると思うのですが...
変更箇所としては今の所こうなってます…
改行コードに関しては、やはりこの処理で消えているように思えるので、わかりません......
repl.itで試した感じだと、\b \f " が残っているようです。
追記: 一応imgurでも貼っておきます https://imgur.com/KuagpUJ
正規表現のところ(
preg_replace
)は、ちょっと何をしているのかわかりません...当該のスレタイが残っているなら
json_decode(..., $flags=JSON_THROW_ON_ERROR)
としてとりあえず例外を出させるのがいいかもしれません。ちょっとコードを読むだけだとこれ以上はわからなそうです。お役に立てずすみません。https://qiita.com/kanaxx/items/b46356532b01737dedd4
色々調べていたのですが、正規表現の部分はこれをやっているのかもしれません。ただ、タイトルに
\xD7
をいれたらjson_decodeが失敗したのでこれがうまくいっていないのかもしれません。もう少し調べてみます。追記: これはまた別の問題でした
あまり関係ない部分ですが
http://dev.delightly.xyz/test/read.cgi/nore/1695561044/47
からすると、
の所は
が本来の処理だと多分思います
後半の正規表現が2行分タイトルの部分あるのに今気がついて修正したのですが問題は変わりませんでした。
以前の修正の時点で出力はエスケープされているようなので、スレタイのインデックス作成やjsonパースするあたりが怪しいのかもしれません。
これが原因だと断定はできないのですが、自分の手元ではjson_decodeが落ちるケースは\xD[1-9]しか作れてないので、こいつらは全削除したほうがいいと思います。
preg_replace("/&#[xX]0*aA/", "<br>", $_POST['title']);
について
269 :ぷにぷに名無しさん 🥚 (d):2023/10/05(木) 16:48:36.65 ID:YznvnAe2
≫262
preg_replaceは
又は
みたいな文字にマッチしたのを第二引数の値に置換しとるだけ
って教えたってや
270 :ぷにぷに名無しさん 🥚 (d):2023/10/05(木) 16:52:10.88 ID:YznvnAe2
≫269
つまりは、CRとLFの文字コードx0aとx000aという文字を検索してlt br gtに置き換えてるわけやな
それがどういう効果をもたらすのかは他の箇所のコード読んで無いからしらん
https://bbs.punipuni.eu/test/read.cgi/vaporeon/1696479286/
代理で送らせていただきました。
引き続き試して見たのですが、
は必ずjson_decodeがSyntax errorをはきます。
繰り返し、これが今回のエラーの原因かはわかりませんが、おそらくスレを落とすことが可能と思われるので、正規表現で除去したほうがいいと思います。
(何らかの理由でエスケープシーケンスを使いたいのであれば別ですが) そもそもの\を空文字 or \ といった 別の文字列に置換すれば全部エスケープシーケンスを無効にできませんか?
@otoufu おそらく\x系(javascriptのエスケープ)だけで大丈夫で他は特になんの害もないと思うのですが、もう少し調べてみないとわかりません
もう一つ考えられるのが
file_get_contents($LTLFILE)
がnullという場合ですが....、ちょっと考えづらいですねまたバグってますね
このスレが原因っぽいです
テ????rg [HhIDkiQs★]
http://bbs.3chan.cc/test/read.cgi/offshore/1696551063/
$_POST['title']のエスケープ処理の修正案を考えてみました。
こうするとjson_decodeした時に$_POST['title']部分が原因で壊れることはないと思うのですがどうでしょうか。
ちょっと試してみますー
最初のコードからの修正でOKでしょうかー?
元々のコードの以下の3行の代わりに上記の4行を入れてもらえればいいかと思います。
改変したところTLが消えて書き込み不可になっちゃいますねー
残さなきゃいけないコードがあるもしくは行の位置が悪かったかなー?
また確認してみますー
了解です。
こちらでも再確認してみます。
私もはるひさんにお願いがあるのですが、スレタイに"\xA9"や"\xD4"があるときエラーがあるか確認していただいても大丈夫でしょうか?
よろしくお願いします。
テストに使用したスレタイを共有していただいてもよろしいでしょうか?
公開したくないようでしたらmisskeyのDMでお願いします。
そもそもTLが消えて通常の書き込み不可になっちゃいましたー
post-v2の遷移画面で止まりますー
もしかしたらはるひのソースコード改変間違いの可能性もあるので
修正したbbsmain.phpのファイルがあるとすぐ反映できるのでありがたいですー
了解です、検証ありがとうございます
ちょっと今日はもう厳しいので明日以降また検証のお願いするかもです
ちょっと整理しました。
私の環境ではTLも動いたんですが、どうでしょう?
ソースコード修正後動作正常確認しましたー
テスト掲示板を解放するのでテストしてもらいたいと思いますー
ここに直接貼っても大丈夫かなー?
とりあえず避難所の方に貼ってテストしてもらいますー
TLが壊れましたが現状その後の書き込みは正常に行われてますー
一応私の環境の結果も書いておきます。
スレタイ
test\n"\xA9""\xD4" 

\r
で作成。TLに問題は見られず。エスケープ処理後のスレタイは
test\n\"\xA9\"\"\xD4\"<br><br><br><br>\r
となっています。皆さん検証ありがとうございます!
これの再現さえできれば残りのケースは一応は解決ですかね?
そうですね、なぜローカルだと再現しないんだろう?
web版でHTMLタグをスレタイに埋め込めてしまうので更に修正案。
9bc45bc4d2/test/bbs-main.php (L314)
あたりでエスケープしてるように思うんですが違うんですかね…梅沢富美男で試しましたがHTML無効になってますねー👏
これは不要かもしれません。私の環境では抜いてもTLは正常のままです。
subject.jsonやindex.jsonを見ると、この行が無くても/がエスケープ処理されているのが分かります。
つまり2重で処理が行われているため、url等が次のようになってしまいます。https://www.google.co.jp/ => https:\/\/www.google.co.jp\/
また、そもそも抜けていたのですが\のエスケープ処理についても同様に無いままで構わないかと思います。
\
がエスケープされるのはjson_encode
の仕様みたいですねこちらでも先ほどのコードで異常ない事確認できましたー
別サーバーではTLの不具合もありましたので様子は見てみますー
スレタイ絵文字の文字化け等があったので修正案。
314行あたりの処理を上に持ってきて一本化してみました。
314行目あたりは全て削除。復旧が必要な場合のために一応コメントアウトにしてます。
特殊な文字等変換のところに追加・修正。
ついでに改行コードを<br>に置換する意味は無いと感じたので半角空白に変更してみました。
何かおかしなところがあれば修正していただきたいです。
※レスがスレ立てになる不具合が発生したので再修正しました。
みなさん本当にありがとうございます…!。
こちらの修正を適用し、サーバー側でもいくつか追加のセキュリティ対策を実施した上で再度delighlyへの移行を検討したいと思います。
#23 を受けてエスケープ処理の再確認及び一本化を行いました。
これで少し可読性が上がって処理漏れの恐れも無くなったかと思います。
該当箇所のコードは以下の通りです。
1ab9ad67fb/test/bbs-main.php (L72-L113)
※再修正しました。
※追記 こちらのプルリクエストが令和最新版です。
#24#27
#27で修正済み。