サニタイズ
概要
Nodeblocksでは、クライアント側から受け取ったすべてのデータは、システムによって処理される前にサニタイズされます。
サニタイズには2つの部分が含まれます:
- HTML形式のエスケープ
- SQLのエスケープ
主な目的は2つあります:
- XSS攻撃を防ぐ
- SQLインジェクションを防ぐ
詳細
HTMLのエスケープについて、Nodeblocksはsanitize-htmlライブラリを使用し、リクエストパラメーター(param, query, body)内のすべての文字列フィールドを処理します。 これはHTMLタグやシンボルをエスケープするだけでなく、いくつかの危険なHTMLタグも削除します。
SQLのエスケープについて、NStarは内部の文字列エスケープ関数を使用します。
const escapeSql = (str: string): string => {
str = str.replace(/\0/g, '\\0');
str = str.replace(/\n/g, '\\n');
str = str.replace(/\r/g, '\\r');
str = str.replace(/\032/g, '\\Z');
str = str.replace(/(['"]+)/g, '\\$1');
return str;
}
サニタイズプロセス全体について:
const sanitizeString = (rawString: string): string =>
escapeSql(sanitizeHtml(rawString));
逆変換
サニタイズされた文字列を使用する場合、逆変換プロセスが必要なことがあります。
sanitize-htmlによって一部のデータが直接破棄されるため、逆変換プロセスでは元の文字列と同じ結果が得られるとは限りません。
どこで
フロントエンドがプレゼンテーションを担当しているため、通常、アンエスケープはフロントエンドで行われます。
どのように
HTMLのアンエスケープには、heが選択肢の一つです he.
import he from 'he';
const unescapeHtml = he.unescape(escapedHtml);
function unescapeSql(escapedString: string): string {
return escapedString
.replace(/\\0/g, '\0')
.replace(/\\n/g, '\n')
.replace(/\\r/g, '\r')
.replace(/\\Z/g, '\x1a')
.replace(/\\'/g, "'")
.replace(/\\"/g, '"')
.replace(/\\\\/g, '\\');
}
プロセス全体について:
import he from 'he';
const reversedString = he.unescape(unescapeSql(sanitizedString))