1、问题解释:注入攻击 ,无密码直接登录数据库
可视化展示
1.1、当你的数据库为:其中包含三个字段id user 以及md5密码
1.2、在使用C++堆数据库信息进行访问的时候,使用多条语句进行查询
string sql = "select id from t_user where user='";sql += username;sql += "' and password =md5('";sql += password;sql += "')";cout << sql << endl;
1.3、sql语句最终输出为,展示数据库如下。
select id from t_user where user='fdd' and password =md5('990107Wjl@')
1.4、那么如果一些人想要违法查看你的数据,他们直接插入语句,生成一个密码
select md5(1);
1.5、在C++编程中,输入如下代码,就可以查看你的数据库的任意信息,所以说是很危险的。
select id from t_user where user = '1'or '1'='1' and password = md5('1') or'c4ca4238a0b923820dcc509a6f75849b'=md5('1');
在Linux下,也攻击成功了,十分危险
input password : ***********************************************select id from t_user where user = '1' or '1' = '1' and password = md5('1') or 'c4ca4238a0b923820dcc509a6f75849b' = md5('1')
login success!
2、解决思路
2.1、解决1:使用独立用户,设定权限,限制用户的权限,不用root用户,只给只读权限
2.2、解决2:用预处理语句(比较麻烦stmt)
2.3检查用户的输入
3、本博客主要讲解第三种方法:检查用户的输入
3.1、从如下代码可以查看
select id from t_user where user = '1'or '1'='1' and password = md5('1') or'c4ca4238a0b923820dcc509a6f75849b'=md5('1');
username=1'or'1'='1
password= 1') or'c4ca4238a0b923820dcc509a6f75849b'=md5('1
发现攻击密码包含引号,等于号以及括号,所以解决的话就不可以有'',不可以有= 不可以有)
3.2、写一个函数,检查用户的输入
//用于检查用户的输入 false不安全。 true表示安全
bool XClient::CheckInput(const std::string& in)
{//限定不允许出现的字符string str = "'\"()";for (char a : str){//size_t 类型表示C中任何对象所能达到的最大长度,它是无符号整数。size_t found = in.find(a);//输入字符in是否可以在a中被找到//如果字符串不存在包含关系,那么返回值就一定是nposif (found != string::npos)//发现违规字符{return false;}}return true;
}
if (!CheckInput(password) || !CheckInput(username)){//输入是危险的cerr << "Injection attacks!!!! Inout password or username dangerous!!" << endl;continue;}
4、测试:Linux
直接输出注入攻击错误
input username:1'or'1'='1
input password:***********************************************Injection attacks!!!! Inout password or username dangerous!!
完结花花