抱歉,你查看的文章不存在

Sql注入

关于防范Sql注入也是安全测试老生常谈的问题。

首先说一下,攻击者之所以可以利用自己输入的数据来达到攻击网站的目的,原因就在于SQL语言作为一种解释型语言,它的数据其实是由程序员编写的代码和用户提交的数据共同组成的。正是这个原因,攻击者可以构造对自己有利的数据,利用网站的一些SQL漏洞来达到恶意的目的。

SQL注入,就是指攻击者将恶意的字符串或者语句等信息作为参数输入,服务器在验证这个字段的时候,读取攻击者输入的数据,将其作为正常的值参与SQL语句的查询,试想,如果攻击者输入了一个字符串,在SQL语句执行之后,可以导致删除表等操作,对于一个应用来说,影响是很大的。可以参考SQL 注入速查表

样例

正常的网站登录可能如下

  1. 用户输入用户名和密码
  2. 网站根据用户名和密码进行检索
  3. 根据是否存在结果返回是否登陆成功

假设执行的sql如下

select * from user where username=‘username’ and pwd=‘password’

  1. 正常访问用户输入用户名admin 密码admin可以成功登录 执行sql
select * from user where username=‘admin’ and pwd=‘admin’
  1. 正常访问用户输入用户名admin 密码test登录失败
<table> 
 <tbody> 
  <tr> 
   <td> <p><code>select</code>&nbsp;<code>*&nbsp;</code><code>from</code>&nbsp;<code>user</code>&nbsp;<code>where</code>&nbsp;<code>username=</code><code>'admin'</code>&nbsp;<code>and</code>&nbsp;<code>pwd=</code><code>'test'</code></p> </td> 
  </tr> 
 </tbody> 
</table>
  1. 非法用户输入用户名admin 密码test’ or 1=’1依然可以成功登录
select * from user where username=‘admin’ and pwd=‘test’ or 1=‘1’

此时非法用户可以绕过验证直接登录成功 主要容易出现sql注入的画面一般为登录画面或者详情页画面(比如订单页) #### 应对措施 #### 1、从开发者的角度来说,防范措施如下: (1) 转义敏感字符及字符串 SQL的敏感字符包括: “exec”, “xp\_”, “sp\_”, “declare”, “cmd”, “Union”, “+”, “//”, ”..”, “;”, “’”, “–”, “%”, “0x”, “><=!-\*/()|” ,和空格。 (2) 屏蔽出错信息:阻止攻击者知道攻击的结果 (3) 在服务端正式处理之前提交数据的合法性(合法性检查主要包括三 项:数据类型,数据长度,敏感字符的校验)进行检查等。最根本的解决手段,在确认客 户端的输入合法之前,服务端拒绝进行关键性的处理操作. 2、从测试人员的角度来说,防范措施是: 在程序开发前(即需求阶段),我们就应该有意识的将安全性检查应用到需求测试中,例如对一个表单需求进行检查时,我们一般检验以下几项安全性问题:需求中应说明表单中某一field的类型,长度,以及取值范围(主要作用就是禁止输入敏感字符);需求中应说明如果超出表单规定的类型,长度,以及取值范围的,应用程序应给出不包含任何代码或数据库信息的错误提示等。 使用PreparedStatement,PreparedStatement将会帮程序员完成转义敏感字符的操作

private boolean isEscapeNeededForString(String x, int stringLength) {
    boolean needsHexEscape = false;
 
    for (int i = 0; i < stringLength; ++i) {
        char c = x.charAt(i);
 
        switch (c) {
            case 0: /* Must be escaped for 'mysql' */
 
                needsHexEscape = true;
                break;
 
            case '\n': /* Must be escaped for logs */
                needsHexEscape = true;
 
                break;
 
            case '\r':
                needsHexEscape = true;
                break;
 
            case '\\':
                needsHexEscape = true;
 
                break;
 
            case '\'':
                needsHexEscape = true;
 
                break;
 
            case '"': /* Better safe than sorry */
                needsHexEscape = true;
 
                break;
 
            case '\032': /* This gives problems on Win32 */
                needsHexEscape = true;
                break;
        }
 
        if (needsHexEscape) {
            break; // no need to scan more
        }
    }
    return needsHexEscape;

当然使用PreparedStatement还有其他额外的好处,譬如代码可读性好(任何需要拼接的都应该此种思路,比如各种后端模板引擎,前端模板引擎) 对于使用mybatis来说,最简单就是使用\#来做参数传递可以参考[深入了解MyBatis参数][MyBatis],可以简单理解只要是通过\#传递的就没有sql注入(转义)因此排查项目中除了tablename orderby fileldname之外的$传参数即可

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

编辑于

后端之路

0 篇文章0 人订阅

相关文章

来自专栏Pulsar-V

PHP微信开发入门(二)

微信服务器消息推送 微信的消息推送方式是客户操作微信发生一系列事件,然后腾讯微信服务器发送一个XML数据POST请求把事件描述发送到你填写的服务器URL上,你的...

4056
来自专栏FreeBuf

从最近的微信支付看XXE漏洞

先说下写这篇文章的初衷吧,最近微信支付java_sdk刚爆发了一次xxe漏洞,然后领导赶快用自家的静态代码审计工具做了审计(这里我就不报名字,本来可以帮公司推广...

2083
来自专栏FreeBuf

Flash XSS检测脚本的简单实现

前言 这里主要是讲如何快速扫描到有问题的flash文件,用于批量,有时候很笨的方法也会有奇效,下面记录一下在实现过程中的一些思路和遇到的一些坑。 ? 第三方插件...

2865

Cloudify中的部署组合

[这篇文章是由DeWayne Filppi撰写的。]

3316
来自专栏李家的小酒馆

通过Python实现一个文档的半自动录入工具

  因为公司需要将word办的接口文档在线化,看起来是个很好的事情,但是就是苦逼了我们这些干活的,其中工程量最大的就是参数的录入,要是参数少也罢,有的接口动辄三...

1021
来自专栏枕边书

解决问题,别扩展问题

最近有个需求需要统计一个方法的耗时,这个方法前后各打出一条日志,类似于 [INFO] 20180913 19:24:01.442 method start/en...

751
来自专栏Python中文社区

Python爬虫:模拟登录知乎完全详解

專 欄 ❈ sunhaiyu,Python中文社区专栏作者 专栏地址: http://www.jianshu.com/u/4943cb2c6ea4 ❈ 这几天...

7309
来自专栏木头编程 - moTzxx

Redis 在PHP中的使用笔记

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u011415782/article/de...

1145
来自专栏Linyb极客之路

面对海量请求,缓存设计还应该考虑哪些问题?

从第一个缓存框架 Memcached 诞生以来,缓存就广泛地存在于互联网应用中。如果你的应用流量很小,那么使用缓存可能并不需要做多余的考虑。但如果你的应用流量达...

934
来自专栏酷玩时刻

微信公众号开发之模板消息

其实这个问题很简单,在【微信公众平台】现在已经可以直接查看自己的公众号都能使用那些接口。

2513

扫码关注云+社区

领取腾讯云代金券