登录防止SQL注入

登录页面的安全性测试包含一项:防止SQL注入

什么是SQL注入

SQL Injection:就是通过把SQL命令插入到Web表单递交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令。

例如:
填好正确的用户名(marcofly)和密码(test)后,点击提交,将会返回给我们“欢迎管理员”的界面。

select * from users where username=‘marcofly’ and password=md5(‘test’)

很明显,用户名和密码都和我们之前给出的一样,肯定能够成功登陆。但是,如果我们输入一个错误的用户名或密码呢?很明显,肯定登入不了吧。恩,正常情况下是如此,但是对于有SQL注入漏洞的网站来说,只要构造个特殊的“字符串”,照样能够成功登录。

比如:在用户名输入框中输入:’ or 1=1#,密码随便输入,这时候的合成后的SQL查询语句为:

select * from users where username=’’ or 1=1#’ and password=md5(’’)

语义分析:“#”在mysql中是注释符,这样井号后面的内容将被mysql视为注释内容,这样就不会去执行了,换句话说,以下的两句sql语句等价:

select * from users where username=’’ or 1=1#’ and password=md5(’’)

等价于

select * from users where username=’’ or 1=1

SQL注入采用的’ OR 1=1 # 是什么意思呢?

最后一个#号有什么意义呢?
SELECT * FROM test WHERE name=’’ OR 1=1 #’ AND age=‘20’
这后面写的 #’ 是什么意思呢? 求指教
.# 可以注释掉后面的一行SQL代码

相当于去掉了一个where条件

MySQL 注释, 过滤掉后面的SQL语句,使其不起作用

因为1=1永远是都是成立的,即where子句总是为真,将该sql进一步简化之后,等价于如下select语句:

select * from users 没错,该sql语句的作用是检索users表中的所有字段

小技巧:一个经构造后的sql语句竟有如此可怕的破坏力,相信你看到这后,开始对sql注入有了一个理性的认识了吧~

有漏洞的脚本才有机会给你攻击,比如一个带参数的删除脚本a.asp?action=del&id=2你可以改为a.asp?action=del&id=2 or 1这样就有可能删除全部数据------sql注入就是通过类似的手段来破坏数据

防止SQL注入的办法

SQL预处理语句(Prepared Statements)
为什么预处理能预防SQL注入,提高安全性呢?
其实是因为SQL语句在程序运行前已经进行了预编译,在程序运行时第一次操作数据库之前,SQL语句已经被数据库分析,编译和优化,对应的执行计划也会缓存下来并允许数据库已参数化的形式进行查询,当运行时动态地把参数传给PreprareStatement时,即使参数里有敏感字符如 or '1=1’也数据库会作为一个参数一个字段的属性值来处理而不会作为一个SQL指令,如此,就起到了SQL注入的作用。

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
登录注册页面防止SQL注入的方法有以下几种: 1. 使用参数化查询:参数化查询是一种将用户输入的数据与SQL查询语句分开的方法,可以有效防止SQL注入攻击。通过将用户输入的数据作为参数传递给查询语句,而不是将其直接拼接到查询语句中,可以防止恶意用户在输入中插入恶意的SQL代码。以下是一个使用参数化查询的示例(假设使用Python的SQLite数据库): ```python import sqlite3 # 假设用户输入的用户名和密码分别为username和password username = input("请输入用户名:") password = input("请输入密码:") # 连接数据库 conn = sqlite3.connect("mydatabase.db") cursor = conn.cursor() # 使用参数化查询 cursor.execute("SELECT * FROM users WHERE username=? AND password=?", (username, password)) # 获取查询结果 result = cursor.fetchone() # 关闭数据库连接 cursor.close() conn.close() # 判断查询结果 if result: print("登录成功") else: print("用户名或密码错误") ``` 2. 输入验证和过滤:在接受用户输入之前,对输入进行验证和过滤是一种有效的防止SQL注入的方法。可以使用正则表达式或其他验证方法来确保用户输入的数据符合预期的格式,并且过滤掉可能包含恶意代码的字符。 3. 使用ORM框架:ORM(对象关系映射)框架可以帮助开发人员将对象与数据库表进行映射,从而避免直接操作SQL语句。ORM框架通常会自动处理参数化查询和输入验证,从而提供了更高的安全性。 4. 最小权限原则:在数据库中为应用程序的登录注册功能创建一个专门的用户,并为该用户分配最小的权限。这样可以限制恶意用户对数据库的访问范围,减少潜在的攻击风险。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值