教师：正如您到目前为止所看到的,
SQL注入非常危险｡
而且, 他们很容易（喃喃自语）, 很容易找到｡
你会发现他们无处不在的一些真正著名的网站
人们试图使用过滤器来防止这些漏洞｡
过滤器可以使它看起来像没有漏洞,
但如果您实际上通过使用编码､ 不同类型的编码或使用代理来更加努力,
那么您将能够绕过大多数过滤器｡
有些程序员使用黑名单｡
例如, 它们禁止使用union, 禁止使用insert之类的东西｡
再说一次, 它不是100%安全的｡
它可以被绕过｡
使用白名单？
和黑名单的问题完全一样｡
最好的方法是以一种不允许将代码注入到Web应用程序中然后执行的方式对Web应用程序进行编程｡
最好的方法是使用参数化语句,
其中数据和代码是分开的｡
最好的方法是用一个例子来说明我的意思｡
在这个例子中, 我保留了最少的编程｡
我不想让它成为一个编程示例｡
实际上在编程中有一些错误,
但我试图给你的概念比如何编程更重要｡
我们看到的易受攻击的代码就是这样做的｡
它用于从用户名等于我们在textbox1中输入的内容的帐户中选择
*｡
然后, 我们通常会在textbox1中输入,
我们将其放在这里,
我们通常会说admin, 然后关闭引号｡
然后我们可以执行联合选择, 并执行其他操作.
然后, 一旦我们完成了, 我们通常会添加注释,
基本上, 忽略了它后面的所有内容｡
所以, 当你复制这个,
然后粘贴到这里, 你会看到发生了什么｡
现在, 我们把这个去掉,
因为这会使颜色不好看｡
其实我只是想评论一下｡
它将从用户名等于管理员的帐户中执行select
*, union select并执行我们想要执行的任何操作｡
这是非常糟糕的, 而且很难防范｡
正如我所说的, 使用过滤器和其他东西,
我们只会隐藏问题, 我们不会解决它｡
最好的方法是使用参数化语句,
就像这样｡
这是安全的方法｡
首先, 你准备你的陈述｡
大多数像PHP这样的语言,
实际上, 它们都有这样的函数｡
您可以从用户名等于问号的帐户中准备select
*｡
然后发送值｡
因此, PHP现在知道了｡
SQL语句是从username等于某个值的帐户中选择
*｡
然后取textbox1的值｡
因此, 即使我们在这里使用非常隐蔽的语句,
并将其粘贴到那里, Web应用程序也会知道此值为admin
union select｡
实际上, 它会尝试从用户名所在的帐户中选择
*, 然后, 它会添加自己的引号, 并尝试找到具有以下用户名的用户名｡
整件事就这样执行｡
因此, 它将是select * from
accounts, 其中username等于admin union select,
此标签｡
您在文本框中输入的任何内容都将作为值发送｡
Web应用程序将知道这是一个值,
而不是代码, 并且永远不会执行它｡
因此, 这将保护您免受SQL注入的影响｡
您可以使用过滤器作为第二道防线,
我还建议您使用尽可能少的权限｡
对于每个数据库, 请使用一个具有所需最少权限的用户｡
不允许用户做任何他们想做的事情｡
如果它是一个简单的网站, 只做选择, 然后只允许用户选择｡
如果只需要选择和插入,
则只允许选择和插入｡
这是一条你应该遵守的规则, 即使是Linux系统｡
请确保权限始终尽可能最小｡
每个用户都没有任何不需要的额外权限｡