SQL注入不仅可以发生在MySQL中,也可以发生在任何其他数据库中。这是一种常见的黑客攻击,在MySQL中非常流行,因为web上的几个公共数据库使用MySQL。
基本上,黑客将恶意代码注入文本框中。例如;你在网上有一个注册表格。下面的代码将在一个表中插入注册数据:
INSERT INTO users(用户名,姓氏,登录名,密码)
价值观(“约翰”,“史密斯””、“jsmith”、“# sfASD my12”d ');
然而,黑客可以在密码文本框中注入恶意代码:
删除mytable表
在上面的示例中,黑客试图添加恶意代码来删除名为mytable的表。
因此,需要小心处理表单,特别是必须提交数据的输入表单。这是因为黑客可以访问你的密码或删除重要信息。
如何防止SQL注入攻击?
下面是一些建议,您可以遵循这些建议来避免SQL注入。
限制用户权限
经验法则是尽可能地限制权限。如果用户只需要在特定表中插入权限才能登录并提供个人信息,则可以只提供插入权限,而取消对其他表的选择权限。确保该用户没有系统表或系统功能的权限。只提供所需的最低权限。
使用存储过程而不是普通查询
创建和授予对特定存储过程的访问权限,而不是提供对执行SQL语句的访问权限,可以降低执行SQL注入的风险。
应用程序中的文本框将填充存储过程中的一些输入变量。如果黑客试图注入恶意代码,这将是不可能的,因为变量将具有无效的值。
下面的示例展示了如何在MySQL中生成存储过程。
分隔符/ /
CREATE PROCEDURE PROCEDURE(查询vname VARCHAR(55), vlastname VARCHAR(60), vlogin VARCHAR(30), vpassword VARCHAR(50))
开始
INSERT INTO users(用户名,姓氏,登录名,密码)
VALUES (vname, vlastname, vlogin, vpassword);
/ /结束
分隔符;
过程名为proceduresample,它接收4个变量:
- Vname
- Vlastname
- Vlogin
- Vpassword
在MySQL中,分隔符用于定义存储过程的开始和结束位置。
一旦你有了自己的存储过程,你就可以调用它:
CALL procedure ('John', 'Rambo', 'jrambo', 1354$%$$sword');
这段代码将在用户的表中插入数据。如果黑客试图进行SQL注入,攻击将失败。
下面的代码展示了它是如何工作的。
调用proceduresample(“约翰”、“兰博”、“jrambo”,1354 $ % $ $剑’;删除表用户);
现在,你可以尝试用下面的注入来删除表用户:
删除表用户
如果你尝试运行代码,你会得到一个类似于下面的错误消息:
ERROR 1064(42000):你的SQL语法有错误;查看与MySQL服务器版本对应的手册,以便在第1行';drop table t1')'附近使用正确的语法
这意味着注射会失败。
用户界面中的验证器
在向文本框中插入数据时,还可以通过在代码中添加验证器来避免SQL注入。下面的例子展示了一个验证器来避免文本框中出现奇怪的字符:
private bool checkstrangecharters(字符串文本框)
{
//避免的字符列表
列表disallowed = new List (){“;”,“@”,“*/”};
//使用foreach来验证
Foreach(字符串I不允许)
{
如果(input.Contains(我))
{
返回错误;
}
}
返回true;
}
下面的示例展示了如何在PHP中验证它。
validateInput($textbox) {
//避免的字符列表
$avoid = array(';', '@', '/*', '*/');
//使用foreach来验证
Foreach($避免为$a) {
If (strpos($input, $a) !== false) {
返回错误;
}
}
返回true;
}
您也可以在JavaScript中执行相同的操作。
公共boolean checkstrangecharters(字符串文本框){
//避免的字符列表
String[] avoid = {";", "@", "/*", "*/"};
//使用for循环进行检查
for(字符串a:避免){
If (input.contains(a)) {
返回错误;
}
}
返回true;
}
如果数据库损坏了怎么办?
有时,在应用SQL注入后,数据库会损坏。在这种情况下,您可以使用第三方MySQL修复工具,如Stellar repair for MySQL来修复损坏的数据库。该软件可以修复MySQL或MariaDB数据库。它可以在Windows环境或CentOS Red Hat和Ubuntu中使用。它允许您修复和恢复数据库。它还可以将数据保存为CSV、HTML或XLS (Excel)格式。
结论
以上,我们已经详细解释了SQL注入以及如何防止SQL注入攻击。可以通过使用带有变量的存储过程来防止SQL注入。另一种方法是添加代码来验证输入并检查一些奇怪的字符。
如果数据库损坏,您可以使用MySQL的恒星修复修复数据库(MySQL或MariaDB)并恢复所有数据。