什么叫sql注入,如何防止sql注入

嘿,说白了,SQL SQL 的意思是……你在编码时不小心的地方输入一些东西,比如登录框或者搜索框,比如输入一个单引号 ',然后后面跟一些数据库命令,比如查询用户,删除数据……这样服务器就会变得愚蠢,认为你想做一个正常的查询。
因此,您输入的命令将导致它直接在数据库中进行操作,可能会删除数据或损坏数据库。

如何预防?最简单、最原始的方式就是过滤。
如果您看到“引号”,请将其删除或直接替换。
为什么?因为在SQL语句中,括号是用来标识字符串的开头的。
如果删除它们,那么该语句将不是完整的 SQL 语句,而是无用的字符串。
当然,数据库不会执行它。

让我们看看你给出的例子。
最初,我想检查用户名和密码。
我写的声明是 sql = "从用户列表中选择用户名 = '" & 用户名 & "' 和密码 = '" & 密码 & "'" 这种说法很正常,没有问题。
结果,有人知道管理员的用户名可能是admin,所以他在密码字段中输入“1 或”,结果就变成了 sql =“从用户列表中选择用户名 = 'admin' 且密码 = '' 或 1 或 ''” 看看这里的 1 或 '' 是什么意思?因为在SQL中1 总是true,而password=''或1 或''实际上是相等且true的,所以无论你输入什么密码,它都会是正确的。
所以这条语句就变成了检查所有用户名是admin的人,不管密码是否正确。

可以采取什么措施来防止这种情况发生?
1 .输入限制。
例如,用户名和密码只能使用数字、字母和下划线,不允许使用其他字符。
这可以在前端使用 JavaScript 来阻止。
例如,如果使用正则表达式进行测试,如果在输入框中输入数字以外的字母并带有下划线,则会立即提示,并且不允许提交。

2 使用存储过程。
这个更专业。
简单来说,就是在数据库中预先写入一段固定的代码。
用户到达后,是不允许直接写SQL语句的。
相反,他调用此存储过程并传递用户输入的数据。
防止注入的问题已在存储过程中得到解决。
例如,如果您调用名为 check_login 的存储过程并传递用户名和密码,则该存储过程会编写一条安全 SQL 语句进行验证。

3 查询是参数化的。
这也是一种先进的技术。
当您编写 SQL 语句时,将用户输入替换为参数占位符,例如 ? ,然后传递参数实际执行时将此数字写入数据库。
数据库引擎会自动处理这些参数以防止注入。
例如,写 sql = "从用户列表中选择用户名 = ? 且密码 = ?" 然后,在执行时,用户输入的用户名和密码将作为参数传递。
数据库会评估这些参数是数据还是命令,不会执行恶意命令。

简而言之,防止sql注入就是多花点时间在代码上,而不是让用户只是打字就可以做任何事情。

sql注入是啥意思 sql注入基本概念解析

SQL注入是在数据库查询中插入代码,导致数据库性能不佳。
说白了,该程序不验证用户输入,攻击者直接插入恶意SQL执行。

上周刚处理一个电商后端,用户输入单引号就爆炸了,商品listing直接被删除了。
想想这有多可怕。

主要有两点:用户输入不经过过滤,SQL直接用变量写。

例如,如果用户输入admin,程序将生成这样的SQL:select from users where username='admin'--' and password=''。
后续条件将被注释掉,并且密码将被忽略。

常见的情况有三种:表单输入直接拼出SQL、动态SQL不转义、存储过程随机接收输入。

危险?数据被窃取、更改、删​​除,甚至服务崩溃。
我正在做的项目几乎被毁了,整个桌子几乎被擦干净了。

如何阻止它?参数化问题才是王道。
用户输入作为参数传递,不要自己编写。
例如,Python使用cursor.execute('SQL',(参数1 ,参数2 ))。

输入经过彻底过滤,特殊字符被转义。
还有可用的 ORM 框架,例如 DjangoORM,它会自动为您参数化。

数据库权限要小,用户只能做自己需要做的事情。
需要 不要暴露错误消息来为攻击者提供线索。

还记得那个博客系统吗?用户输入'OR'1 '='1 '可直接搜索整个数据库的文章。
这就是教训,安全性应该从代码开发的第一行就考虑。

首先,你可以亲眼看看。

sql注入,table_schema=security什么意思

SQL 注入是指攻击者通过输入恶意 SQL 代码来控制数据库。
2 003 年,SQL Slammer 影响了超过 7 5 0,000 台主机。
table_schema=security 是攻击者尝试获取名为“security”的数据库模式中的表信息。
2 01 7 年,WannaCry勒索软件利用SMB协议漏洞,影响了全球2 00万台设备。
这是一个陷阱,不要相信。
使用参数化查询,不要。