3.然后,使用该变量在Where子句中构造一个数据库查询:
$query = "Select * FROM wines Where variety=''$variety''";
所以,变量$query的值现在如下所示:
Select * FROM wines Where variety=''lagrein''
4.把该查询提交给MySQL服务器。
5.MySQL返回wines表格中的所有记录-其中,字段variety的值为“lagrein”。
到目前为止,这应该是一个你所熟悉的而且是非常轻松的过程。遗憾的是,有时我们所熟悉并感到舒适的过程却容易导致我们产生自满情绪。现在,让我们再重新分析一下刚才构建的查询。
1.你创建的这个查询的固定部分以一个单引号结束,你将使用它来描述变量值的开始:
$query = " Select * FROM wines Where variety = ''";
2.使用原有的固定不变的部分与包含用户提交的变量的值:
$query .= $variety;
3.然后,你使用另一个单引号来连接此结果-描述该变量值的结束:
$ query .= "''";
于是,$query的值如下所示:
Select * FROM wines Where variety = ''lagrein''
这个构造的成功依赖用户的输入。在本文示例中,你正在使用单个单词(也可能是一组单词)来指明一种葡萄酒类型。因此,该查询的构建是无任何问题的,并且结果也会是你所期望的-一个葡萄酒类型为"lagrein"的葡萄酒列表。现在,让我们想象,既然你的用户不是输入一个简单的类型为"lagrein"的葡萄酒类型,而是输入了下列内容(注意包括其中的两个标点符号):
lagrein'' or 1=1;
现在,你继续使用前面固定的部分来构造你的查询(在此,我们仅显示$query变量的结果值):
Select * FROM wines Where variety = ''
然后,你使用包含用户输入内容的变量的值与之进行连接(在此,以粗体显示):
Select * FROM wines Where variety = ''lagrein'' or 1=1;
最后,添加上下面的下引号:
Select * FROM wines Where variety = ''lagrein'' or 1=1;''