将blob内容渲染为代码而不是文本

时间:2012-03-07 07:34:10

标签: grails groovy blob render

我将以下代码保存在oracle数据库中作为blob字段,基本上是html和带有sql的嵌入式groovy代码,返回一些值

<%
        import groovy.sql.Sql

        def sql = Sql.newInstance("jdbc:mysql://localhost:3306/myDB","root", "root", "com.mysql.jdbc.Driver")
%>

<html>
        <head>
                <title>Database Example</title>
        </head>
        <body>
                <table align="center" border="1">
                        <tr>
                                <td>Id</td>
                                <td>LastName</td>
                                <td>FirstName</td>
                        </tr>
                        <% sql.eachRow("select profile_id profileId, last_name lastName, first_name firstName from profile") {profile->  %>
                                <tr>
                                        <td>${profile.profileId}</td>
                                        <td>${profile.lastName}</td>
                                        <td>${profile.firstName}</td>
                                </tr>
                        <% } %>
                </table>
        </body>
</html>

现在我在变量thistemplate.contents中有上面的blob值,我试图在renderthistemplate.gsp上渲染,如下所示:

def renderString= g.render(template:"myController/renderthistemplate",model:[rendertemplate:thistemplate.contents])

现在在gsp中,我只需要${rendertemplate}来打印整个blob。 预计它应该将整个blob作为代码执行并呈现输出。 但它实际上是将blob的内容打印为普通字符串,HTML和groovy代码都不会在目标GSP中执行。 如何让目标GSP实际将blob内容呈现为代码而不是字符串/文本 谢谢 Priyank

1 个答案:

答案 0 :(得分:1)

你做不到。出于安全原因,必须转义字符串中的特殊符号,否则黑客可以输入以下名称:me'; delete from user;,只要在网页上显示名称,就会删除用户表中的所有数据(简化示例但是你明白了。)

你可以render the blob as text使用contentType:"text/html"但不会运行<% %>块中的代码。

解决方案是创建自己的动态模板。你需要两件事:

  1. 在控制器中创建一个新字段:

    GroovyPagesTemplateEngine groovyPagesTemplateEngine
    
  2. 使用此代码渲染blob:

    groovyPagesTemplateEngine.createTemplate(blobAsString, “somepage.gsp”).make(model).writeTo(out)
    
  3. 代码示例来自:Grails – Rendering a Template from a String