case when sql注入
时间: 2023-10-08 18:08:31 浏览: 315
case when语句在SQL注入中是一种常见的利用方式。当存在SQL注入时,攻击者可以通过构造恶意的输入来执行自己的SQL语句或者绕过原有的SQL语句限制。在布尔盲注中,攻击者可以利用case when语句来判断注入的条件是否成立,并根据返回的结果来判断注入是否成功。
布尔盲注一般的流程如下:
. 确定注入点:找到存在注入漏洞的输入框或参数。
2. 构造恶意输入:利用case when语句构造恶意输入,例如通过判断条件是否成立来返回True或False。
3. 判断注入结果:根据返回的结果来判断注入是否成功。
4. 进一步利用:如果注入成功,攻击者可以进一步利用其他注入技巧来获取更多的敏感信息或执行其他恶意操作。
相关问题
sql 判断条件语句拼接
在 SQL 中,可以使用条件语句来动态拼接查询条件。常见的条件语句有 `IF` 和 `CASE WHEN` 两种。
假设有一个学生表 `students`,其中有 `name`、`age`、`gender` 三个字段,现在要查询年龄大于等于 18 岁的男生或者年龄大于等于 20 岁的女生,可以通过以下 SQL 语句实现:
```sql
SELECT * FROM students
WHERE age >= CASE gender
WHEN 'male' THEN 18
WHEN 'female' THEN 20
ELSE 0
END
```
上述 SQL 语句中,`CASE WHEN` 语句判断传入的参数 `gender` 是男还是女,分别返回年龄限制条件 18 和 20,如果传入的参数不是男也不是女,则返回 0,这样就可以避免查询出不符合条件的数据。
如果使用的是编程语言,可以在程序中动态生成 SQL 语句,根据传入的参数拼接查询条件。例如,在 Python 中可以使用字符串拼接来生成 SQL 语句,如下所示:
```python
def query_students(gender, age):
sql = "SELECT * FROM students WHERE 1=1"
if gender == 'male':
sql += " AND gender='male' AND age >= 18"
elif gender == 'female':
sql += " AND gender='female' AND age >= 20"
if age:
sql += f" AND age <= {age}"
return sql
```
上述代码中,首先定义了一个 SQL 语句 `SELECT * FROM students WHERE 1=1`,这里的 `WHERE 1=1` 是为了方便拼接后续的查询条件。然后根据传入的参数 `gender` 和 `age`,动态拼接查询条件,最后返回完整的 SQL 语句。
注意,在拼接 SQL 语句时需要注意防止 SQL 注入攻击。建议使用参数化查询或者安全过滤来避免 SQL 注入。
create or replace procedure tongji is v_sql varchar2(100); begin v_sql :='create table emp_work_detail as select distinct name,id,mouth,startwork,endwork, case when to_char(startwork,''hh24:mi'')>''09:00'' then ''是'' else ''否'' end chidao, case when (endwork-startwork)*24>8.5 then ''是'' else ''否'' end jiaban, case when to_char(endwork,''hh24:mi'')<''17:30'' then ''是'' else ''否'' end zhaotui from( select distinct name,id,to_char(SIGNIN_DATETIME,''yyyy-mm'') mouth, first_value(signin_datetime) over(partition by id,to_char(signin_datetime,''dd'') order by signin_datetime) startwork, last_value(signin_datetime) over(partition by id,to_char(signin_datetime,''dd'')) endwork from emp_work order by id)'; execute immediate v_sql; end; /
这段代码是一个 PL/SQL 存储过程,它的作用是创建一个名为 emp_work_detail 的表,并将 emp_work 表中的数据按照一定的条件进行汇总后插入 emp_work_detail 表中。其中,使用了动态 SQL 的方法,将 SQL 语句保存在一个变量中,然后使用 EXECUTE IMMEDIATE 语句动态地执行这个 SQL 语句。
具体来说,这个存储过程的实现过程如下:
1. 定义一个名为 v_sql 的 varchar2 类型的变量,用来保存要执行的 SQL 语句。
2. 将要执行的 SQL 语句保存在 v_sql 变量中。这个 SQL 语句的作用是从 emp_work 表中选择出每个员工每个月的第一次签到时间作为上班时间,最后一次签到时间作为下班时间,并根据一定的条件计算出是否迟到、是否加班、是否早退,并将这些数据插入到 emp_work_detail 表中。
3. 使用 EXECUTE IMMEDIATE 语句执行保存在 v_sql 变量中的 SQL 语句。
4. 存储过程执行完毕。
需要注意的是,这段代码中使用了动态 SQL 的方法,这样做的好处是可以根据实际情况动态地构建 SQL 语句,但也存在一定的安全风险,因此需要注意对动态 SQL 的合法性进行判断,避免 SQL 注入等安全问题。
阅读全文