哪种解决方案是清理<;URL的正确方法;img>&&书信电报;a href>;GWT中的标签?

哪种解决方案是清理<;URL的正确方法;img>&&书信电报;a href>;GWT中的标签?,gwt,Gwt,我在谷歌上搜索如何在GWT中清理URL,发现有太多不同的方法可以做到这一点。我很困惑&我无法做出决定 所以,假设您有一个允许用户输入HTMLURL的文本框&然后您可以在将url字符串插入数据库之前将其包装在或标记中。有一个表有一列存储html代码,如下所示: <a href=\"...\">AA</a> <img src=\"http://xxxx\"> //more html rows here <img src=\"http://car.com/

我在谷歌上搜索如何在GWT中清理URL,发现有太多不同的方法可以做到这一点。我很困惑&我无法做出决定

所以,假设您有一个允许用户输入HTMLURL的文本框&然后您可以在将url字符串插入数据库之前将其包装在或标记中。有一个表有一列存储html代码,如下所示:

<a href=\"...\">AA</a>
<img src=\"http://xxxx\">
//more html rows  here
<img src=\"http://car.com/pic.gif\">
但是用户可以输入任何内容,因此我们必须确保url输入是安全的。以下是一些选择:

-备选案文1:

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
}
String str=”http://car.com/pic.gif";
如果(!UriUtils.isSafeUri(str)){
字符串safeStrURI=UriUtils.sanitizeUri(“
”); storeUrl(safeStrURI);//将html字符串存储到数据库中 }
-备选案文2:

    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
String str=”http://car.com/pic.gif";
SafeHtmlBuilder=新的SafeHtmlBuilder();
builder.appendHtmlConstant(“
”); 字符串safeStrURI=builder.toString(); storeUrl(safeStrURI);//将html字符串存储到数据库中
-备选案文3:

String str="http://car.com/pic.gif";
String safeStrURI="<img src="+UriUtils.fromString(str).asString()+"><br/>";
storeUrl(safeStrURI);// store html string into DB
String str=”http://car.com/pic.gif";
字符串safeStrURI=“
”; storeUrl(safeStrURI);//将html字符串存储到数据库中
/。。。。。还有一些解决方案,但我不知道

我不明白为什么谷歌不为实现这一目标而制定一两种方法,为什么有这么多的方法让我非常困惑

那么,哪个选项对解决我的问题有好处呢

或者你知道其他选择吗?

  • 选项1已失效
    sanitizeUri
    应该在
    str
    上应用,然后再与HTML位连接。这使得它或多或少相当于选项3,对
    isSafeUri
    的调用进行模化

  • 选项2是不安全的,并且由于传递给
    appendHtmlConstant
    的值而实际失败(请参阅)

在我看来,您应该首先检查
isSafeUri
,然后,为了真正安全,您应该连接值,但确保生成有效的HTML(例如,值中的
不会关闭您的属性值)。为此,您有
SafeHtml
,但它只在元素级别工作;如果需要更深入的话(在属性级别),然后您就有了(注意,它只能在客户端代码中使用,与
SafeHtml
SafeUri
相反)

接口模板扩展了安全HtmlTemplates{
@模板(“”)
SafeHtml-img(SafeUri);
}
静态最终模板TEMPLATE=GWT.create(Templates.class);
如果(UriUtils.isSafeUri(str)){
字符串img=TEMPLATE.img(UriUtils.fromString(str)).asString();
商店(img);
}

非常感谢您的回答,但我只是想知道。我需要在服务器级别检查“字符串img”吗?如果在客户端级别我们确定“字符串img”,但在传递到服务器时,img不知何故被更改了呢?但我正在使用GWTP&我设置了SecurityCookie,所以我还需要在服务器级别检查吗?你是说“安全HTMLTemplates”“只能在客户端代码中使用?您能进一步解释吗?或者您认为这样更好,将str=”“存储到一列中&还有一列将其标记为image。当我们向用户显示它时,myHtml=safehtmlitls.fromSafeConstant(TEMPLATE.img(UriUtils.fromString(str)).asString())
SafeHtmlTemplates
依赖于GWT生成器(
GWT.create()
)生成代码,因此它不会在GWT环境(例如服务器端)之外工作。在服务器端(和客户端),您应该能够使用
,但一般来说,是的,我认为避免存储HTML更安全。