SQL注入(SQL Injection)攻击原理与防御措施
SQL是一种代码注入技能,可使攻击者修改应用程序向数据库提供的查询。 迄今为止,最常见和最严重的应用 程序安全威胁总是隐藏在与数据库有某些毗连的网络应用 程序中。 通过这种 SQL 注入,攻击者可以绕过登录程序,获取、更改甚至更新数据库,实行管理程序,或进行其他变种操作。了解 SQL 注入
要解释什么 是 SQL 注入,就必须了解 SQL 的一些基本原理。 究竟上,它已成为处置处罚和虚拟操作这些数据库的通用语言。 它用于查询、插入、更新和删除数据库记录,几乎所有网络应用程序都使用它来访问数据库;它可以在 PHP、 Python、 Java、 PIA Utah VPN 和 . NET中编写 。
在网络应用程序中,用户需要通过表单、搜刮框或 URL 等方式在体系中输入信息,所有这些输入信息通常都用于动态构建 SQL 查询。 这是因为,如果用户输入的 SQL 查询字符串没有颠末得当的检查和消毒,攻击者就可以通过在预期的 SQL 查询字符串中注入恶意 SQL 语句来改变 SQL 查询字符串的性子。
SQL 注入示例
举例来说,在登录一个典范的网络应用程序时,用户需要输入用户名和密码。 用来验证凭据的实际 SQL 查询如下:
SELECT * FROM users WHERE username = 'user_input' AND password = 'password_input';如果应用程序直接使用用户的输入值而不进行任何消毒处置处罚,攻击者就可以输入雷同如许的内容。
[*]用户名:' OR '1'='1
[*]密码:' OR '1'='1
由此产生的 SQL 查询将是
SELECT * FROM users WHERE username = '' OR '1'='1' AND password = '' OR '1'='1'; 如许,攻击者就能绕过验证码,畅通无阻地访问体系
大家看这段代码,着实特别简单,就是我在没有账号和密码的时候,用这段代码来打开数据库,如许如果弹出“已经被sql注入” ,那么就代表我通过代码层的注入。
https://i-blog.csdnimg.cn/direct/28debc8f01814a89959360adad152603.png
大家一眼就可以看出来我的用户名是1' or '1'='1 密码也是,效果是:
https://i-blog.csdnimg.cn/direct/c516125a8e6846798a2221f58e97d919.png
那么说明确,你的数据库危险了,因为这个用户名和密码根本不存在。
那么这就是一个简单的后台身份验证绕过了漏洞。
验证绕过漏洞就是'or'='or'后台绕过漏洞,利用的就是AND和OR的运算规则,从而造成后台脚本逻辑性错误。
后台查询语句是: sql='select admin from user_info where userid=' '' & txtuser.text & ''' & ' and pwd=' & ''' & txtpassword.text & ''', 那么我使用1'or '1'='1(这里1但是其他的一些数)来做用户名密码的话,那么查询就变成了: select admin from user_info where userid='1'or '1'='1' and pwd='1'or '1'='1'
如许的话,根据运算规则,这里一共有4个查询语句,那么查询效果就是 假or真and假or真,先算and 再算or,最终效果为真,如许就可以进到后台了。
这种漏洞存在必须要有2个致命的条件。
我们可以从这里入手,进行防护。
制止 SQL 注入的方法
第一种:这种查询是账号和密码是在一个sql语句中,如果一旦分开就不会被注入。
sql="select * from admin where username='"&username&'&"passwd='"&passwd&'
如果一旦账号密码是分开查询的,先查帐号,再查密码,如许的话就没有办法了。
我解决的代码时如许的:
txtsql = "select * from user_Info where userid= '" & TxtUserName.Text & "'"
Set mrc = ExecuteSQL(txtsql, msgtext)
If mrc.EOF Then
MsgBox "没有这个用户,请重新输入用户名!", vbOKOnly + vbExclamation, "警告"
TxtUserName.SetFocus
Else
If Trim(mrc.Fields(1)) = Trim(TxtPassword.Text) Then
OK = True
mrc.Close
Me.Hide
UserName = Trim(TxtUserName.Text)
Else
MsgBox "密码错误,请重新输入!", vbOKOnly + vbExclamation, "警告"
TxtPassword.SetFocus
TxtPassword.Text = ""
End If
第二种方法:如果加密了,一旦被MD5加密或者其他加密方式加密的,那么密码就不会是完整的,那么就不存在如许的错误了。
如果一个用户提供的字段并非一个强类型,或者没有实施类型强制,就会发生这种情势的攻击。当在一个SQL语句中使用一个数字字段时,如果程序员没有检查用户输入的合法性(是否为数字型)就会发生这种攻击。例如:
statement := "SELECT * FROM user_info WHERE userid = " & id_text & ";"
从这个语句可以看出,id_text是一个与“userid”字段有关的数字。不过,如果终端用户选择一个字符串,就绕过了对转义字符的需要。例如,将id_text设置为:1;DROP TABLE users,它会将“users”表从数据库中删除,SQL语句变成:SELECT * FROM User_Info WHERE UserID= 1;DROP TABLE users;好滴,那么你的数据库就会遭受不可恢复的删除。
第三种方法:那么我们就可以通过传参的方法,来解决这中sql注入:
如果自己编写防注代码,一样平常是先界说一个函数,再在内里写入要过滤的关键词,如select ; “”;from;等,这些关键词都是查询语句最常用的词语,一旦过滤了,那么用户自己构造提交的数据就不会完整地参与数据库的操作。
Function SafeRequest(ParaName,ParaType)
'--- 传入参数 ---
'ParaName:参数名称-字符型
'ParaType:参数类型-数字型(1体现以上参数是数字,0体现以上参数为字符)
Dim ParaValue
ParaValue=Request(ParaName)
If ParaType=1 then
If not isNumeric(ParaValue) then
Response.write "参数" & ParaName & "必须为数字型!"
Response.end
End if
Else
ParaValue=replace(ParaValue,"'","''")
End if
SafeRequest=ParaValue
End function
为防止 SQL 注入,您需要遵循编码准则、正确管理数据库并实施安全措施。以下是一些低落 SQL 注入风险的策略:
1.使用预处置处罚语句(参数化查询)
预处置处罚语句确保用户输入纯粹作为数据处置处罚,而不是作为 SQL 下令的构成部门。
这种方法允许数据库区分 SQL 查询布局和数据自己,确保任何输入都不能修改查询布局。
例如,在 PHP 中使用 PDO(PHP 数据对象):
$stmt = $pdo->prepare('SELECT * FROM users WHERE username = :username AND password = :password');<br>
$stmt->execute(['username' => $username_input, 'password' => $password_input]);
在本例中,:username和:password是用户输入的占位符,它们会被用户提供的实际值安全地替代。数据库引擎将输入作为纯数据处置处罚,因此任何恶意输入都不会造成危害。
2.输入验证和消毒
始终对用户输入进行验证和消毒,确保其符合预期格式。例如,如果输入应该是一个整数,那么在处置处罚之前就应该检查数据类型。
在 Python 中,您可能会使用正则表达式来验证输入:
import re<br>
<br>
def validate_input(user_input):<br>
if re.match("^+$", user_input):<br>
return True<br>
else:<br>
return False
该功能只允许使用字母数字字符和下划线,从而低落了 SQL 注入的风险。
3.使用 ORM(对象关系映射)库
ORM 库抽象了数据库交互,允许开发人员使用编程语言语法与数据库交互,而不是直接使用 SQL 查询。
通过主动安全地处置处罚查询构造,这一抽象本质上可防止 SQL 注入。
例如,在Django(一种 Python 网络框架)中,你不需要编写原始 SQL,而是像如许与数据库交互:
user = User.objects.get(username=user_input)
Django 的 ORM 可主动处置处罚查询布局并防止 SQL 注入。
4.限定数据库权限
只授予应用程序须要的最低数据库权限。如果应用程序不需要删除记录,就不要授予它DELETE权限。这种最小权限原则可以淘汰攻击者发现 SQL 注入漏洞时造成的破坏。
5.使用网络应用防火墙(WAF)
WAF 可以在恶意输入到达应用程序之前将其过滤掉,从而检测并制止常见的 SQL 注入实验。WAF 是一个额外的安全层,是对编码实践的补充。
6.错误处置处罚和陈诉
制止向最终用户显示详细的数据库错误信息。相反,在服务器端记录这些错误,并向用户显示通用错误信息。这种做法可以防止攻击者深入了解你的数据库布局。
在 .NET 中,您可以使用 try-catch 块来处置处罚 SQL 错误:
try<br>
{<br>
// Database operations<br>
}<br>
catch (SqlException ex)<br>
{<br>
// Log error details<br>
Logger.Log(ex);<br>
// Show a generic message to the user<br>
Response.Write("An error occurred. Please try again later.");<br>
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页:
[1]