We read every piece of feedback, and take your input very seriously.
To see all available qualifiers, see our documentation.
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
SQL 注入漏洞(SQL Injection)是 Web 开发中最常见的一种安全漏洞。可以用它来从数据库获取敏感信息,或者利用数据库的特性执行添加用户,导出文件等一系列恶意操作,甚至有可能获取数据库乃至系统用户最高权限。 而造成 SQL 注入的原因是因为程序没有有效的转义过滤用户的输入,使攻击者成功的向服务器提交恶意的 SQL 查询代码,程序在接收后错误的将攻击者的输入作为查询语句的一部分执行,导致原始的查询逻辑被改变,额外的执行了攻击者精心构造的恶意代码。
以简单的管理员登录表单:
<form action="/login" method="POST"> <p>Username: <input type="text" name="username" /></p> <p>Password: <input type="password" name="password" /></p> <p><input type="submit" value="登陆" /></p> </form>
后端的 SQL 语句可能是如下这样的:
let querySQL = ` SELECT * FROM user WHERE username='${username}' AND psw='${password}' `; // 接下来就是执行 sql 语句...
目的就是来验证用户名和密码是不是正确,按理说乍一看上面的 SQL 语句也没什么毛病,确实是能够达到我们的目的。如果有一个恶意攻击者输入的用户名是 zoumiaojiang' OR 1 = 1 --,密码随意输入,就可以直接登入系统了。 我们之前预想的真实 SQL 语句是:
SELECT * FROM user WHERE username='zoumiaojiang' AND psw='mypassword'
恶意攻击者的奇怪用户名将你的 SQL 语句变成了如下形式:
SELECT * FROM user WHERE username='zoumiaojiang' OR 1 = 1 --' AND psw='xxxx'
在 SQL 中,-- 是注释后面的内容的意思,所以查询语句就变成了:
SELECT * FROM user WHERE username='zoumiaojiang' OR 1 = 1
这条 SQL 语句的查询条件永远为真,所以意思就是恶意攻击者不用我的密码,就可以登录进我的账号,然后可以在里面为所欲为,然而这还只是最简单的注入,牛逼的 SQL 注入高手甚至可以通过 SQL 查询去运行主机系统级的命令,将你主机里的内容一览无余。
1、前端过滤用户输入的内容,避免form表单里有SQL语句的提交 2、后端代码检查输入的数据是否符合预期,严格限制变量的类型,例如使用正则表达式进行匹配处理 3、后端对进入数据库的特殊字符(',",\,<,>,&,*,; 等)进行转义处理,或编码转换。基本上所有的后端语言都有对字符串进行转义处理的方法,比如 lodash 的 lodash._escapehtmlchar库。 4、所有查询语句建议使用数据库提供的参数化查询接口,参数化的语句使用参数而不是将用户输入变量嵌入到SQL语句中,即不要直接拼接SQL语句。 5、严格限制Web应用的数据库操作权限,给用户提供仅仅能够满足其工作的最低权限,从而最大限度的减少SQL注入攻击对数据库的危害 6、应用发布之前建议使用专业的SQL注入检测工具进行检测,能及时修补发现的SQL注入漏洞。网上有很多方面的开源工具,比如sqlmap、SQLninja等。 7、避免网站页面打印SQL错误信息,比如类型错误、字段不匹配等,把代码里的SQL暴露出来,防止攻击者利用这些错误信息进行SQL注入。
The text was updated successfully, but these errors were encountered:
No branches or pull requests
SQL注入
SQL 注入漏洞(SQL Injection)是 Web 开发中最常见的一种安全漏洞。可以用它来从数据库获取敏感信息,或者利用数据库的特性执行添加用户,导出文件等一系列恶意操作,甚至有可能获取数据库乃至系统用户最高权限。
而造成 SQL 注入的原因是因为程序没有有效的转义过滤用户的输入,使攻击者成功的向服务器提交恶意的 SQL 查询代码,程序在接收后错误的将攻击者的输入作为查询语句的一部分执行,导致原始的查询逻辑被改变,额外的执行了攻击者精心构造的恶意代码。
SQL注入案例
以简单的管理员登录表单:
后端的 SQL 语句可能是如下这样的:
目的就是来验证用户名和密码是不是正确,按理说乍一看上面的 SQL 语句也没什么毛病,确实是能够达到我们的目的。如果有一个恶意攻击者输入的用户名是 zoumiaojiang' OR 1 = 1 --,密码随意输入,就可以直接登入系统了。
我们之前预想的真实 SQL 语句是:
恶意攻击者的奇怪用户名将你的 SQL 语句变成了如下形式:
在 SQL 中,-- 是注释后面的内容的意思,所以查询语句就变成了:
这条 SQL 语句的查询条件永远为真,所以意思就是恶意攻击者不用我的密码,就可以登录进我的账号,然后可以在里面为所欲为,然而这还只是最简单的注入,牛逼的 SQL 注入高手甚至可以通过 SQL 查询去运行主机系统级的命令,将你主机里的内容一览无余。
如何防御SQL注入?
1、前端过滤用户输入的内容,避免form表单里有SQL语句的提交
2、后端代码检查输入的数据是否符合预期,严格限制变量的类型,例如使用正则表达式进行匹配处理
3、后端对进入数据库的特殊字符(',",\,<,>,&,*,; 等)进行转义处理,或编码转换。基本上所有的后端语言都有对字符串进行转义处理的方法,比如 lodash 的 lodash._escapehtmlchar库。
4、所有查询语句建议使用数据库提供的参数化查询接口,参数化的语句使用参数而不是将用户输入变量嵌入到SQL语句中,即不要直接拼接SQL语句。
5、严格限制Web应用的数据库操作权限,给用户提供仅仅能够满足其工作的最低权限,从而最大限度的减少SQL注入攻击对数据库的危害
6、应用发布之前建议使用专业的SQL注入检测工具进行检测,能及时修补发现的SQL注入漏洞。网上有很多方面的开源工具,比如sqlmap、SQLninja等。
7、避免网站页面打印SQL错误信息,比如类型错误、字段不匹配等,把代码里的SQL暴露出来,防止攻击者利用这些错误信息进行SQL注入。
The text was updated successfully, but these errors were encountered: