无法获取jsp文件正常工作,不会执行脚本

时间:2019-07-03 23:00:03

标签: javascript html jsp

我正在尝试制作一个简单的“多搜索引擎”页面,而我的一些代码已经遇到了问题。到目前为止,我只在google中编码,但是它不起作用,我想知道为什么,因为所有代码似乎都是正确的。它根本不会重定向,只给我一个空白页。我正在tomcat服务器(端口8080)上运行jsp文件。希望有人能找到我做错了,谢谢。

这是主页的HTML:

<html>
    <head>
        <title>Multi Search Engine Test</title>
    </head>
    <body>
        <center>
            <h1>Search test</h3>
        </center>
        <br>
        <br>
        <center>
            <form action="192.168.2.127:8080/main/search.jsp" method="POST">
                <input type="text" id="search" name="Search" />
                <select name="site">
                    <option value="google">Google</option>
                    <option value="yahoo">Yahoo</option>
                    <option value="bing">Bing</option>
                    <option value="youtube">Youtube</option>
                    <option value="reddit">Reddit</option>
                    <option value="amazon">Amazon</option>
                    <option value="ebay">Ebay</option>
                </select> 
                <input type="submit" value="Search" />
            </form>
        </center>
    </body>
</html>

这是jsp文件的代码:

<% 
String search=(String)request.getAttribute("search");
String site=(String)request.getAttribute("site");
%>
<script>
    if(site == "google")
    {
        window.open("https://google.com/search?q="+<%= search %>, "_blank");
    }
    else
    {
        window.open("http://192.168.2.127/error.html");
    }
</script>

1 个答案:

答案 0 :(得分:1)

您的jsp代码似乎有一些错误。

例如,if(site == "google")将未定义的JavaScript变量site与字符串“ google”进行比较。我认为您想要if("<%= site %>" == "google"),这意味着您将在引号内打印jsp变量site,因此,生成的JavaScript代码将是与字符串的字符串比较。

window.open("https://google.com/search?q="+<%= search %>, "_blank");上也有类似的错误。例如,如果您发送查询hello world,则jsp将生成代码window.open("https://google.com/search?q="+hello world, "_blank");,它是无效的JavaScript代码。因此,您需要将jsp search变量括在引号中,例如window.open("https://google.com/search?q=" + "<%= search %>", "_blank");,甚至最好对字符串进行编码,因为它将用于URL window.open("https://google.com/search?q="+encodeURIComponent("<%= search %>"), "_blank");

话虽如此,仅使用后端将工作返还给JavaScript是没有意义的。现在,您的后端仅将表单数据回送给JavaScript。

此外,如果操作不正确(安全打印),则可以通过原始打印字符串变量并将其传递给JavaScript来进行跨站脚本(XSS)。例如,在您的情况下,攻击者可能搜索" + alert('xss') + ",并且您的jsp将打印代码window.open("https://google.com/search?q="+encodeURIComponent("" + alert('xss') + ""), "_blank");,该代码最终将在客户端执行。

在表单操作中要考虑的其他事情,总是用协议定义URL,除非它是相对路径(以避免混淆和将来的错误)。因此,请勿使用<form action="192.168.2.127:8080/main/search.jsp" method="POST">使用<form action="http://192.168.2.127:8080/main/search.jsp" method="POST">

请不要使用center,它是2019:P。