diff --git a/src/server/api/endpoints/drive/folders/update.ts b/src/server/api/endpoints/drive/folders/update.ts
index 1dc0e638785c06a20891b4a5687fe67c711bae91..a1ee2669f013527c5fa3dfbcdd4c033ed46d2ceb 100644
--- a/src/server/api/endpoints/drive/folders/update.ts
+++ b/src/server/api/endpoints/drive/folders/update.ts
@@ -83,7 +83,9 @@ export default define(meta, async (ps, user) => {
 	if (ps.name) folder.name = ps.name;
 
 	if (ps.parentId !== undefined) {
-		if (ps.parentId === null) {
+		if (ps.parentId.equals(folder._id)) {
+			throw new ApiError(meta.errors.recursiveNesting);
+		} else if (ps.parentId === null) {
 			folder.parentId = null;
 		} else {
 			// Get parent folder
diff --git a/test/api.ts b/test/api.ts
index 85f37679301cd593c189448089be49e130a8750f..cc4521d3dc858e1c05d04873b3c1f5cf05ecc635 100644
--- a/test/api.ts
+++ b/test/api.ts
@@ -1141,6 +1141,20 @@ describe('API', () => {
 			expect(res).have.status(400);
 		}));
 
+		it('フォルダが循環するような構造にできない(自身)', async(async () => {
+			const arisugawa = await signup({ username: 'arisugawa' });
+			const folderA = (await request('/drive/folders/create', {
+				name: 'test'
+			}, arisugawa)).body;
+
+			const res = await request('/drive/folders/update', {
+				folderId: folderA.id,
+				parentId: folderA.id
+			}, arisugawa);
+
+			expect(res).have.status(400);
+		}));
+
 		it('存在しない親フォルダを設定できない', async(async () => {
 			const alice = await signup({ username: 'alice' });
 			const folder = (await request('/drive/folders/create', {