XSS対策はサーバ側で対処された方がよろしいではないでしょうか。
- サーバ側は生データのままで、js 側で html タグなどをエスケープする場合、もし js 側を改変された場合は対処方法が無く、とても危険な状態だと思います。
diff --git a/src/com/jsonengine/service/crud/CRUDRequest.java b/src/com/jsonengine/service/crud/CRUDRequest.java
index 021d657..5b6e20f 100644
--- a/src/com/jsonengine/service/crud/CRUDRequest.java
+++ b/src/com/jsonengine/service/crud/CRUDRequest.java
@@ -5,6 +5,8 @@ import java.util.Map;
import net.arnx.jsonic.JSON;
+import org.slim3.util.HtmlUtil;
+
import com.jsonengine.common.JERequest;
import com.jsonengine.model.JEDoc;
@@ -57,6 +59,14 @@ public class CRUDRequest extends JERequest {
if (jsonDoc != null) {
// decode jsonDoc and fill it into jsonMap
jsonMap = JSON.decode(jsonDoc, Map.class);
+
+ for (final String i : jsonMap.keySet()) {
+ final Object target = jsonMap.get(i);
+ if (target instanceof String) {
+ jsonMap.put(i, HtmlUtil.escape((String) target));
+ }
+ }
+
setDocId((String) jsonMap.get(JEDoc.PROP_NAME_DOCID));
} else {
jsonMap = null;
最低でも Google アカウントでログインしたユーザのみ put や get が実行可能にすべきではないでしょうか。
- API に準拠していれば、どのような docType でも保存することができます。それゆえ、サーバ側で docType すべてをあらかじめ把握することはできないので、アクセスレベル設定では完全に制御できないと思います。
- datastore は無限に無料ではないので、やはり、あらゆるアクセスが無制限に可能な状況というのは回避すべきだと思います。
- jsonengine を使用したサービスに登録したユーザのみアクセスできる、というのが最も理想的だとは思いますが、このレベルになると汎用性の確保が難しくなるかも知れませんね。
diff --git a/src/com/jsonengine/service/crud/CRUDService.java b/src/com/jsonengine/service/crud/CRUDService.java
index 8bdb2ab..c16a010 100644
--- a/src/com/jsonengine/service/crud/CRUDService.java
+++ b/src/com/jsonengine/service/crud/CRUDService.java
@@ -169,40 +170,45 @@ public class CRUDService {
public String put(CRUDRequest jeReq) throws JEConflictException,
JEAccessDeniedException {
- // try to find an existing JEDoc for the docId
- final Transaction tx = Datastore.beginTransaction();
(snip)
+ if (JEUserUtils.isLoggedIn()) {
+ // try to find an existing JEDoc for the docId
+ final Transaction tx = Datastore.beginTransaction();
(snip)
- // return the saved JSON document
- return JSON.encode(jeDoc.getDocValues());
+ // return the saved JSON document
+ return JSON.encode(jeDoc.getDocValues());
+ } else {
+ return null;
+ }
}
}
データアクセスのデフォルトは、private だと嬉しいです。
- この辺りになると、いよいよ汎用性との絡みなってくると思われますので、あくまで要望です。
diff --git a/src/com/jsonengine/service/query/QueryService.java b/src/com/jsonengine/service/query/QueryService.java
index 45af946..1cc02a1 100644
--- a/src/com/jsonengine/service/query/QueryService.java
+++ b/src/com/jsonengine/service/query/QueryService.java
@@ -41,10 +41,15 @@ public class QueryService {
// check if this is a "private" query
final DocTypeInfo jdti =
(new DocTypeService()).getDocTypeInfo(queryReq.getDocType());
- final boolean isPrivate =
- jdti != null
- && DocTypeService.ACCESS_LEVEL_PRIVATE.equals(jdti
+
+ boolean isPrivate;
+ if (jdti != null) {
+ isPrivate =
+ DocTypeService.ACCESS_LEVEL_PRIVATE.equals(jdti
.getAccessLevelForRead());
+ } else {
+ isPrivate = true;
+ }
// build query (add in-memory filtering with createdBy if it's a private
// query)