我在Google上搜索如何清理GWT中的URL&找到了太多不同的方法来做到这一点。我很困惑&我无法做出决定。
所以,假设你有一个文本框,允许用户输入html url&然后你可以将该url字符串包装在内部或标记中,然后将其插入到DB中。有一个表有一个存储html代码的列,如下所示:
<a href=\"...\">AA</a>
<img src=\"http://xxxx\">
//more html rows here
所以假设用户输入http://car.com/pic.gif
,然后在用户点击“提交”按钮后,我想将其存储在myDB中,如下所示:
<img src=\"http://car.com/pic.gif\">
但是用户可以输入任何内容,因此我们必须确保网址输入是安全的。所以这里有一些选择:
-Option1:
String str="http://car.com/pic.gif";
if(!UriUtils.isSafeUri(str)){
String safeStrURI=UriUtils.sanitizeUri("<img src="+str+"><br/>");
storeUrl(safeStrURI);// store html string into DB
}
-option2:
String str="http://car.com/pic.gif";
SafeHtmlBuilder builder = new SafeHtmlBuilder();
builder.appendHtmlConstant("<img src=");
builder.appendEscaped(str);
builder.appendHtmlConstant("><br/>");
String safeStrURI=builder.toString();
storeUrl(safeStrURI);// store html string into DB
-Option3:
String str="http://car.com/pic.gif";
String safeStrURI="<img src="+UriUtils.fromString(str).asString()+"><br/>";
storeUrl(safeStrURI);// store html string into DB
/ .....还有一些解决方案,但我不知道
我不明白Google为什么不做出1或2种方法来实现这一目标,为什么有这么多方法可以让我非常困惑。
那么,哪个选项有助于解决我的问题。
或者您知道其他选择吗?
答案 0 :(得分:2)
选项1已损坏。在sanitizeUri
与HTML位连接之前,str
应该应用isSafeUri
。这使它或多或少等同于选项3,模拟对appendHtmlConstant
的调用。
选项2不安全,实际上会失败,因为传递给isSafeUri
的值(参见javadoc)
IMO,您应首先检查"
,然后,为了确保安全,您应该连接值,但要确保生成有效的HTML(例如'
或SafeHtml
值不会关闭您的属性值)。为此你有SafeHtml
但它只适用于元素级别;如果您需要更深入(在属性级别),那么您有SafeHtmlTemplates
(请注意,它只能在客户端代码中使用,与SafeUri
相反, interface Templates extends SafeHtmlTemplates {
@Template("<img src=\"{0}\">")
SafeHtml img(SafeUri uri);
}
static final Templates TEMPLATE = GWT.create(Templates.class);
if (UriUtils.isSafeUri(str)) {
String img = TEMPLATE.img(UriUtils.fromString(str)).asString();
store(img);
}
)
{{1}}