SQL 注入是一种数据库攻击手段。攻击者通过向应用程序提交恶意代码来改变原 SQL 语句的含义,进而执行任意SQL 命令,达到入侵数据库乃至操作系统的目的。防止 SQL 注入的主要方法有:净 化并验证非受信输入,采用参数化查询。
对于预防 SQL 注入的情况,示例1给出了不规范用法(Java 语言)示例。示例2给出了规范用法(Java 语言)示例。
示例1:
public void doPrivilegedAction(String username,char[] password)
throws SQLException {
Connection connection = getConnection();
//.. .
try {
String pwd = hashPassword(password);
String sqlString ="SELECT * FROM db user WHERE username =""
+ username +
"AND password=""+pwd+"";
Statement stmt = connection.createStatement();
ResultSetrs = stmt.executeQuery(sqlString);
//.. .
} finally {
try {
connection.close();
}catch(SQLException x){
//.. .
}
}
}
在这个不规范的代码示例中,使用JDBC来认证用户,提交 stmt.executeQuery(sqlString) 查询的 SQL 为 sqlString,它是通过一个拼接字符串组合而来,并且 sqlString 未经过净化或验证,当 pwd 为OR1=1 时,sqlString 就会变成:SELECT FROM db user WHERE username ="AND password=" OR'1'='1。Statement.executeQuery(String)方法不能防止 SQL 注入,该代码将会引发SQL注入漏洞攻击。文章来源:https://www.toymoban.com/news/detail-736132.html
示例2:
public void doPrivilegedAction(String username,char[] password)
throws SQLException {
Connection connection = getConnection();
try {
String pwd = hashPassword(password);
if (username.length()>8){
//.
String sqlString =
"select * from db user where username=? and password=?";
PreparedStatementstmt = connection.prepareStatement(sqlString);
stmt.setString(1,username);
stmt.setString(2,pwd);
//.
} finally {
try {
connection.close():
}catch(SQLException x){
//.
}
}
在这个规范的代码示例中,采用java.sql.PreparedStatement 执行参数化查询,可以避免含有注入 代码的 SQL 语句提交执行。通过使用prepareStatement类的 set*() 方法,可以进行强类型检查。程 序会正确的转义双引号内的输入数据,以减少SQL 注入漏洞。类似的,对数据的增删改操作也应使用 prepareStatement。文章来源地址https://www.toymoban.com/news/detail-736132.html
到了这里,关于应用软件安全编程--01预防SQL注入的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!