diff --git a/web/app/libs/uoj-html-lib.php.patch b/web/app/libs/uoj-html-lib.php.patch
new file mode 100644
index 0000000..8625b25
--- /dev/null
+++ b/web/app/libs/uoj-html-lib.php.patch
@@ -0,0 +1,23 @@
+--- UOJ-System/web/app/libs/uoj-html-lib.php 2022-12-30 09:54:05.452022649 +0800
++++ UOJ-Luogu-RemoteJudge/web/app/libs/uoj-html-lib.php 2023-03-21 21:22:31.783213786 +0800
+@@ -989,3 +989,20 @@
+ $config['get_row_index'] = '';
+ echoLongTable($col_names, 'user_info', '1', $tail, $header_row, $print_row, $config);
+ }
++
++function renderMarkdown($content_md) {
++ $purifier = HTML::pruifier();
++
++ try {
++ $v8 = new V8Js();
++ $v8->content_md = $content_md;
++ $v8->executeString(file_get_contents($_SERVER['DOCUMENT_ROOT'] . '/js/marked.js'), 'marked.js');
++ $content = $v8->executeString('marked(PHP.content_md)');
++ } catch (V8JsException $e) {
++ throw new Exception('V8Js error: ' . $e->getMessage());
++ }
++
++ $content = $purifier->purify($content);
++
++ return $content;
++}
diff --git a/web/app/libs/uoj-validate-lib.php.patch b/web/app/libs/uoj-validate-lib.php.patch
new file mode 100644
index 0000000..64f30aa
--- /dev/null
+++ b/web/app/libs/uoj-validate-lib.php.patch
@@ -0,0 +1,10 @@
+--- UOJ-System/web/app/libs/uoj-validate-lib.php 2022-12-30 09:54:05.452022649 +0800
++++ UOJ-Luogu-RemoteJudge/web/app/libs/uoj-validate-lib.php 2023-03-21 21:23:42.635610391 +0800
+@@ -47,3 +47,7 @@
+ function validateIP($ip) {
+ return filter_var($ip, FILTER_VALIDATE_IP) !== false;
+ }
++
++function validateLuoguProblemId($str) {
++ return preg_match('/^(P|B)[1-9][0-9]{3,5}$/', $str);
++}