php如何防止sql注入攻击?
注入攻击的类型
攻击动机可能有许多不同的类型,但乍一看,似乎有更多的类型。这是非常真实的——如果恶意用户找到了执行多个查询的方法。在本文的后面,我们将详细讨论这一点。
诸如
如果您的脚本正在执行SELECT指令,那么攻击者可以强制显示表中的每一行记录——通过将11这样的条件注入WHERE子句,如下所示(其中注入的部分以粗体显示):
SELECT*FROMsit
SQL联合查询?
交叉连接交叉连接。是一种没有任何限制的连接方法,结果是笛卡尔积。SQL语法如下所示:
上述SQL相当于:
内部联接(默认为联接)内部联接。当表中至少有一个匹配项时返回行可以理解为同时满足某些条件的两个表中的行的组合。内连接又分为等连接、不等连接和自连接。SQL语法如下所示:
使用作为连接条件。
不平等连接:不用作连接条件。
自连接:自己连接自己,也就是只连接一个表。
左连接左连接。一种外部联接,返回左表(table1)中的所有行。即使右表(table2)中没有匹配项,如果右表中没有匹配项,结果也是NULL。SQL语法如下所示:
右连接右连接。一种外部联接类型,如果左表中没有匹配项,则返回右表(表2)中的所有行,即使左表(表1)中没有匹配项。匹配,结果为空。SQL语法如下所示:
完全连接。一种外部联接,只要左表(表1)和右表(表2)中有一个匹配项,就会返回一行,从而聚合左联接和右联接的结果。SQL语法如下所示:
其中,MySQL不支持全联接,全联接的查询可以通过左联接、并联接和右联接相结合来实现。示例:
联合联合查询(去重)。用于合并两个或多个SELECT语句的结果集。UNION中的每个SELECT语句必须具有相同顺序的相同数量的列,并且这些列还必须具有相似的数据类型。SQL语法如下所示:
注意:联合查询的结果中没有重复的值。
UNIONALLunion查询(无重复)。用于合并两个或多个SELECT语句的结果集。UNION结果集中的列名始终等于UNION中第一个SELECT语句中的列名。SQL语法如下所示:
或者:
注意:
UNIONALL查询的结果中允许有重复值。
使用UNION或UNIONALL时,只能在最后一个SELECT语句中使用ORDERBY命令。