学习。
当我们使用sql时,需要转义用户输入或更好地使用预准备语句以避免注入。
这需要潜在的SQL语言缺陷吗?
想象一下,我有一个http服务器,我将用户输入直接放在二进制文件中,是否有可能注入?
当我需要再次阅读时,fopen,fread,fclose和work done,不是吗?我还是不容易受到攻击(我不会谈论清理以避免客户端浏览器中的xss,只是注入)。
最后,sql也将字符串放入文件中。
那有什么区别? sql语言弱吗?我的方法有风险吗?为什么?
答案 0 :(得分:1)
这在很大程度上取决于您如何解释用户输入。如果您只是在稍后阶段将用户输入存储到中继中,则可能没问题,但在您的示例中,如果您读取输出然后将其输出到网页,则您将向用户开放恶意输入。我们假设您从输入字段中读取并直接将其输出到html文件中并提供服务,让我们说为<p>user text</p>
。如果恶意用户知道您的布局,他们可以轻松地在那里放一些javascript。更糟糕的是,如果您使用此数据生成(比方说).php
文件,恶意用户可能会制作最终会在您的服务器上运行的内容。任何有解释层的地方都有注射风险。
答案 1 :(得分:1)
如果用户输入被执行或者是执行的某些内容(sql,html,shell脚本......),你应该总是逃避它。 如果你只是阅读价值观,没有理由逃避它。
答案 2 :(得分:0)
如果您构建SQL命令字符串,则应始终转义来自用户输入的部分。
否则,请使用准备好的陈述。
它并不是SQL的弱点,而是大多数图灵完整解释语言的属性。 Code injection可以 - 并且确实 - 在SQL之外发生(例如在shell脚本,PHP代码等中......)
另请阅读Quine programs(以及google的编程语言中的反引号和准引号)。