我正在尝试在java中加入一些反sql注入,但我发现使用"replaceAll“字符串函数非常困难。最终,我需要一个函数,它可以将任何现有的\
转换为\\
,将任何"
转换为\"
,将任何'
转换为\'
,以及将任何\n
转换为\\n
,这样当字符串由SQL求值时,MySQL注入将被阻塞。
我用千克顶起了一些我正在处理的代码,函数中的所有\\\\\\\\\\\
都让我的眼睛发疯。如果有人碰巧有这样的例子,我将不胜感激。
发布于 2009-11-29 00:19:53
PreparedStatements是最好的选择,因为它们使得SQL注入变得不可能。下面是一个将用户的输入作为参数的简单示例:
public insertUser(String name, String email) {
Connection conn = null;
PreparedStatement stmt = null;
try {
conn = setupTheDatabaseConnectionSomehow();
stmt = conn.prepareStatement("INSERT INTO person (name, email) values (?, ?)");
stmt.setString(1, name);
stmt.setString(2, email);
stmt.executeUpdate();
}
finally {
try {
if (stmt != null) { stmt.close(); }
}
catch (Exception e) {
// log this error
}
try {
if (conn != null) { conn.close(); }
}
catch (Exception e) {
// log this error
}
}
}
无论名称和电子邮件中是什么字符,这些字符都将直接放入数据库中。它们不会以任何方式影响INSERT语句。
不同的数据类型有不同的set方法--您使用哪种方法取决于您的数据库字段是什么。例如,如果数据库中有一个整型列,则应使用setInt
方法。The PreparedStatement documentation列出了可用于设置和获取数据的所有不同方法。
发布于 2009-11-29 00:14:17
防止SQL注入的唯一方法是使用参数化SQL。根本不可能构建一个比那些以攻击SQL为生的人更聪明的过滤器。
所以对所有input、updates和where子句都使用参数。动态SQL只是为黑客打开的一扇门,它包括存储过程中的动态SQL。参数化,参数化,参数化。
发布于 2009-12-01 09:35:35
(这是对OP在原始问题下的评论的回答;我完全同意PreparedStatement是这项工作的工具,而不是正则表达式。)
当您说\n
时,您指的是\
+n
序列还是实际的换行符?如果是\
+n
,任务非常简单:
s = s.replaceAll("['\"\\\\]", "\\\\$0");
要匹配输入中的一个反斜杠,可以在regex字符串中放入四个反斜杠。要在输出中放入一个反斜杠,可以在替换字符串中放入四个反斜杠。这里假设您正在以Java字符串文字的形式创建正则表达式和替换。如果您以其他方式创建它们(例如,通过从文件中读取它们),则不必进行所有的双重转义。
如果您在输入中有一个换行符,并且您想用转义序列替换它,您可以使用以下命令对输入进行第二次传递:
s = s.replaceAll("\n", "\\\\n");
或者你可能想要两个反斜杠(我不太清楚):
s = s.replaceAll("\n", "\\\\\\\\n");
https://stackoverflow.com/questions/1812891
复制相似问题