Java 如何从用户输入中转义撇号
因此,我正在将.csv文件中的信息导入数据库。然而,我对csv文件中用户输入的描述有问题,因为它们包含撇号,这破坏了SQL导入 我的导入语句是字符串sqlJob=Java 如何从用户输入中转义撇号,java,sql,jdbc,escaping,Java,Sql,Jdbc,Escaping,因此,我正在将.csv文件中的信息导入数据库。然而,我对csv文件中用户输入的描述有问题,因为它们包含撇号,这破坏了SQL导入 我的导入语句是字符串sqlJob= "INSERT INTO job (ID, Job_Contact, Internal_Comment, Customer_Name," + " Duration, Job_Location, Job_Completion_Date, Job_Technician," + " Job_Asset, Job_Type, Jo
"INSERT INTO job (ID, Job_Contact, Internal_Comment, Customer_Name,"
+ " Duration, Job_Location, Job_Completion_Date, Job_Technician,"
+ " Job_Asset, Job_Type, Job_Description) VALUES ('"
+csvRecord.get(i)+"', '"+csvRecord.get(26)+"', '"+csvRecord.get(16)
+"', '"+csvRecord.get(2)+"', '"+csvRecord.get(31)+"', '"+csvRecord.get(27)
+"', '"+csvRecord.get(28)+"', '"+csvRecord.get(29)+"', '"+csvRecord.get(30)
+"', '"+csvRecord.get(33)+"', '"+csvRecord.get(34)+"');";
简化的表格将是
"INSERT INTO job (ID, Description) VALUES ('"
+ csvRecord.get(i) + "', '" + csvRecord.get(34) + "');";
问题是csvRecord.get(34)
有时会包含撇号。例如,“我的名字是Bob”,Bob中的撇号打破了周围的撇号,这些撇号是声明值是SQL的字符串所必需的
是否有一种简单的方法可以解析字符串并在撇号前面添加转义字符,或者我应该以不同的方式格式化原始SQL命令
谢谢 问题在于,您正在将SQL语句组装为字符串,并将参数值连接在一起。这是极不可取的 使用易于使用的
PreparedStatement
s。您可以不经任何修改就传递参数,并且它们不会干扰SQL语句的正确执行
另外,作为一项有价值的奖励,您的代码将不会出现SQL注入问题
示例来自:
如您所见,参数没有连接到字符串中,但它们将取代?
符号
即使
coffeeName
具有值“非洲最好的”
(包括撇号),查询也会运行良好。使用PreparedStatement,这样您就可以保存了
String name = request.getParameter( "ID" );
String message = request.getParameter( "Job_Contact" );
Connection c = null;
try
{
String url = "jdbc:mysql://localhost/**"databasename"**;
String username = "**<Database Login>**";
String password = "**<Database password>**";
**// at the ? section you can add any quantity you need to**
String sql = "insert into **<databasename>**(name, message) values (?, ?)";
c = DriverManager.getConnection( url, username, password );
PreparedStatement pstmt = c.prepareStatement( sql );
pstmt.setString( 1, name );
pstmt.setString( 2, message );
pstmt.executeUpdate();
}
catch( SQLException e )
{
throw new ServletException( e );
}
finally
{
try
{
if( c != null ) c.close();
}
catch( SQLException e )
{
throw new ServletException( e );
}
}
String name=request.getParameter(“ID”);
String message=request.getParameter(“Job_Contact”);
连接c=null;
尝试
{
String url=“jdbc:mysql://localhost/**“数据库名称”**;
字符串username=“****”;
字符串密码=“****”;
**//在?部分,您可以添加需要添加的任何数量**
字符串sql=“插入****(名称、消息)值(?,)”;
c=DriverManager.getConnection(url、用户名、密码);
PreparedStatement pstmt=c.prepareStatement(sql);
pstmt.setString(1,名称);
pstmt.setString(2,消息);
pstmt.executeUpdate();
}
捕获(SQLE异常)
{
抛出新的ServletException(e);
}
最后
{
尝试
{
如果(c!=null)c.close();
}
捕获(SQLE异常)
{
抛出新的ServletException(e);
}
}
使用参数化查询而不是串接字符串。@程序员的回答提到了这一点和解决方案,但“SQL注入”“是您在尝试使用自己的角色转义代码时面临的主要问题。如果您使用可以为您管理参数的库,则会更安全,最终也更容易。好的,非常感谢!我不太清楚准备好的声明的目的,但这很有道理。
String name = request.getParameter( "ID" );
String message = request.getParameter( "Job_Contact" );
Connection c = null;
try
{
String url = "jdbc:mysql://localhost/**"databasename"**;
String username = "**<Database Login>**";
String password = "**<Database password>**";
**// at the ? section you can add any quantity you need to**
String sql = "insert into **<databasename>**(name, message) values (?, ?)";
c = DriverManager.getConnection( url, username, password );
PreparedStatement pstmt = c.prepareStatement( sql );
pstmt.setString( 1, name );
pstmt.setString( 2, message );
pstmt.executeUpdate();
}
catch( SQLException e )
{
throw new ServletException( e );
}
finally
{
try
{
if( c != null ) c.close();
}
catch( SQLException e )
{
throw new ServletException( e );
}
}