
1) 【一句话结论】:针对恶意内容(SQL注入、XSS),核心是输入验证(白名单/正则过滤)+参数化查询(防SQL注入)+输出编码(防XSS),三者结合可阻断攻击路径。
2) 【原理/概念讲解】:输入验证是检查用户输入是否符合预期格式,比如用户名用正则^[a-zA-Z0-9_]+$,只允许字母数字下划线,防止注入;参数化查询(预编译语句)将用户输入作为参数传递,而非SQL字符串的一部分,数据库引擎自动处理参数,避免SQL注入;输出编码是将用户输入中的HTML/JS特殊字符(如<、>、&)转换为实体(如<、>、&),防止XSS。类比:输入验证像给输入戴“校验锁”,只允许符合规则的钥匙;参数化查询像把输入放进“参数盒子”,SQL语句只处理盒子里的内容,盒子外的内容不会被解析;输出编码像给输出加“翻译器”,把用户输入翻译成安全的文本。
3) 【对比与适用场景】:
| 方法 | 定义 | 特性 | 使用场景 | 注意点 |
|---|---|---|---|---|
| 输入验证(白名单) | 预定义允许的输入模式 | 严格检查,只允许符合模式的输入 | 用户注册、输入表单 | 需精确定义模式,可能遗漏合法输入 |
| 参数化查询 | 将用户输入作为参数传递,而非SQL字符串 | 防止SQL注入,数据库自动处理 | 数据库操作(查询、插入) | 需支持预编译的数据库(如MySQL、PostgreSQL) |
| 输出编码 | 将用户输入中的HTML/JS字符转换为实体 | 防止XSS攻击 | 页面输出、日志记录 | 需针对不同上下文(HTML、JavaScript、CSS)编码 |
4) 【示例】:
' or 1=1 --,正常查询SELECT * FROM users WHERE username = 'input',注入后变成SELECT * FROM users WHERE username = '' or 1=1 --。String sql = "SELECT * FROM users WHERE username = ?";
PreparedStatement pstmt = connection.prepareStatement(sql);
pstmt.setString(1, userInput); // userInput是用户输入,如' or 1=1 --'
ResultSet rs = pstmt.executeQuery();
<script>alert(1)</script>,编码后为<script>alert(1)</script>,页面显示为文本。5) 【面试口播版答案】:
面试官您好,针对题目文本或代码中的恶意内容,核心是输入验证和输出编码,结合参数化查询。首先,输入验证方面,比如对用户输入进行白名单过滤,比如用户名只允许字母数字,或者用正则表达式检查格式,防止注入;然后,数据库操作用参数化查询,把用户输入当作参数,避免SQL注入;对于输出,比如用户输入显示在页面上,需要将特殊字符(如<、>)转换为HTML实体(如<),防止XSS。举个例子,比如用户输入<script>alert(1)</script>,如果不编码,会执行脚本,而编码后变成<script>alert(1)</script>,页面显示为文本。这样就能有效防止SQL注入和XSS。
6) 【追问清单】:
SELECT * FROM、<script>等模式。'转义为''),或参数化查询自动处理,避免引号导致SQL注入。7) 【常见坑/雷区】:
' OR '1'='1,黑名单可能没覆盖,导致注入。sql += " WHERE id = " + id;,导致注入。