前言:
  之前编写了一个网页闯关游戏(类似Riddle Game), 除了希望大家能够体验一下我的游戏外. 也愿意分享编写这个网页游戏过程中, 学到的一些知识.
  web开发初学者往往会忽视一些常见的漏洞, 比如SQL注入攻击, XSS攻击. 本文将简述SQL注入攻击的原理, 并分享下关卡设计, 其在打开潘多拉魔盒的情况下, 又能很好地限制危害.

效果展示:
  先打下广告: 网页闯关游戏入口(请狠狠地点击我, ^_^).
  本文的想法实施于第十一关--健忘的教授.
  
  很直接的呈现一个登陆对话框, 考验玩家能否借助非常规的方式来绕开登陆验证.

SQL注入攻击:
  虽然SQL注入攻击已是老生常谈, 不过还是得唠叨几句"科普"一下, ^_^.
  应用程序再获取到用户提交的数据后, 有些会进行SQL语句的拼接并执行. 倘若用户提交的数据中包含SQL执行命令, 同时程序并没有对数据进行过滤和安全验证. 这样就有可能绕过验证并获取数据, 甚至注入恶意代码, 导致数据被篡改, 丢失.
  • 以用户登录为例
  服务的用户数据模型如下:

table tb_user (username varchar(32),password varchar(32)
);

  服务的登陆验证SQL如下:

SELECT * FROM tb_user WHERE username = '?' AND password = '?';

  登陆的输入框入图所示:
  
  其对应的form表单为:

<form method="post">用户名: <input name="username" />密码: <input name="password" type="password"/>
</form>

  hacker只要在form表单中, 巧妙设计字段内容, 注入sql执行命令, 以绕过数据验证.
  比如username字段, 填写为: ' or 1 = 1 #.
  这样服务器端, 最终拼接的SQL为:

SELECT * FROM tb_user WHERE username = '' or 1 = 1 #' AND password= '?'

  由于字符'#'在SQL规范中, 表示注释, '#'字符后直到行尾的所有字符都将被忽略掉.
  因此最终的SQL等价于如下:

SELECT * FROM tb_user WHERE username = '' or 1 = 1

  用户数据将被返回, 如果尝试登录的是管理员后台, 那hacker将轻松获取到管理员的权限, 这非常的可怕.
  魔高一丈道高一尺, 既然知道SQL注入的攻击原理是什么? 那么防范措施就有针对性了, 千万不要相信用户提交的数据, 做好过滤和验证.

关卡设计:
  本关就是来考察玩家对SQL注入的认知功底. 因此模拟构建了一个登陆窗口, 接受开放式的答案.
  如何对答案进行验证呢? 1). 模拟SQL的执行解析. 2). 直接跑真实的SQL.
  对于方案一, 工作量大, 多个SQL命令需要支持, 有可能覆盖不全所有的解, 有点得不偿失.
  对于方案二, 容易实现, 但是给系统带来了潜在风险, 比如注入drop tables等危险的命令.
  权衡比较, 还是采用第二种方案, 至于风险控制亦可控.
  服务程序是采用Java来编写的, 若要放开SQL注入漏洞限定, 那就不能使用mybatis/hibernate这些ORM框架, 因为这些框架已经帮我们做了escape数据的工作.
  让我们回到石器时代, 直接裸用jdbc来实现, 代码如下:

/**
*
* 构造经典的SQL注入攻击
* @param username 用户输入的用户名
* @param password 用户输入的密码
* @return
*/
public boolean verifySQLInject(String username, String password) {Connection connection = null;try {// *) 动态载入Mysql Driver驱动类Class.forName("com.mysql.jdbc.Driver");// *) 获取 DB Connectionconnection = DriverManager.getConnection(dbUrl, dbUsername, dbPassword);Statement stmt = connection.createStatement();String sql = String.format("SELECT * " +"FROM tb_virtual_user " +"WHERE username = '%s' AND password = '%s'",username, password);ResultSet rs = stmt.executeQuery(sql);if ( rs.next() ) {stmt.close();// *) 登陆成功return true;}} catch (ClassNotFoundException e) {e.printStackTrace();} catch (SQLException e) {e.printStackTrace();} finally {if ( connection != null ) {try {connection.close();} catch (SQLException e) {// e.printStackTrace();}}}return false;}

  注: 该代码确切地执行了用户登录的SQL语句, 常规登录和非法sql注入构造都将返回失败.
  同时正如前文所提到的, 为了验证SQL注入攻击, 从而放弃数据验证和过滤. 万一有人不是用于解题, 而是专门搞破坏怎么办? 犹如自己给自己埋了个炸弹, 你永远不知道它什么时候爆炸.
  事实上, 这是多虑的. 我们可以创建两个mysql账号, 一个专门用于sql注入验证(只授予select权限), 而剩下则用于其他的业务数据. 这样就轻松做到隔离, 且十分安全.

GRANT USAGE ON *.* TO 'game1001'@'localhost' IDENTIFIED BY PASSWORD '*25A2CD7698FEED80089150F089755D752423A821';
GRANT SELECT ON `db_gameweb`.`tb_virtual_user` TO 'game1001'@'localhost';

  比如创建账号game1001, 它只被授予对tb_virtual_user表的只读权限.
  这样服务就能允许sql注入存在, 但这些sql注入不具攻击性.

后记:
  其实对该题, 我还是很满意的. 我一直希望能构建类似的题, 寓教于乐. 就当自己一个以后奋斗的方向吧! 与君共勉.

公众号&游戏站点:
  个人微信公众号: 木目的H5游戏世界
  
  个人游戏作品集站点(尚在建设中...): www.mmxfgame.com,  也可直接ip访问http://120.26.221.54/.

网页闯关游戏(riddle webgame)--SQL注入的潘多拉魔盒相关推荐

  1. 网页闯关游戏(riddle webgame)--仿微信聊天的前端页面设计和难点

    前言: 之前编写了一个网页闯关游戏(类似Riddle Game), 除了希望大家能够体验一下我的游戏外. 也愿意分享编写这个网页游戏过程中, 学到的一些知识. 本文讲描述, 如何在网页端实现一个仿微信 ...

  2. 网页闯关游戏(riddle webgame)--游戏玩法和整体介绍

    前言: 记得上大学那会, 有位传说中的大牛, 写了一个网页闯关类的游戏. 当时我们玩得不亦乐乎, 也是第一次接触到这种形式的游戏. 不过当时纯玩家心态, 并没有想过去创造一个. 最近想起这事, 突然想 ...

  3. pythonchallenge闯关游戏_Python Challenge游戏攻略(一)

    Python Challenge是一个古老的网页闯关游戏,为程序员设计,一共33关,只有在一关通过之后,才能获得会提供下一关挑战的网页地址,以此类推到最终关.蛮有意思的,自己做了13道,后面就没坚持下 ...

  4. 计算机协会小游戏,网页闯关小游戏闯关记录(一)ISA TEST

    在知乎上找到一个关于CTF入门的回答,答主很专业的给出了建议和一些对应的训练平台,这里我试了试几个,自己半吊子水平,只能玩一些简单的,这里把自己做的过程记录下来,这几个基本都能查到通关秘籍(我是怎么知 ...

  5. 程序猿光棍节闯关游戏

    好无聊好寂寞,来玩一下.... 因为我不是程序猿,所以应该闯不到头的.... 边闯边写就是了 第一关链接请戳 http://segmentfault.com/game/ 第一关查看源代码即可 于是得到 ...

  6. pythonchallenge闯关游戏_PythonChallenge闯关详解

    前言 PythonChallenge是国外的一位工程师设计的一套编程闯关游戏,网址:PythonChallenge,每一关都可以用一段Python程序解决问题得到下一关的入口,本博文作为一个学习笔记, ...

  7. 安卓3d游戏引擎_3D球闯关游戏-3D球闯关游戏安卓官方版预约 v1.2.5

    3D球闯关游戏是一款让人上瘾的球球跳跃闯关游戏,在音轨上不断跳跃,控制球球顺利到达终点,玩家需要在曼妙的背景音乐下找到自己的闯关节奏,大家只有找到了节奏才能更轻松的完成挑战,轻松点击球球就可以让它不断 ...

  8. 横板闯关游戏中的角色移动

    前言 在很多2D游戏中,都会涉及到角色移动,跳跃等操作,最典型的就是横板闯关游戏.例如经典的魂斗罗.三国战纪等.这两款游戏在地图移动和角色行走的方式中唯一的不同就是魂斗罗是没有纵深的那种. 看似简单, ...

  9. 小鸡拿着蚯蚓闯关的java游戏,蚯蚓大闯关游戏下载|蚯蚓大闯关安卓版下载 v1.0.0 - 跑跑车安卓网...

    蚯蚓大闯关是一款很赞的益智游戏,作为一只蠕虫,陷入了陷阱里,你需要想尽办法努力的逃脱这里,十分的有趣好玩,不要错过哦. 游戏介绍 一只叫做汤姆的蠕虫想要逃离致命的陷阱,你需要帮助它完成数十个令人惊叹的 ...

最新文章

  1. iOS开发学无止境 - UICollectionView自定义布局之风火轮[译]
  2. BZOJ 1603: [Usaco2008 Oct]打谷机
  3. ccpp5 编程练习6.4
  4. 微软 ibm novell云计算大会印象记
  5. python提供了方法用于读取文本文件内容_python提供了哪三种方法用于读取文本文件的内容?...
  6. 认知空间是什么意思_百变立体空间 搭建创意世界
  7. 【Java】jdk 1.8 新特性——Lambda表达式
  8. MRI骨水肿是早期未分化关节炎演变为RA的独立预测预测因素
  9. java sqlite 创建_关于Java:创建3个由sqlite数据库填充的微调器
  10. matlab fft函数说明_关于“如何使用FFT计算天线阵列方向图”学习资料总结
  11. 网易有道词典2019年度十大热词:Vlog、PUA等上榜
  12. thrift的lua实现
  13. 南航计算机考研专业课复习重点
  14. 微信超级更新!电脑上也能刷朋友圈了!
  15. 团队内部分享--工作杂谈(读书推荐)
  16. 多用组合少用继承的设计模式JAVA_结合设计模式理解多用组合少用继承的原则(转)...
  17. 在《王者荣耀》来聊聊游戏的帧同步
  18. 人工智能——归结演绎推理
  19. Gentoo 2005.1 完整的USE参数清单中文详解
  20. 手写数字识别实现课设cnsd博客_讯飞输入法Android V9.1.9465 重磅升级拼音手写A.I.引擎...

热门文章

  1. 看看第七届phpcon大会的大佬,真的很佩服
  2. [转载]Do It Now
  3. 织梦添加图片变量_织梦添加新变量和删除新变量的方法
  4. matlab:lsqcurvefit
  5. 华中农业大学C++考试基础练习题
  6. 用百度map api展示时空数据(五)--老地图的添加与删除
  7. Potplayer+LAVFilters+madVR配置
  8. value too great for base (error token is 08//09)——对于月报中日期的格式报错问题
  9. 当前时间加30分钟_一位短线高手的复盘手记:尾盘预判第二天涨跌,“收盘前30分钟”才是全天最佳买卖黄金时间!...
  10. 关于PlantSimulation远程PLCSIM_Advanced解决方案[含详细操作视频]