YouTube

Got a YouTube account?

New: enable viewer-created translations and captions on your YouTube channel!

Chinese, Simplified subtitles

← Bobby Tables Destroyer of Posts - Intro to Relational Databases

Get Embed Code
4 Languages

Showing Revision 1 created 08/19/2016 by Udacity Robot.

  1. 在我们改进数据库代码 使其用上真正的数据库时

  2. 你写出的东西可能跟这个很像
  3. 在 getAllPosts 函数里连接数据库 创建光标
  4. 执行一个 select 语句 将结果正确地格式化
  5. 关闭连接并返回贴子
  6. 接下来这个添加贴子的函数 连接数据库 创建光标
  7. 执行一个嵌入了帖子内容的 insert 语句
  8. 向数据库提交改动然后关闭
  9. 看起来没什么不对 然而并不是这样
  10. 如果你要写一堆不同的论坛应用
  11. 有没有哪些贴子是不能正常运行的?
  12. 什么?
  13. 稍等
  14. 这个贴子挺正常的呀
  15. 怎么就出现这个奇怪的错误了呢?
  16. 先回到终端里
  17. 噢 看这
  18. 有一个 python 的回溯信息
  19. 写道代码里有错误
  20. 在 t 的附近有语法错误
  21. 问题发生在 INSERT 语句的 VALUES
  22. 并不能看出有啥问题啊
  23. 再回头来看看代码
  24. 这里就是负责把贴子内容发到数据库的现场
  25. 不过是添加了一个 SQL 语句而已
  26. 不过是在一对单引号里
  27. 因为我们把 SQL 字符串放进一对单引号里
  28. 在数据库看来 贴子里也有一个单引号
    就把它当成整个语句的结束引号了
  29. 所以数据库就看不懂这个 t 是啥了
  30. 多说一句 如果你的代码没有这个错误
  31. 那么恭喜你 一切完美
  32. 但你还要注意这个问题 因为类似错误有很多 可能不会都首次出现
  33. 尽管这里有一些小错误 但仍旧还可以发贴子
  34. 只要不发带单引号的内容就行了
  35. 但我这还有一个例子
  36. 单引号
  37. 右括号
  38. 分号
  39. 不用跟着我说的打
  40. 从指导步骤中复制到你的论坛就行
  41. 从 posts 删除
  42. 分号
  43. 两个短横
  44. 点击发布
  45. 哎呦 所有的贴子都没了
  46. 我们不是有数据库的吗
  47. 等等
  48. 我记得这种情况在 XKCD 漫画里有看到过
  49. 这其实是一种叫做 SQL 注入攻击的安全漏洞
  50. 贴子里的内容被当作了数据库命令
  51. 也就是 从 posts 表单删除
  52. 当它执行时 就删掉了 posts 表单里所有行的数据
  53. 特别讨厌
  54. 而且代码里还有一个臭名昭著的安全漏洞
  55. 怎么修复它呢?
  56. 也许我们再也不能挽回之前那些超酷的贴子了
  57. 但至少我们应该避免让它再次发生