diff --git a/api/bot-api.php b/api/bot-api.php index 6fc92e1..5e71f39 100644 --- a/api/bot-api.php +++ b/api/bot-api.php @@ -190,20 +190,22 @@ if(isset($_GET['token'])&&isset($_GET['type'])) { try { // SQL作成 - $stmt = $pdo->prepare("INSERT INTO ueuse (username, account, uniqid, ueuse, photo1, photo2, video1, datetime, abi) VALUES (:username, :account, :uniqid, :ueuse, :photo1, :photo2, :video1, :datetime, :abi)"); + $stmt = $pdo->prepare("INSERT INTO ueuse (username, account, uniqid, ueuse, photo1, photo2, photo3, photo4, video1, datetime, abi) VALUES (:username, :account, :uniqid, :ueuse, :photo1, :photo2, :photo3, :photo4, :video1, :datetime, :abi)"); - $stmt->bindParam(':username', $username, PDO::PARAM_STR); - $stmt->bindParam(':account', $userid, PDO::PARAM_STR); - $stmt->bindParam(':uniqid', $uniqid, PDO::PARAM_STR); - $stmt->bindParam(':ueuse', $ueuse, PDO::PARAM_STR); + $stmt->bindParam(':username', htmlspecialchars($username, ENT_QUOTES, 'UTF-8', false), PDO::PARAM_STR); + $stmt->bindParam(':account', htmlspecialchars($userid, ENT_QUOTES, 'UTF-8', false), PDO::PARAM_STR); + $stmt->bindParam(':uniqid', htmlspecialchars($uniqid, ENT_QUOTES, 'UTF-8', false), PDO::PARAM_STR); + $stmt->bindParam(':ueuse', htmlspecialchars($ueuse, ENT_QUOTES, 'UTF-8', false), PDO::PARAM_STR); - $stmt->bindParam(':photo1', $nones, PDO::PARAM_STR); - $stmt->bindParam(':photo2', $nones, PDO::PARAM_STR); - $stmt->bindParam(':video1', $nones, PDO::PARAM_STR); + $stmt->bindParam(':photo1', htmlspecialchars($nones, ENT_QUOTES, 'UTF-8', false), PDO::PARAM_STR); + $stmt->bindParam(':photo2', htmlspecialchars($nones, ENT_QUOTES, 'UTF-8', false), PDO::PARAM_STR); + $stmt->bindParam(':photo3', htmlspecialchars($nones, ENT_QUOTES, 'UTF-8', false), PDO::PARAM_STR); + $stmt->bindParam(':photo4', htmlspecialchars($nones, ENT_QUOTES, 'UTF-8', false), PDO::PARAM_STR); + $stmt->bindParam(':video1', htmlspecialchars($nones, ENT_QUOTES, 'UTF-8', false), PDO::PARAM_STR); - $stmt->bindParam(':datetime', $datetime, PDO::PARAM_STR); + $stmt->bindParam(':datetime', htmlspecialchars($datetime, ENT_QUOTES, 'UTF-8', false), PDO::PARAM_STR); - $stmt->bindParam(':abi', $abi, PDO::PARAM_STR); + $stmt->bindParam(':abi', htmlspecialchars($abi, ENT_QUOTES, 'UTF-8', false), PDO::PARAM_STR); // SQLクエリの実行 $res = $stmt->execute(); @@ -218,6 +220,7 @@ if(isset($_GET['token'])&&isset($_GET['type'])) { $pdo->beginTransaction(); try { + $fromuserid = $userid; $touserid = $mentionedUser; $datetime = date("Y-m-d H:i:s"); $msg = "" . $ueuse . ""; @@ -226,16 +229,16 @@ if(isset($_GET['token'])&&isset($_GET['type'])) { $userchk = 'none'; // 通知用SQL作成 - $stmt = $pdo->prepare("INSERT INTO notification (touserid, msg, url, datetime, userchk, title) VALUES (:touserid, :msg, :url, :datetime, :userchk, :title)"); + $stmt = $pdo->prepare("INSERT INTO notification (fromuserid, touserid, msg, url, datetime, userchk, title) VALUES (:fromuserid, :touserid, :msg, :url, :datetime, :userchk, :title)"); + $stmt->bindParam(':fromuserid', htmlspecialchars($fromuserid, ENT_QUOTES, 'UTF-8', false), PDO::PARAM_STR); + $stmt->bindParam(':touserid', htmlspecialchars($touserid, ENT_QUOTES, 'UTF-8', false), PDO::PARAM_STR); + $stmt->bindParam(':msg', htmlspecialchars($msg, ENT_QUOTES, 'UTF-8', false), PDO::PARAM_STR); + $stmt->bindParam(':url', htmlspecialchars($url, ENT_QUOTES, 'UTF-8', false), PDO::PARAM_STR); + $stmt->bindParam(':userchk', htmlspecialchars($userchk, ENT_QUOTES, 'UTF-8', false), PDO::PARAM_STR); + $stmt->bindParam(':title', htmlspecialchars($title, ENT_QUOTES, 'UTF-8', false), PDO::PARAM_STR); - $stmt->bindParam(':touserid', $touserid, PDO::PARAM_STR); - $stmt->bindParam(':msg', $msg, PDO::PARAM_STR); - $stmt->bindParam(':url', $url, PDO::PARAM_STR); - $stmt->bindParam(':userchk', $userchk, PDO::PARAM_STR); - $stmt->bindParam(':title', $title, PDO::PARAM_STR); - - $stmt->bindParam(':datetime', $datetime, PDO::PARAM_STR); + $stmt->bindParam(':datetime', htmlspecialchars($datetime, ENT_QUOTES, 'UTF-8', false), PDO::PARAM_STR); // SQLクエリの実行 $res = $stmt->execute(); diff --git a/css/home.css b/css/home.css index 53a736e..70f0461 100644 --- a/css/home.css +++ b/css/home.css @@ -488,6 +488,7 @@ main h1{ width: auto; height:auto; margin-bottom: 12px; + overflow-wrap: break-all; } .userheader .hed img{ @@ -5706,7 +5707,7 @@ summary { overflow-wrap: break-word; margin-top: 32px; margin-bottom: auto; - margin-left: -6px; + margin-left: 0px; font-size: 16px; color:var(--link-color); text-decoration: none; diff --git a/delete/delete.php b/delete/delete.php index b6ee1f7..3a3f490 100644 --- a/delete/delete.php +++ b/delete/delete.php @@ -44,7 +44,56 @@ if (htmlentities(isset($_POST['uniqid'])) && htmlentities(isset($_POST['userid'] $result2 = $query->fetch(); if($result2["loginid"] === $loginid){ + $photo_query = $dbh->prepare("SELECT * FROM ueuse WHERE account = :userid AND uniqid = :uniqid"); + $photo_query->bindValue(':userid', $postUserid); + $photo_query->bindValue(':uniqid', $postUniqid); + $photo_query->execute(); + $photo_and_video = $photo_query->fetch(); + + if(!($photo_and_video["photo1"] == "none")){ + $photoDelete1 = glob($photo_and_video["photo1"]); // 「-ユーザーID.拡張子」というパターンを検索 + foreach ($photoDelete1 as $photo1) { + if (is_file($photo1)) { + unlink($photo1); + } + } + } + if(!($photo_and_video["photo2"] == "none")){ + $photoDelete2 = glob($photo_and_video["photo2"]); // 「-ユーザーID.拡張子」というパターンを検索 + foreach ($photoDelete2 as $photo2) { + if (is_file($photo2)) { + unlink($photo2); + } + } + } + if(!($photo_and_video["photo3"] == "none")){ + $photoDelete3 = glob($photo_and_video["photo3"]); // 「-ユーザーID.拡張子」というパターンを検索 + foreach ($photoDelete3 as $photo3) { + if (is_file($photo3)) { + unlink($photo3); + } + } + } + if(!($photo_and_video["photo4"] == "none")){ + $photoDelete4 = glob($photo_and_video["photo4"]); // 「-ユーザーID.拡張子」というパターンを検索 + foreach ($photoDelete4 as $photo4) { + if (is_file($photo4)) { + unlink($photo4); + } + } + } + if(!($photo_and_video["video1"] == "none")){ + $videoDelete1 = glob($photo_and_video["video1"]); // 「-ユーザーID.拡張子」というパターンを検索 + foreach ($videoDelete1 as $video1) { + if (is_file($video1)) { + unlink($video1); + } + } + } + + try { + $pdo = new PDO('mysql:charset=utf8mb4;dbname='.DB_NAME.';host='.DB_HOST , DB_USER, DB_PASS); // 削除クエリを実行 diff --git a/home/ftl.php b/home/ftl.php index 73779ec..5b4a52f 100644 --- a/home/ftl.php +++ b/home/ftl.php @@ -225,10 +225,10 @@ function get_mentions_userid($postText) { if( !empty($_POST['btn_submit']) ) { - $ueuse = htmlentities($_POST['ueuse']); + $ueuse = htmlspecialchars($_POST['ueuse'], ENT_QUOTES, 'UTF-8', false); if(isset($_POST['nsfw_chk'])){ - $nsfw_chk = htmlentities($_POST['nsfw_chk']); + $nsfw_chk = htmlspecialchars($_POST['nsfw_chk'], ENT_QUOTES, 'UTF-8', false); }else{ $nsfw_chk = "false"; } @@ -244,8 +244,8 @@ if( !empty($_POST['btn_submit']) ) { $error_message[] = '内容を入力してください。(INPUT_PLEASE)'; } else { // 文字数を確認 - if( (int)htmlspecialchars(file_get_contents($mojisizefile), ENT_QUOTES, 'UTF-8') < mb_strlen($ueuse, 'UTF-8') ) { - $error_message[] = '内容は'.htmlspecialchars(file_get_contents($mojisizefile), ENT_QUOTES, 'UTF-8').'文字以内で入力してください。(INPUT_OVER_MAX_COUNT)'; + if( (int)htmlspecialchars(file_get_contents($mojisizefile), ENT_QUOTES, 'UTF-8', false) < mb_strlen($ueuse, 'UTF-8') ) { + $error_message[] = '内容は'.htmlspecialchars(file_get_contents($mojisizefile), ENT_QUOTES, 'UTF-8', false).'文字以内で入力してください。(INPUT_OVER_MAX_COUNT)'; } // 禁止url確認 @@ -492,21 +492,21 @@ if( !empty($_POST['btn_submit']) ) { // SQL作成 $stmt = $pdo->prepare("INSERT INTO ueuse (username, account, uniqid, ueuse, photo1, photo2, photo3, photo4, video1, datetime, abi, nsfw) VALUES (:username, :account, :uniqid, :ueuse, :photo1, :photo2, :photo3, :photo4, :video1, :datetime, :abi, :nsfw)"); - $stmt->bindParam(':username', $username, PDO::PARAM_STR); - $stmt->bindParam(':account', $userid, PDO::PARAM_STR); - $stmt->bindParam(':uniqid', $uniqid, PDO::PARAM_STR); - $stmt->bindParam(':ueuse', $ueuse, PDO::PARAM_STR); + $stmt->bindParam(':username', htmlspecialchars($username, ENT_QUOTES, 'UTF-8', false), PDO::PARAM_STR); + $stmt->bindParam(':account', htmlspecialchars($userid, ENT_QUOTES, 'UTF-8', false), PDO::PARAM_STR); + $stmt->bindParam(':uniqid', htmlspecialchars($uniqid, ENT_QUOTES, 'UTF-8', false), PDO::PARAM_STR); + $stmt->bindParam(':ueuse', htmlspecialchars($ueuse, ENT_QUOTES, 'UTF-8', false), PDO::PARAM_STR); - $stmt->bindParam(':photo1', $photo1, PDO::PARAM_STR); - $stmt->bindParam(':photo2', $photo2, PDO::PARAM_STR); - $stmt->bindParam(':photo3', $photo3, PDO::PARAM_STR); - $stmt->bindParam(':photo4', $photo4, PDO::PARAM_STR); - $stmt->bindParam(':video1', $video1, PDO::PARAM_STR); - $stmt->bindParam(':datetime', $datetime, PDO::PARAM_STR); + $stmt->bindParam(':photo1', htmlspecialchars($photo1, ENT_QUOTES, 'UTF-8', false), PDO::PARAM_STR); + $stmt->bindParam(':photo2', htmlspecialchars($photo2, ENT_QUOTES, 'UTF-8', false), PDO::PARAM_STR); + $stmt->bindParam(':photo3', htmlspecialchars($photo3, ENT_QUOTES, 'UTF-8', false), PDO::PARAM_STR); + $stmt->bindParam(':photo4', htmlspecialchars($photo4, ENT_QUOTES, 'UTF-8', false), PDO::PARAM_STR); + $stmt->bindParam(':video1', htmlspecialchars($video1, ENT_QUOTES, 'UTF-8', false), PDO::PARAM_STR); + $stmt->bindParam(':datetime', htmlspecialchars($datetime, ENT_QUOTES, 'UTF-8', false), PDO::PARAM_STR); - $stmt->bindParam(':nsfw', $save_nsfw, PDO::PARAM_STR); + $stmt->bindParam(':nsfw', htmlspecialchars($save_nsfw, ENT_QUOTES, 'UTF-8', false), PDO::PARAM_STR); - $stmt->bindParam(':abi', $abi, PDO::PARAM_STR); + $stmt->bindParam(':abi', htmlspecialchars($abi, ENT_QUOTES, 'UTF-8', false), PDO::PARAM_STR); // SQLクエリの実行 $res = $stmt->execute(); @@ -532,14 +532,14 @@ if( !empty($_POST['btn_submit']) ) { $stmt = $pdo->prepare("INSERT INTO notification (fromuserid, touserid, msg, url, datetime, userchk, title) VALUES (:fromuserid, :touserid, :msg, :url, :datetime, :userchk, :title)"); - $stmt->bindParam(':fromuserid', htmlentities($fromuserid), PDO::PARAM_STR); - $stmt->bindParam(':touserid', htmlentities($touserid), PDO::PARAM_STR); - $stmt->bindParam(':msg', $msg, PDO::PARAM_STR); - $stmt->bindParam(':url', htmlentities($url), PDO::PARAM_STR); - $stmt->bindParam(':userchk', htmlentities($userchk), PDO::PARAM_STR); - $stmt->bindParam(':title', htmlentities($title), PDO::PARAM_STR); + $stmt->bindParam(':fromuserid', htmlspecialchars($fromuserid, ENT_QUOTES, 'UTF-8', false), PDO::PARAM_STR); + $stmt->bindParam(':touserid', htmlspecialchars($touserid, ENT_QUOTES, 'UTF-8', false), PDO::PARAM_STR); + $stmt->bindParam(':msg', htmlspecialchars($msg, ENT_QUOTES, 'UTF-8', false), PDO::PARAM_STR); + $stmt->bindParam(':url', htmlspecialchars($url, ENT_QUOTES, 'UTF-8', false), PDO::PARAM_STR); + $stmt->bindParam(':userchk', htmlspecialchars($userchk, ENT_QUOTES, 'UTF-8', false), PDO::PARAM_STR); + $stmt->bindParam(':title', htmlspecialchars($title, ENT_QUOTES, 'UTF-8', false), PDO::PARAM_STR); - $stmt->bindParam(':datetime', htmlentities($datetime), PDO::PARAM_STR); + $stmt->bindParam(':datetime', htmlspecialchars($datetime, ENT_QUOTES, 'UTF-8', false), PDO::PARAM_STR); // SQLクエリの実行 $res = $stmt->execute(); diff --git a/home/index.php b/home/index.php index 7ba7ea8..79d35f8 100644 --- a/home/index.php +++ b/home/index.php @@ -190,7 +190,7 @@ $notificationcount = $notiData['notification_count']; //-----------------URLから取得---------------- if(isset($_GET['text'])) { - $ueuse = htmlentities($_GET['text']); + $ueuse = htmlspecialchars($_GET['text'], ENT_QUOTES, 'UTF-8', false); } //------------------------------------------- @@ -222,10 +222,10 @@ function get_mentions_userid($postText) { } if( !empty($_POST['btn_submit']) ) { - $ueuse = htmlentities($_POST['ueuse']); + $ueuse = htmlspecialchars($_POST['ueuse'], ENT_QUOTES, 'UTF-8', false); if(isset($_POST['nsfw_chk'])){ - $nsfw_chk = htmlentities($_POST['nsfw_chk']); + $nsfw_chk = htmlspecialchars($_POST['nsfw_chk'], ENT_QUOTES, 'UTF-8', false); }else{ $nsfw_chk = "false"; } @@ -241,8 +241,8 @@ if( !empty($_POST['btn_submit']) ) { $error_message[] = '内容を入力してください。(INPUT_PLEASE)'; } else { // 文字数を確認 - if( (int)htmlspecialchars(file_get_contents($mojisizefile), ENT_QUOTES, 'UTF-8') < mb_strlen($ueuse, 'UTF-8') ) { - $error_message[] = '内容は'.htmlspecialchars(file_get_contents($mojisizefile), ENT_QUOTES, 'UTF-8').'文字以内で入力してください。(INPUT_OVER_MAX_COUNT)'; + if( (int)htmlspecialchars(file_get_contents($mojisizefile), ENT_QUOTES, 'UTF-8', false) < mb_strlen($ueuse, 'UTF-8') ) { + $error_message[] = '内容は'.htmlspecialchars(file_get_contents($mojisizefile), ENT_QUOTES, 'UTF-8', false).'文字以内で入力してください。(INPUT_OVER_MAX_COUNT)'; } // 禁止url確認 @@ -490,21 +490,21 @@ if( !empty($_POST['btn_submit']) ) { // SQL作成 $stmt = $pdo->prepare("INSERT INTO ueuse (username, account, uniqid, ueuse, photo1, photo2, photo3, photo4, video1, datetime, abi, nsfw) VALUES (:username, :account, :uniqid, :ueuse, :photo1, :photo2, :photo3, :photo4, :video1, :datetime, :abi, :nsfw)"); - $stmt->bindParam(':username', $username, PDO::PARAM_STR); - $stmt->bindParam(':account', $userid, PDO::PARAM_STR); - $stmt->bindParam(':uniqid', $uniqid, PDO::PARAM_STR); - $stmt->bindParam(':ueuse', $ueuse, PDO::PARAM_STR); + $stmt->bindParam(':username', htmlspecialchars($username, ENT_QUOTES, 'UTF-8', false), PDO::PARAM_STR); + $stmt->bindParam(':account', htmlspecialchars($userid, ENT_QUOTES, 'UTF-8', false), PDO::PARAM_STR); + $stmt->bindParam(':uniqid', htmlspecialchars($uniqid, ENT_QUOTES, 'UTF-8', false), PDO::PARAM_STR); + $stmt->bindParam(':ueuse', htmlspecialchars($ueuse, ENT_QUOTES, 'UTF-8', false), PDO::PARAM_STR); - $stmt->bindParam(':photo1', $photo1, PDO::PARAM_STR); - $stmt->bindParam(':photo2', $photo2, PDO::PARAM_STR); - $stmt->bindParam(':photo3', $photo3, PDO::PARAM_STR); - $stmt->bindParam(':photo4', $photo4, PDO::PARAM_STR); - $stmt->bindParam(':video1', $video1, PDO::PARAM_STR); - $stmt->bindParam(':datetime', $datetime, PDO::PARAM_STR); + $stmt->bindParam(':photo1', htmlspecialchars($photo1, ENT_QUOTES, 'UTF-8', false), PDO::PARAM_STR); + $stmt->bindParam(':photo2', htmlspecialchars($photo2, ENT_QUOTES, 'UTF-8', false), PDO::PARAM_STR); + $stmt->bindParam(':photo3', htmlspecialchars($photo3, ENT_QUOTES, 'UTF-8', false), PDO::PARAM_STR); + $stmt->bindParam(':photo4', htmlspecialchars($photo4, ENT_QUOTES, 'UTF-8', false), PDO::PARAM_STR); + $stmt->bindParam(':video1', htmlspecialchars($video1, ENT_QUOTES, 'UTF-8', false), PDO::PARAM_STR); + $stmt->bindParam(':datetime', htmlspecialchars($datetime, ENT_QUOTES, 'UTF-8', false), PDO::PARAM_STR); - $stmt->bindParam(':nsfw', $save_nsfw, PDO::PARAM_STR); + $stmt->bindParam(':nsfw', htmlspecialchars($save_nsfw, ENT_QUOTES, 'UTF-8', false), PDO::PARAM_STR); - $stmt->bindParam(':abi', $abi, PDO::PARAM_STR); + $stmt->bindParam(':abi', htmlspecialchars($abi, ENT_QUOTES, 'UTF-8', false), PDO::PARAM_STR); // SQLクエリの実行 $res = $stmt->execute(); @@ -531,14 +531,14 @@ if( !empty($_POST['btn_submit']) ) { $stmt = $pdo->prepare("INSERT INTO notification (fromuserid, touserid, msg, url, datetime, userchk, title) VALUES (:fromuserid, :touserid, :msg, :url, :datetime, :userchk, :title)"); - $stmt->bindParam(':fromuserid', htmlentities($fromuserid), PDO::PARAM_STR); - $stmt->bindParam(':touserid', htmlentities($touserid), PDO::PARAM_STR); - $stmt->bindParam(':msg', $msg, PDO::PARAM_STR); - $stmt->bindParam(':url', htmlentities($url), PDO::PARAM_STR); - $stmt->bindParam(':userchk', htmlentities($userchk), PDO::PARAM_STR); - $stmt->bindParam(':title', htmlentities($title), PDO::PARAM_STR); + $stmt->bindParam(':fromuserid', htmlspecialchars($fromuserid, ENT_QUOTES, 'UTF-8', false), PDO::PARAM_STR); + $stmt->bindParam(':touserid', htmlspecialchars($touserid, ENT_QUOTES, 'UTF-8', false), PDO::PARAM_STR); + $stmt->bindParam(':msg', htmlspecialchars($msg, ENT_QUOTES, 'UTF-8', false), PDO::PARAM_STR); + $stmt->bindParam(':url', htmlspecialchars($url, ENT_QUOTES, 'UTF-8', false), PDO::PARAM_STR); + $stmt->bindParam(':userchk', htmlspecialchars($userchk, ENT_QUOTES, 'UTF-8', false), PDO::PARAM_STR); + $stmt->bindParam(':title', htmlspecialchars($title, ENT_QUOTES, 'UTF-8', false), PDO::PARAM_STR); - $stmt->bindParam(':datetime', htmlentities($datetime), PDO::PARAM_STR); + $stmt->bindParam(':datetime', htmlspecialchars($datetime, ENT_QUOTES, 'UTF-8', false), PDO::PARAM_STR); // SQLクエリの実行 $res = $stmt->execute(); diff --git a/nextpage/notification.php b/nextpage/notification.php index 0a6b3e0..0f1d2c5 100644 --- a/nextpage/notification.php +++ b/nextpage/notification.php @@ -73,7 +73,7 @@ if (isset($_GET['userid']) && isset($_GET['account_id'])) { if (!empty($message_array)) { foreach ($message_array as $value) { - $value["servericon"] = htmlspecialchars($serversettings["serverinfo"]["server_icon"], ENT_QUOTES, 'UTF-8'); + $value["servericon"] = htmlspecialchars($serversettings["serverinfo"]["server_icon"], ENT_QUOTES, 'UTF-8', false); if(!(empty($value['fromuserid']))){ if(!($value['fromuserid'] == "uwuzu-fromsys")){ $userQuery = $dbh->prepare("SELECT username,iconname FROM account WHERE userid = :userid"); diff --git a/nextpage/notificationview.php b/nextpage/notificationview.php index a54852f..0de2ffe 100644 --- a/nextpage/notificationview.php +++ b/nextpage/notificationview.php @@ -39,6 +39,7 @@ function processMarkdownAndWrapEmptyLines($markdownText){ } //Profile function replaceProfileEmojiImages($postText) { + $postText = str_replace(''', '\'', $postText); // プロフィール名で絵文字名(:emoji:)を検出して画像に置き換える $emojiPattern = '/:(\w+):/'; $postTextWithImages = preg_replace_callback($emojiPattern, function($matches) { @@ -63,6 +64,7 @@ function replaceProfileEmojiImages($postText) { return $postTextWithImages; } function replaceEmojisWithImages($postText) { + $postText = str_replace(''', '\'', $postText); // ユーズ内で絵文字名(:emoji:)を検出して画像に置き換える $emojiPattern = '/:(\w+):/'; $postTextWithImages = preg_replace_callback($emojiPattern, function($matches) { @@ -104,14 +106,14 @@ function replaceEmojisWithImages($postText) { if(empty($mentionsuserData)){ return "@$username"; }else{ - return "@".replaceProfileEmojiImages(htmlentities($mentionsuserData["username"])).""; + return "@".replaceProfileEmojiImages(htmlspecialchars($mentionsuserData["username"], ENT_QUOTES, 'UTF-8', false)).""; } }, $postTextWithImages); $hashtagsPattern = '/#([\p{Han}\p{Hiragana}\p{Katakana}A-Za-z0-9ー_]+)/u'; $postTextWithHashtags = preg_replace_callback($hashtagsPattern, function($matches) { $hashtags = $matches[1]; - return "" . '#' . $hashtags . ""; + return "" . '#' . htmlspecialchars($hashtags, ENT_QUOTES, 'UTF-8', false) . ""; }, $postTextWithImagesAndUsernames); return $postTextWithHashtags; @@ -133,11 +135,11 @@ class MessageDisplay { echo '
'; echo '
'; - $day = date("Ymd", strtotime(htmlentities($this->value['datetime']))); + $day = date("Ymd", strtotime(htmlspecialchars($this->value['datetime'], ENT_QUOTES, 'UTF-8', false))); if ($day == date("Ymd")) { - echo date("今日 H:i", strtotime(htmlentities($this->value['datetime']))); + echo date("今日 H:i", strtotime(htmlspecialchars($this->value['datetime'], ENT_QUOTES, 'UTF-8', false))); } else { - echo date("Y年m月d日 H:i", strtotime(htmlentities($this->value['datetime']))); + echo date("Y年m月d日 H:i", strtotime(htmlspecialchars($this->value['datetime'], ENT_QUOTES, 'UTF-8', false))); } echo '
'; @@ -149,24 +151,24 @@ class MessageDisplay { echo '
'; if(($this->value['fromuserid'] == "uwuzu-fromsys")){ if(!(empty($this->value["servericon"]))){ - echo ' '; + echo ' '; }else{ echo ' '; } }else{ - echo ' '; + echo ' '; } echo '
'; if(($this->value['fromuserid'] == "uwuzu-fromsys")){ echo '
uwuzu
'; }else{ - echo '
'.$this->value['fromusername'].'
'; + echo '
'.htmlspecialchars($this->value['fromusername'], ENT_QUOTES, 'UTF-8', false).'
'; } echo '
'; } - echo '

' . replaceEmojisWithImages($this->value['title']) . '

'; - echo '

' . processMarkdownAndWrapEmptyLines(replaceEmojisWithImages(nl2br($this->value['msg']))) . '

'; - echo ' 詳細をみる'; + echo '

' . replaceEmojisWithImages(htmlspecialchars($this->value['title'], ENT_QUOTES, 'UTF-8', false)) . '

'; + echo '

' . processMarkdownAndWrapEmptyLines(replaceEmojisWithImages(nl2br(htmlspecialchars($this->value['msg'], ENT_QUOTES, 'UTF-8', false)))) . '

'; + echo ' 詳細をみる'; echo ''; } diff --git a/nextpage/user_view.php b/nextpage/user_view.php index 2980a04..8b0878c 100644 --- a/nextpage/user_view.php +++ b/nextpage/user_view.php @@ -17,16 +17,16 @@ class UserdataDisplay { echo '
'; echo '
'; - echo ' '; + echo ' '; echo '
'; echo '
'; echo '
'; - echo ' '; - echo ' ' . htmlentities($this->value['username']) . ''; + echo ' '; + echo ' ' . htmlspecialchars($this->value['username'], ENT_QUOTES, 'UTF-8', false) . ''; echo ' '; if(!empty($this->value['sacinfo'])){ if($this->value['sacinfo'] === "bot"){ @@ -43,7 +43,7 @@ class UserdataDisplay { echo '
'; echo '
'; - echo '

' .replaceEmojisWithImages(replaceURLsWithLinks(nl2br($this->value['profile']))) . '

'; + echo '

' .replaceEmojisWithImages(replaceURLsWithLinks(nl2br(htmlspecialchars($this->value['profile'], ENT_QUOTES, 'UTF-8', false)))) . '

'; echo '
'; echo '
'; diff --git a/nextpage/view.php b/nextpage/view.php index b0ada6b..a050df5 100644 --- a/nextpage/view.php +++ b/nextpage/view.php @@ -45,6 +45,7 @@ function processMarkdownAndWrapEmptyLines($markdownText){ } //Profile function replaceProfileEmojiImages($postText) { + $postText = str_replace(''', '\'', $postText); // プロフィール名で絵文字名(:emoji:)を検出して画像に置き換える $emojiPattern = '/:(\w+):/'; $postTextWithImages = preg_replace_callback($emojiPattern, function($matches) { @@ -70,6 +71,7 @@ function replaceProfileEmojiImages($postText) { } // ユーズ内の絵文字やhashtagを画像に置き換える function replaceEmojisWithImages($postText) { + $postText = str_replace(''', '\'', $postText); // ユーズ内で絵文字名(:emoji:)を検出して画像に置き換える $emojiPattern = '/:(\w+):/'; $postTextWithImages = preg_replace_callback($emojiPattern, function($matches) { @@ -111,7 +113,7 @@ function replaceEmojisWithImages($postText) { if(empty($mentionsuserData)){ return "@$username"; }else{ - return "@".replaceProfileEmojiImages(htmlentities($mentionsuserData["username"])).""; + return "@".replaceProfileEmojiImages(htmlspecialchars($mentionsuserData["username"], ENT_QUOTES, 'UTF-8', false)).""; } }, $postTextWithImages); @@ -124,9 +126,6 @@ function replaceEmojisWithImages($postText) { return $postTextWithHashtags; } function replaceURLsWithLinks($postText) { - - $postText = str_replace(''', '\'', $postText); - // URLを正規表現を使って検出 $pattern = '/(https:\/\/[^\s<>\[\]\'"]+)/'; // 改良された正規表現 preg_match_all($pattern, $postText, $matches); @@ -177,14 +176,14 @@ function YouTube_and_nicovideo_Links($postText) { if (isset($parsedUrl['query'])) { if(false !== strpos($parsedUrl['query'], 'v=')) { - $video_id = str_replace('v=', '', htmlentities($parsedUrl['query'])); + $video_id = str_replace('v=', '', htmlspecialchars($parsedUrl['query'], ENT_QUOTES, 'UTF-8', false)); $iframe = true; }else{ - $video_id = str_replace('/', '', htmlentities($parsedUrl['path'])); + $video_id = str_replace('/', '', htmlspecialchars($parsedUrl['path'], ENT_QUOTES, 'UTF-8', false)); $iframe = true; } }elseif(isset($parsedUrl['path'])){ - $video_id = str_replace('/', '', htmlentities($parsedUrl['path'])); + $video_id = str_replace('/', '', htmlspecialchars($parsedUrl['path'], ENT_QUOTES, 'UTF-8', false)); $iframe = true; }else{ $video_id = ""; @@ -201,7 +200,7 @@ function YouTube_and_nicovideo_Links($postText) { }elseif($parsedUrl['host'] == "nicovideo.jp" || $parsedUrl['host'] == "www.nicovideo.jp"){ if(isset($parsedUrl['path'])){ - $video_id = str_replace('/watch/', '', htmlentities($parsedUrl['path'])); + $video_id = str_replace('/watch/', '', htmlspecialchars($parsedUrl['path'], ENT_QUOTES, 'UTF-8', false)); $iframe = true; }else{ $video_id = ""; @@ -243,10 +242,10 @@ class MessageDisplay { } echo '
'; - echo ' '; - echo '
' . replaceProfileEmojiImages(htmlentities($this->value['username'])) . '
'; + echo ' '; + echo '
' . replaceProfileEmojiImages(htmlspecialchars($this->value['username'], ENT_QUOTES, 'UTF-8', false)) . '
'; echo ' '; if(!empty($this->value['sacinfo'])){ if($this->value['sacinfo'] === "bot"){ @@ -261,7 +260,7 @@ class MessageDisplay { } echo '
'; - $datetime = strtotime(htmlentities($this->value['datetime'])); + $datetime = strtotime(htmlspecialchars($this->value['datetime'], ENT_QUOTES, 'UTF-8', false)); $today = strtotime(date("Y-m-d")); $tomorrow = date('Y-m-d', strtotime('+1 day')); if (date("md", $datetime) == "0101") { @@ -284,45 +283,45 @@ class MessageDisplay { echo '
'; if($this->value['nsfw'] === "true"){ - echo '
'; + echo '
'; echo '

NSFW指定がされている投稿です!
職場や公共の場での表示には適さない場合があります。
表示ボタンを押すと表示されます。

'; echo '
'; echo ' '; echo '
'; echo '
'; - echo '
'; + echo '
'; echo '
'; } - echo '

' . replaceEmojisWithImages(processMarkdownAndWrapEmptyLines(replaceURLsWithLinks(nl2br($this->value['ueuse'])))) . '

'; + echo '

' . replaceEmojisWithImages(processMarkdownAndWrapEmptyLines(replaceURLsWithLinks(nl2br(htmlspecialchars($this->value['ueuse'], ENT_QUOTES, 'UTF-8', false))))) . '

'; if (!empty($this->value['photo4']) && $this->value['photo4'] !== 'none') { echo '
'; - echo ' 画像1'; - echo ' 画像2'; - echo ' 画像3'; - echo ' 画像4'; + echo ' 画像1'; + echo ' 画像2'; + echo ' 画像3'; + echo ' 画像4'; echo '
'; } elseif (!empty($this->value['photo3']) && $this->value['photo3'] !== 'none') { echo '
'; - echo ' 画像1'; - echo ' 画像2'; + echo ' 画像1'; + echo ' 画像2'; echo '
'; - echo ' 画像3'; + echo ' 画像3'; echo '
'; echo '
'; } elseif (!empty($this->value['photo2']) && $this->value['photo2'] !== 'none') { echo '
'; - echo ' 画像1'; - echo ' 画像2'; + echo ' 画像1'; + echo ' 画像2'; echo '
'; } elseif (!empty($this->value['photo1']) && $this->value['photo1'] !== 'none') { echo '
'; - echo ' 画像1'; + echo ' 画像1'; echo '
'; } if (!empty($this->value['video1']) && $this->value['video1'] !== 'none') { echo '
'; - echo ' '; + echo ' '; echo '
'; }elseif (!empty(YouTube_and_nicovideo_Links($this->value['ueuse']))) { echo '
'; @@ -333,10 +332,10 @@ class MessageDisplay { if(!($this->value['abi'] == "none")){ echo '
'; echo '
'; - echo '

' . replaceProfileEmojiImages(htmlentities($this->value['username'])) . 'さんが追記しました

'; + echo '

' . replaceProfileEmojiImages(htmlspecialchars($this->value['username'], ENT_QUOTES, 'UTF-8', false)) . 'さんが追記しました

'; echo '
'; - echo '

'.processMarkdownAndWrapEmptyLines(replaceEmojisWithImages(replaceURLsWithLinks(nl2br($this->value['abi'])))) . '

'; - echo '
追記日時 : '. date("Y年m月d日 H:i", strtotime(htmlentities($this->value['abidate']))) . '
'; + echo '

'.processMarkdownAndWrapEmptyLines(replaceEmojisWithImages(replaceURLsWithLinks(nl2br(htmlspecialchars($this->value['abi'], ENT_QUOTES, 'UTF-8', false))))) . '

'; + echo '
追記日時 : '. date("Y年m月d日 H:i", strtotime(htmlspecialchars($this->value['abidate'], ENT_QUOTES, 'UTF-8', false))) . '
'; echo '
'; } if($this->value['nsfw'] === "true"){ @@ -348,27 +347,27 @@ class MessageDisplay { echo '
'; $favoriteList = explode(',', $this->value['favorite']); if (in_array($this->userid, $favoriteList)) { - echo ''; + echo ''; }else{ - echo ''; + echo ''; } - echo ''.htmlentities($this->value['reply_count']).''; - echo ''; + echo ''.htmlspecialchars($this->value['reply_count'], ENT_QUOTES, 'UTF-8', false).''; + echo ''; $bookmarkList = explode(',', $this->value['bookmark']); if (in_array($this->value['uniqid'], $bookmarkList)) { - echo ''; + echo ''; }else{ - echo ''; + echo ''; } if($this->value['account'] === $this->userid){ if(!($this->value['role'] === "ice")){ if($this->value['abi'] === "none"){ - echo ''; + echo ''; } } - echo ''; + echo ''; } echo '
'; echo '
'; diff --git a/server/uwuzuinfo.txt b/server/uwuzuinfo.txt index 18fbc3e..7aee904 100644 --- a/server/uwuzuinfo.txt +++ b/server/uwuzuinfo.txt @@ -1,4 +1,4 @@ uwuzu -1.3.2 -2024/03/05 +1.3.3 +2024/03/06 daichimarukana,putonfps \ No newline at end of file diff --git a/server/uwuzurelease.txt b/server/uwuzurelease.txt index 8d56aec..2f380ce 100644 --- a/server/uwuzurelease.txt +++ b/server/uwuzurelease.txt @@ -1,6 +1,14 @@ ## リリースノートだぜぇぇぇぇぇぇい!!!!!!! ここにはuwuzuの更新情報を載せてくぜぇ~!(いやまてテンションおかしいだろ...) +## Version 1.3.3 (new_Planet) +リリース日:2024/03/06 +fix: 重大な脆弱性を修正しました。 +fix: 一部表示がおかしくなる部分を修正しました。 +fix: バグを減らしました。 +chg: 投稿を削除する際の動作を一部変更しました。 +chg: 一部UIを変更しました。 + ## Version 1.3.2 (new_Planet) リリース日:2024/03/05 fix: 広告を追加できない問題を修正しました。 diff --git a/ueuse/index.php b/ueuse/index.php index fd0bbec..1b9031a 100644 --- a/ueuse/index.php +++ b/ueuse/index.php @@ -499,23 +499,23 @@ if( !empty($_POST['btn_submit']) ) { // SQL作成 $stmt = $pdo->prepare("INSERT INTO ueuse (username, account, uniqid, rpuniqid, ueuse, photo1, photo2, photo3, photo4, video1, datetime, abi, nsfw) VALUES (:username, :account, :uniqid, :rpuniqid, :ueuse, :photo1, :photo2, :photo3, :photo4, :video1, :datetime, :abi, :nsfw)"); - - $stmt->bindParam(':username', $username, PDO::PARAM_STR); - $stmt->bindParam(':account', $userid, PDO::PARAM_STR); - $stmt->bindParam(':uniqid', $uniqid, PDO::PARAM_STR); - $stmt->bindParam(':rpuniqid', $ueuseid, PDO::PARAM_STR); - $stmt->bindParam(':ueuse', $ueuse, PDO::PARAM_STR); - $stmt->bindParam(':photo1', $photo1, PDO::PARAM_STR); - $stmt->bindParam(':photo2', $photo2, PDO::PARAM_STR); - $stmt->bindParam(':photo3', $photo3, PDO::PARAM_STR); - $stmt->bindParam(':photo4', $photo4, PDO::PARAM_STR); - $stmt->bindParam(':video1', $video1, PDO::PARAM_STR); - $stmt->bindParam(':datetime', $datetime, PDO::PARAM_STR); + $stmt->bindParam(':username', htmlspecialchars($username, ENT_QUOTES, 'UTF-8', false), PDO::PARAM_STR); + $stmt->bindParam(':account', htmlspecialchars($userid, ENT_QUOTES, 'UTF-8', false), PDO::PARAM_STR); + $stmt->bindParam(':uniqid', htmlspecialchars($uniqid, ENT_QUOTES, 'UTF-8', false), PDO::PARAM_STR); + $stmt->bindParam(':rpuniqid', htmlspecialchars($ueuseid, ENT_QUOTES, 'UTF-8', false), PDO::PARAM_STR); + $stmt->bindParam(':ueuse', htmlspecialchars($ueuse, ENT_QUOTES, 'UTF-8', false), PDO::PARAM_STR); - $stmt->bindParam(':abi', $abi, PDO::PARAM_STR); + $stmt->bindParam(':photo1', htmlspecialchars($photo1, ENT_QUOTES, 'UTF-8', false), PDO::PARAM_STR); + $stmt->bindParam(':photo2', htmlspecialchars($photo2, ENT_QUOTES, 'UTF-8', false), PDO::PARAM_STR); + $stmt->bindParam(':photo3', htmlspecialchars($photo3, ENT_QUOTES, 'UTF-8', false), PDO::PARAM_STR); + $stmt->bindParam(':photo4', htmlspecialchars($photo4, ENT_QUOTES, 'UTF-8', false), PDO::PARAM_STR); + $stmt->bindParam(':video1', htmlspecialchars($video1, ENT_QUOTES, 'UTF-8', false), PDO::PARAM_STR); + $stmt->bindParam(':datetime', htmlspecialchars($datetime, ENT_QUOTES, 'UTF-8', false), PDO::PARAM_STR); - $stmt->bindParam(':nsfw', $save_nsfw, PDO::PARAM_STR); + $stmt->bindParam(':nsfw', htmlspecialchars($save_nsfw, ENT_QUOTES, 'UTF-8', false), PDO::PARAM_STR); + + $stmt->bindParam(':abi', htmlspecialchars($abi, ENT_QUOTES, 'UTF-8', false), PDO::PARAM_STR); // SQLクエリの実行 $res = $stmt->execute(); @@ -533,14 +533,14 @@ if( !empty($_POST['btn_submit']) ) { // 通知用SQL作成 $stmt = $pdo->prepare("INSERT INTO notification (fromuserid, touserid, msg, url, datetime, userchk, title) VALUES (:fromuserid, :touserid, :msg, :url, :datetime, :userchk, :title)"); - $stmt->bindParam(':fromuserid', htmlentities($fromuserid), PDO::PARAM_STR); - $stmt->bindParam(':touserid', htmlentities($touserid), PDO::PARAM_STR); - $stmt->bindParam(':msg', htmlentities($msg), PDO::PARAM_STR); - $stmt->bindParam(':url', htmlentities($url), PDO::PARAM_STR); - $stmt->bindParam(':userchk', htmlentities($userchk), PDO::PARAM_STR); - $stmt->bindParam(':title', htmlentities($title), PDO::PARAM_STR); + $stmt->bindParam(':fromuserid', htmlspecialchars($fromuserid, ENT_QUOTES, 'UTF-8', false), PDO::PARAM_STR); + $stmt->bindParam(':touserid', htmlspecialchars($touserid, ENT_QUOTES, 'UTF-8', false), PDO::PARAM_STR); + $stmt->bindParam(':msg', htmlspecialchars($msg, ENT_QUOTES, 'UTF-8', false), PDO::PARAM_STR); + $stmt->bindParam(':url', htmlspecialchars($url, ENT_QUOTES, 'UTF-8', false), PDO::PARAM_STR); + $stmt->bindParam(':userchk', htmlspecialchars($userchk, ENT_QUOTES, 'UTF-8', false), PDO::PARAM_STR); + $stmt->bindParam(':title', htmlspecialchars($title, ENT_QUOTES, 'UTF-8', false), PDO::PARAM_STR); - $stmt->bindParam(':datetime', htmlentities($datetime), PDO::PARAM_STR); + $stmt->bindParam(':datetime', htmlspecialchars($datetime, ENT_QUOTES, 'UTF-8', false), PDO::PARAM_STR); // SQLクエリの実行 $res = $stmt->execute(); @@ -568,14 +568,14 @@ if( !empty($_POST['btn_submit']) ) { // 通知用SQL作成 $stmt = $pdo->prepare("INSERT INTO notification (fromuserid, touserid, msg, url, datetime, userchk, title) VALUES (:fromuserid, :touserid, :msg, :url, :datetime, :userchk, :title)"); - $stmt->bindParam(':fromuserid', htmlentities($fromuserid), PDO::PARAM_STR); - $stmt->bindParam(':touserid', htmlentities($touserid), PDO::PARAM_STR); - $stmt->bindParam(':msg', $msg, PDO::PARAM_STR); - $stmt->bindParam(':url', htmlentities($url), PDO::PARAM_STR); - $stmt->bindParam(':userchk', htmlentities($userchk), PDO::PARAM_STR); - $stmt->bindParam(':title', htmlentities($title), PDO::PARAM_STR); + $stmt->bindParam(':fromuserid', htmlspecialchars($fromuserid, ENT_QUOTES, 'UTF-8', false), PDO::PARAM_STR); + $stmt->bindParam(':touserid', htmlspecialchars($touserid, ENT_QUOTES, 'UTF-8', false), PDO::PARAM_STR); + $stmt->bindParam(':msg', htmlspecialchars($msg, ENT_QUOTES, 'UTF-8', false), PDO::PARAM_STR); + $stmt->bindParam(':url', htmlspecialchars($url, ENT_QUOTES, 'UTF-8', false), PDO::PARAM_STR); + $stmt->bindParam(':userchk', htmlspecialchars($userchk, ENT_QUOTES, 'UTF-8', false), PDO::PARAM_STR); + $stmt->bindParam(':title', htmlspecialchars($title, ENT_QUOTES, 'UTF-8', false), PDO::PARAM_STR); - $stmt->bindParam(':datetime', htmlentities($datetime), PDO::PARAM_STR); + $stmt->bindParam(':datetime', htmlspecialchars($datetime, ENT_QUOTES, 'UTF-8', false), PDO::PARAM_STR); // SQLクエリの実行 $res = $stmt->execute(); diff --git a/user/index.php b/user/index.php index 182b5c2..6927179 100644 --- a/user/index.php +++ b/user/index.php @@ -201,6 +201,7 @@ if( !empty($pdo) ) { // プロフィールの絵文字対応 function replaceProfileEmojiImages($postText) { + $postText = str_replace(''', '\'', $postText); // プロフィール名で絵文字名(:emoji:)を検出して画像に置き換える $emojiPattern = '/:(\w+):/'; $postTextWithImages = preg_replace_callback($emojiPattern, function($matches) { @@ -226,6 +227,7 @@ if( !empty($pdo) ) { } // ユーズ内の絵文字を画像に置き換える function replaceEmojisWithImages($postText) { + $postText = str_replace(''', '\'', $postText); // ユーズ内で絵文字名(:emoji:)を検出して画像に置き換える $emojiPattern = '/:(\w+):/'; $postTextWithImages = preg_replace_callback($emojiPattern, function($matches) { @@ -281,8 +283,6 @@ if( !empty($pdo) ) { } function replaceURLsWithLinks($postText) { - $postText = str_replace(''', '\'', $postText); - // URLを正規表現を使って検出 $pattern = '/(https:\/\/[^\s<>\[\]\'"]+)/'; // 改良された正規表現 preg_match_all($pattern, $postText, $matches); @@ -466,14 +466,14 @@ if (!empty($_POST['follow'])) { // 通知用SQL作成 $stmt = $pdo->prepare("INSERT INTO notification (fromuserid, touserid, msg, url, datetime, userchk, title) VALUES (:fromuserid, :touserid, :msg, :url, :datetime, :userchk, :title)"); - $stmt->bindParam(':fromuserid', htmlentities($fromuserid), PDO::PARAM_STR); - $stmt->bindParam(':touserid', htmlentities($touserid), PDO::PARAM_STR); - $stmt->bindParam(':msg', htmlentities($msg), PDO::PARAM_STR); - $stmt->bindParam(':url', htmlentities($url), PDO::PARAM_STR); - $stmt->bindParam(':userchk', htmlentities($userchk), PDO::PARAM_STR); - $stmt->bindParam(':title', htmlentities($title), PDO::PARAM_STR); + $stmt->bindParam(':fromuserid', htmlspecialchars($fromuserid, ENT_QUOTES, 'UTF-8', false), PDO::PARAM_STR); + $stmt->bindParam(':touserid', htmlspecialchars($touserid, ENT_QUOTES, 'UTF-8', false), PDO::PARAM_STR); + $stmt->bindParam(':msg', htmlspecialchars($msg, ENT_QUOTES, 'UTF-8', false), PDO::PARAM_STR); + $stmt->bindParam(':url', htmlspecialchars($url, ENT_QUOTES, 'UTF-8', false), PDO::PARAM_STR); + $stmt->bindParam(':userchk', htmlspecialchars($userchk, ENT_QUOTES, 'UTF-8', false), PDO::PARAM_STR); + $stmt->bindParam(':title', htmlspecialchars($title, ENT_QUOTES, 'UTF-8', false), PDO::PARAM_STR); - $stmt->bindParam(':datetime', htmlentities($datetime), PDO::PARAM_STR); + $stmt->bindParam(':datetime', htmlspecialchars($datetime, ENT_QUOTES, 'UTF-8', false), PDO::PARAM_STR); // SQLクエリの実行 $res = $stmt->execute(); @@ -625,7 +625,7 @@ $pdo = null; -<?php echo htmlentities($userData['username'], ENT_QUOTES, 'UTF-8'); ?> さんのプロフィール - <?php echo htmlspecialchars($serversettings["serverinfo"]["server_name"], ENT_QUOTES, 'UTF-8');?> +<?php echo htmlspecialchars($userData['username'], ENT_QUOTES, 'UTF-8', false); ?> さんのプロフィール - <?php echo htmlspecialchars($serversettings["serverinfo"]["server_name"], ENT_QUOTES, 'UTF-8');?> @@ -685,12 +685,12 @@ $pdo = null;
- +
- -

-

@

+ +

+

@

@@ -698,15 +698,15 @@ $pdo = null;
;">

;"> - +

- +
-

+

@@ -718,7 +718,7 @@ $pdo = null;

からuwuzuを利用しています。

-

+

@@ -727,8 +727,8 @@ $pdo = null;
- - + + @@ -740,7 +740,7 @@ $pdo = null; - +