XSSを避けたセキュアなプログラミング

そもそもKintone以前の問題なのですが、

viewモードで定義されたボタンを押したときに条件を満たさない場合(例えばある項目がNullだったりするとか)に、Alertを出した後に強制的に編集モードに移行したかったのですが、

//強制的に編集モードに移行する

Alert(‘必須項目はすべて入力するように!’);
var urlOld = window.location.href;
var urlEdit = urlOld.replace(‘=show’, ‘=edit’);
window.open(urlEdit, ‘_self’);

動作自体は問題ないのですが、jswatchdogで検証してみると1行目で

Line 131, XSS Warning!!:

var urlOld = window.location.href;

が発生してしまいます。warningをなくしないと気持ちが収まらないと言うこともさることながら、セキュアなプログラミングという観点からもここは解決しておきたいのですが、

var urlOld = encodeURIComponent(window.location.href);

でエンコードしてみると「リンクがありません」で動作してくれません。何か解決策はあるでしょうか?

またはURLを書き換えなくても編集モードに行ってしまえばそれが一番の解決なのですが。

 

Naohiro Fukuda さん

編集ボタンをクリックしたときと挙動が異なりますが、下記のコードで編集画面に遷移が可能です。
ただし、動作保証はありませんので、仕様変更で動かなくなる可能性があります。

var editDiv = document.getElementsByClassName('gaia-argoui-app-menu-content');
if(editDiv.length > 2){
editDiv[2].click();
}

※位置を直しました。

すみません、editDiv[2].click(); は、複写でした。
追加[0]・複写[2]が動作しましたが、編集[1] が、動作しません。

dispatchEvent なども試してみましたが、編集画面に遷移できませんでした。
click イベントは、あきらめて、 url を組み立ててみます。
ビューやフィルター条件などはurlから取得し、指定値は念のため、再エンコードしてみました。

var appUrl = kintone.api.url('/k/' + event.appId + '/show@', true);
appUrl = appUrl.replace('@.json', '');
appUrl += '#record=' + event.recordId;
var strKeys = ['l.view=', 'l.q=', 'l.sort_\\d=', 'l.order_\\d=', 'l.size='];
var param = '';
for (var i = 0; i < strKeys.length; i++) {
var regexp = new RegExp(strKeys[i] + '(.*?)(&|$)', 'g');
var pOptions = location.hash.match(regexp);
if (pOptions) {
for (var j = 0; j < pOptions.length; j++) {
var option = pOptions[j].split('=');
var key = option[0] + '=(.*?)(&|$)';
var value = pOptions[j].match(key);
param += '&' + option[0] + '=' + encodeURIComponent(decodeURIComponent(value[1]));
}
}
}
param += '&mode=edit';
appUrl += param;
location.href = appUrl;