【问题标题】:Using single quotes in a search bar在搜索栏中使用单引号
【发布时间】:2016-09-26 04:14:10
【问题描述】:

我正在尝试在我的 SQL 数据库中搜索条目,但每当我在搜索栏中输入单引号并运行它时,都会出现错误。当我键入特定名称时,它会从数据库中返回正确的条目。我已经阅读了有关使用“”、转义和使用准备好的语句的信息,但要么没有一个答案适合我的情况,要么我在概念上不理解某些东西。 (我是初学者)提前谢谢! :)

下面是我的 jsp 文件的代码,运行时的样子,以及插入单引号时会发生什么。

<%@page import="java.sql.*"%>
<%@ page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1"%>

<!DOCTYPE html >
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>List of Entries</title>
</head>
<body>
    <h1>Retrieve Data</h1>
    <form method="post" action="index.jsp">
        Search <input type="text" name="search"
            placeholder="Enter your search here..." /> 
            <input type="submit"
            value="Search" name="submit"/>
    </form><br><br>
    <%
        Connection con = null;
        Statement stmt = null;
        ResultSet rs = null;
        ResultSet rs2 = null;


        try {
            String searchReq = request.getParameter("search");
            try {
                Class.forName("com.mysql.jdbc.Driver");
            } catch (ClassNotFoundException e) {
                e.printStackTrace();
            }
            //make connection to db
            con = DriverManager.getConnection(
                    "jdbc:mysql://localhost:3306/profile", "root", "");

            //create a statement
            stmt = con.createStatement();

            //executes SQL query
            rs = stmt.executeQuery("SELECT * FROM person WHERE Name LIKE '%"+ searchReq +"%'");
    %>

    <table border="1">
        <tr>
            <td><b>Name</b></td>
            <td><b>Birthday</b></td>
            <td><b>Address</b></td>
            <td><b>Gender</b></td>
            <td><b>School</b></td>
        </tr>

        <%
            try {
                    while (rs.next()) {
        %>

        <tr>
            <td><%=rs.getString("Name")%></td>
            <td><%=rs.getString("Birthday")%></td>
            <td><%=rs.getString("Address")%></td>
            <td><%=rs.getString("Gender")%></td>
            <td><%=rs.getString("School")%></td>
        </tr>

        <%
            }
                } catch (Exception e) {
                    e.printStackTrace();
                }
        %>

    </table>
    <%
        }

        catch (Exception e) {
            e.printStackTrace();
        }

        finally {

            rs.close();
            stmt.close();
            con.close();

        }
    %>
</body>
</html>

jsp page with search bar

error page

【问题讨论】:

  • 不要对查询进行更严格的字符串化,使用参数。另外你使用的是什么SQL? (SQL-Server、MYSQL、Oracle)
  • @Chuck MYSQL。对不起,你说的更紧是什么意思?
  • 改用PreparedStatement。并从您的 JSP 页面中删除所有 Java 代码和 SQL 语句。该逻辑应该在 servlet 或自定义标记中。

标签: java mysql sql search quotes


【解决方案1】:

你的主要问题在这里:

"SELECT * FROM person WHERE Name LIKE '%"+ searchReq +"%'"

当变量 searchReq 包含单引号时,您正在创建 sql 查询:

SELECT * FROM person WHERE Name LIKE '%'%'
                                       ^ sql engine consider this as end of string literal

当数据库试图解析这个查询时,它会找到正确的部分SELECT * FROM person WHERE Name LIKE '%',然后找到无效的部分%'

这和纯java一样,如果你想在里面声明"的字符串,你试试:

String s = "my string with " quote";
                           ^ java considers this as end of string literal

你会得到语法错误信息,你需要转义这样的符号,对于java它是\"

因此,要解决此问题,您需要使用参数查询,或检查sql standard

::= |

::=

所以,单引号应该存在/转义为双单引号''

所以,如果您只是将所有 ' 替换为 '' - 您将摆脱 sql 注入并修复失败的查询。

最简单的方法是searchReq = searchReq.replaceAll("'", "''");

但是,sql 运算符 LIKE 有 2 个额外的特殊符号 %_

如果未指定 ,则 P 中的每个 字符表示任意字符说明符,P 中的每个 字符表示任意字符串说明符,并且 P 中的每个字符都不是 字符也不 字符代表它自己。

考虑如果用户输入这些符号,您的查询会发现什么?

提示:看看标准:

::= [ NOT ] LIKE [ ESCAPE ]

【讨论】:

  • 哇,感谢您的详尽回答! :) 但是我仍然不完全确定如何处理这些信息
  • @episkeyyy 暂时忘记 java,尝试创建不同的 sql 查询,创建测试行,在其中输入百分号,然后尝试构建只返回这一行的类似查询,并非所有行
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-11-27
  • 1970-01-01
  • 1970-01-01
  • 2018-08-01
  • 1970-01-01
  • 2012-06-14
  • 1970-01-01
相关资源
最近更新 更多