0

使用常规 JSP 表单打印到客户端时,配置 web.xml 对我来说正确工作(http://stackoverflow.com/questions/2147958/how-do-i-prevent-people-from-doing-xss-in -java)。

是否有关于如何转义/实体化字符串的“最佳实践”,这些字符串将通过 JSON 发送到 jQuery 函数,然后用这些值填充 DOM?任何推荐的库或 Spring Web Framework 内置插件?

  1. jQuery $.ajax 调用 Spring MVC
  2. Spring MVC 以 JSON 响应
  3. (魔术编码发生,例如<a>变成&lt;a&gt;)<=这个
  4. jQuery 接收 JSON 并填充 DOM XSS 安全

提前致谢!

编辑:我有时也会故意发送 HTML,因此解决方案需要能够仅处理用户输入。可能会证明每个用户中毒的字符串都必须手动清理?

4

1 回答 1

1

试试我写给我用的这个类。检查是否缺少任何情况可能很有用。. . 因为还没有对此进行详细的测试。

如果出现任何问题,请告诉我。. . (添加对应的jar Apache commons和net.sf.json)

package myutil;

import java.util.Iterator;

import net.sf.json.JSONArray;

import net.sf.json.JSONObject;

import org.apache.commons.lang.StringEscapeUtils;

public class JSONCleaner {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        JSONObject jsonchild2=new JSONObject();
        jsonchild2.put("subchlidkey1", "subchildvalue1");
        jsonchild2.put("subchlidkey2", "subchildvalue2");
        jsonchild2.put("subchlidkey3", "subchildvalue3");

        JSONObject jsonchild=new JSONObject();
        jsonchild.put("chlidkey1", "childvalue1");
        jsonchild.put("chlidkey2", "childvalue2");
        jsonchild.put("chlidkey3", "childvalue3");

        JSONArray jsonarray=new JSONArray();
        jsonarray.add("option1");
        jsonarray.add("<p>option2</p>");
        jsonarray.add(jsonchild2);

        JSONObject json=new JSONObject();
        json.put("name", "<b>nirbhay</b>");
        json.put("age", 23);
        json.put("jsonChildObject", jsonchild);
        json.put("weight", 65);
        json.put("array", jsonarray);

        System.out.println(cleanJSONObject(json));
        //System.out.println(json.getString("name"));
    }

    public static JSONObject cleanJSONObject(JSONObject jsonObject)
    {
        JSONObject returnJson=new JSONObject();
        Iterator<?> keys = jsonObject.keys();
        while( keys.hasNext() ){
            String key = (String)keys.next();
            //System.out.println(jsonObject.get(key));
            if(jsonObject.optJSONObject(key)==null)
            {
                if(jsonObject.optJSONArray(key)!=null)
                {
                returnJson.put(key, cleanJSONArray(jsonObject.getJSONArray(key)));
                }
                else
                {
                    returnJson.put(key, StringEscapeUtils.escapeHtml(jsonObject.getString(key)));
                }
            }
            else
            {
                returnJson.put(key,cleanJSONObject(jsonObject.optJSONObject(key)));
            }
        }

        return returnJson;
    }

    private static JSONArray cleanJSONArray(JSONArray array)
    {

        JSONArray returnArray=new JSONArray();
        for(int i=0,j=array.size();i<j;i++)
        {
            if(array.optJSONObject(i)==null)
            {
                if(array.optJSONArray(i) != null)
                {
                returnArray.add(cleanJSONArray((JSONArray) array.get(i)));
                }
                else
                {
                    returnArray.add(StringEscapeUtils.escapeHtml(array.getString(i)));
                }
            }
            else
            {
                returnArray.add(cleanJSONObject((JSONObject) array.get(i)));
            }

        }
        return returnArray;
    }
}
于 2013-02-20T09:44:49.180 回答