SQL Injection:
通过在网页的查询字符串(Web表单,输入域名,页面请求)中输入sql查询语句,从而欺骗服务器
漏洞原因:符号# 会被认为是注释(comment)
例如:
1. 查询时加入”#“
1 | SELECT Name, Salary, SSN |
2. 1=1
1=1: 总是正确的,输入:
1 | "a ' OR 1=1 #" |
会转换为:
1 | SELECT Name, Salary, SSN |
于是所有的查询结果都会显示
3. 使用cRUL攻击:
1 | curl 'www.example.com/getdata.php?EID=a' OR 1=1 #&Password =' |
但不会执行,因为data中特殊的符号会被编码,所以输入时需要编码特殊符号
4. 多个SQL语句:
可以通过分号;(semicolon)分开新的SQL语句
1 | Input: a'; DROP DATABASE dbtest; # |
根本原因:
代码与数据混合 (如XSS attack,system() 函数,format string attack)
预防措施:
Filtering and encoding data
- 在混合data和code之前,检查data,过滤所有的可能会被解释为code的字符
- PHP中用real_escape_string
Prepared statement
- 最好的方法是分离code和data
- 使用SQL statement模版。数据库分析,编译,都建立在sql模版的基础上,并且存储结果并不执行。之后,将输入的参数和预先编译好的模板连接。在不同的执行过程中,只有输入的数据是不一样的,代码部分是一样的。
- 在sql查询语句中设定question mask,为了日后将data放入;当data输入后,将他们结合起来