Skip to content

Conversation

@yoneyan
Copy link
Member

@yoneyan yoneyan commented Sep 15, 2024

対象のIssue番号

fixes #43

変更内容

  • 差分確認用

変更理由

  • なにか

@task-automation-tool task-automation-tool bot changed the title phase1の完成 phase1の機能実装 [feat/#43] Sep 15, 2024
<link rel="stylesheet"
href="https://cdn.jsdelivr.net/npm/flatpickr/dist/flatpickr.min.css">
<!-- jquery -->
<script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>

Check warning

Code scanning / CodeQL

Inclusion of functionality from an untrusted source Medium

Script loaded from content delivery network with no integrity check.
html += '<div class="message my-message">' + message + '</div>';
}
html += '</li>';
element.insertAdjacentHTML('beforebegin', html);

Check failure

Code scanning / CodeQL

Client-side cross-site scripting High

Cross-site scripting vulnerability due to
user-provided value
.

Copilot Autofix

AI 7 months ago

To fix the issue, all user-provided data (e.g., data.username and data.time) must be sanitized before being inserted into the DOM. The escapeHTML function already exists in the code and can be reused to sanitize these fields. This ensures that any potentially malicious content is properly escaped, preventing XSS attacks.

The changes involve:

  1. Applying the escapeHTML function to data.username and data.time before interpolating them into the html string.
  2. Ensuring that all dynamic content in the HTML string is sanitized.

Suggested changeset 1
dsbd/templates/custom_admin/ticket/chat.html

Autofix patch

Autofix patch
Run the following command in your local git repository to apply this patch
cat << 'EOF' | git apply
diff --git a/dsbd/templates/custom_admin/ticket/chat.html b/dsbd/templates/custom_admin/ticket/chat.html
--- a/dsbd/templates/custom_admin/ticket/chat.html
+++ b/dsbd/templates/custom_admin/ticket/chat.html
@@ -379,3 +379,3 @@
           html += '<div class="message-data text-end">';
-          html += '<span class="message-data-time">(' + data.time + ')</span> '
+          html += '<span class="message-data-time">(' + escapeHTML(data.time) + ')</span> '
           if (data.is_admin) {
@@ -391,3 +391,3 @@
           if (data.username !== '{{ request.user.username }}') {
-            tmp_username = data.username;
+            tmp_username = escapeHTML(data.username);
           }
@@ -398,3 +398,3 @@
           }
-          html += '<span class="message-data-time">(' + data.time + ')</span>';
+          html += '<span class="message-data-time">(' + escapeHTML(data.time) + ')</span>';
           html += '</div>';
EOF
@@ -379,3 +379,3 @@
html += '<div class="message-data text-end">';
html += '<span class="message-data-time">(' + data.time + ')</span> '
html += '<span class="message-data-time">(' + escapeHTML(data.time) + ')</span> '
if (data.is_admin) {
@@ -391,3 +391,3 @@
if (data.username !== '{{ request.user.username }}') {
tmp_username = data.username;
tmp_username = escapeHTML(data.username);
}
@@ -398,3 +398,3 @@
}
html += '<span class="message-data-time">(' + data.time + ')</span>';
html += '<span class="message-data-time">(' + escapeHTML(data.time) + ')</span>';
html += '</div>';
Copilot is powered by AI and may make mistakes. Always verify output.
html += '<div class="message my-message">' + message + '</div>';
}
html += '</li>';
element.insertAdjacentHTML('beforebegin', html);

Check failure

Code scanning / CodeQL

Client-side cross-site scripting High

Cross-site scripting vulnerability due to
user-provided value
.

Copilot Autofix

AI 7 months ago

To fix the issue, all user-provided data used in constructing the HTML string must be sanitized to prevent XSS. The escapeHTML function should be applied to all fields that are interpolated into the HTML, including data.time, data.username, and data.is_admin. Additionally, the use of insertAdjacentHTML should be replaced with safer alternatives, such as creating DOM elements programmatically and appending them to the DOM.


Suggested changeset 1
dsbd/templates/ticket/chat.html

Autofix patch

Autofix patch
Run the following command in your local git repository to apply this patch
cat << 'EOF' | git apply
diff --git a/dsbd/templates/ticket/chat.html b/dsbd/templates/ticket/chat.html
--- a/dsbd/templates/ticket/chat.html
+++ b/dsbd/templates/ticket/chat.html
@@ -366,22 +366,44 @@
         let message = escapeHTML(data.message).replace(/\n/g, '<br>');
+        let time = escapeHTML(data.time);
+        let username = escapeHTML(data.username);
+
+        let li = document.createElement('li');
+        li.className = 'clearfix';
 
-        let html = '<li class="clearfix">';
         if (data.username === '{{ request.user.username }}' && !data.is_admin) {
-          html += '<div class="message-data text-end">';
-          html += '<span class="message-data-time">(' + data.time + ')</span> あなた'
-          html += '</div>';
-          html += '<div class="message other-message float-right">' + message + '</div>'
+          let messageData = document.createElement('div');
+          messageData.className = 'message-data text-end';
+          messageData.innerHTML = `<span class="message-data-time">(${time})</span> あなた`;
+          li.appendChild(messageData);
+
+          let messageDiv = document.createElement('div');
+          messageDiv.className = 'message other-message float-right';
+          messageDiv.innerHTML = message;
+          li.appendChild(messageDiv);
         } else {
-          html += '<div class="message-data">';
+          let messageData = document.createElement('div');
+          messageData.className = 'message-data';
+
           if (data.is_admin) {
-            html += '<span class="badge bg-primary">管理者</span>';
+            let adminBadge = document.createElement('span');
+            adminBadge.className = 'badge bg-primary';
+            adminBadge.textContent = '管理者';
+            messageData.appendChild(adminBadge);
           } else {
-            html += data.username;
+            messageData.textContent = username;
           }
-          html += '<span class="message-data-time">(' + data.time + ')</span>';
-          html += '</div>';
-          html += '<div class="message my-message">' + message + '</div>';
+
+          let timeSpan = document.createElement('span');
+          timeSpan.className = 'message-data-time';
+          timeSpan.textContent = `(${time})`;
+          messageData.appendChild(timeSpan);
+          li.appendChild(messageData);
+
+          let messageDiv = document.createElement('div');
+          messageDiv.className = 'message my-message';
+          messageDiv.innerHTML = message;
+          li.appendChild(messageDiv);
         }
-        html += '</li>';
-        element.insertAdjacentHTML('beforebegin', html);
+
+        element.parentNode.insertBefore(li, element);
       };
EOF
@@ -366,22 +366,44 @@
let message = escapeHTML(data.message).replace(/\n/g, '<br>');
let time = escapeHTML(data.time);
let username = escapeHTML(data.username);

let li = document.createElement('li');
li.className = 'clearfix';

let html = '<li class="clearfix">';
if (data.username === '{{ request.user.username }}' && !data.is_admin) {
html += '<div class="message-data text-end">';
html += '<span class="message-data-time">(' + data.time + ')</span> あなた'
html += '</div>';
html += '<div class="message other-message float-right">' + message + '</div>'
let messageData = document.createElement('div');
messageData.className = 'message-data text-end';
messageData.innerHTML = `<span class="message-data-time">(${time})</span> あなた`;
li.appendChild(messageData);

let messageDiv = document.createElement('div');
messageDiv.className = 'message other-message float-right';
messageDiv.innerHTML = message;
li.appendChild(messageDiv);
} else {
html += '<div class="message-data">';
let messageData = document.createElement('div');
messageData.className = 'message-data';

if (data.is_admin) {
html += '<span class="badge bg-primary">管理者</span>';
let adminBadge = document.createElement('span');
adminBadge.className = 'badge bg-primary';
adminBadge.textContent = '管理者';
messageData.appendChild(adminBadge);
} else {
html += data.username;
messageData.textContent = username;
}
html += '<span class="message-data-time">(' + data.time + ')</span>';
html += '</div>';
html += '<div class="message my-message">' + message + '</div>';

let timeSpan = document.createElement('span');
timeSpan.className = 'message-data-time';
timeSpan.textContent = `(${time})`;
messageData.appendChild(timeSpan);
li.appendChild(messageData);

let messageDiv = document.createElement('div');
messageDiv.className = 'message my-message';
messageDiv.innerHTML = message;
li.appendChild(messageDiv);
}
html += '</li>';
element.insertAdjacentHTML('beforebegin', html);

element.parentNode.insertBefore(li, element);
};
Copilot is powered by AI and may make mistakes. Always verify output.
@yoneyan yoneyan force-pushed the feat/#43 branch 2 times, most recently from 03d64d0 to ac4c519 Compare May 6, 2025 18:11
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

phase1の機能実装

2 participants