在PHP中全面阻止SQL注入式攻击

作者:凯旋网络来源:凯旋网络
期望应该使用"单"(而不是"双")引号的内容。一方面,如果你使用双引号来允许PHP在字符串内的变量替代,这样可以使得输入查询更为容易些;另一方面,这(无可否认,只是极少量地)也会减少以后PHP代码的分析工作。
中国.站长站

下面,让我们使用我们一开始使用的那个非注入式查询来说明这个问题: Www@Chinaz@com

以下为引用的内容:

SELECT * FROM wines WHERE variety = ''lagrein''

Chinaz@com

Chinaz^com

或以PHP语句表达为:

中国站长_站,为中文网站提供动力

以下为引用的内容:

$query = "SELECT * FROM wines WHERE variety = ''$variety''"; Www^Chinaz^com

Www~Chinaz~com

从技术上讲,引号对于数字值来说是不需要使用的。但是,如果你并不介意用引号把例如葡萄酒这样的一个域相应的一个值括起来并且如果你的用户把一个空值输入到你的表单中的话,那么,你会看到一个类似下面的查询: [中国站长站]

以下为引用的内容:
SELECT * FROM wines WHERE vintage =
Chinaz.com

当然,这个查询从语法上讲是无效的;但是,下面的语法却是有效的:

Www^Chinaz^com

以下为引用的内容:

SELECT * FROM wines WHERE vintage = '''' Www@Chinaz@com

中国站长.站

第二个查询将(大概)不会返回任何果,但是至少它不会返回一个错误消息。

中国站长_站,为中文网站提供动力

五、 检查用户提交的值的类型

Chinaz@com

从前面的讨论中我们看到,迄今为止,SQL注入的主要来源往往出在一个意料之外的表单入口上。然而,当你经由一个表单向用户提供机会提交某些值时,你应该有相当的优势来确定你想取得什么样的输入内容-这可以使得我们比较容易地检查用户入口的有效性。在以前的文章中,我们已经讨论过这样的校验问题;所以,在此,我们仅简单地总结当时我们讨论的要点。如果你正在期望一个数字,那么你可以使用下面这些技术之一来确保你得到的真正是一个数字类型:

Chinaz.com

· 使用is_int()函数(或is_integer()或is_long())。 中.国站长站

· 使用gettype()函数。

站.长站

· 使用intval()函数。

Chinaz

· 使用settype()函数。

[中国站长站]

为了检查用户输入内容的长度,你可以使用strlen()函数。为了检查一个期望的时间或日期是否有效,你可以使用strtotime()函数。它几乎一定能够确保一位用户的入口中没有包含分号字符(除非标点符号可以被合法地包括在内)。你可以借助于strpos()函数容易地实现这一点,如下所示:

Chinaz@com

以下为引用的内容:

if( strpos( $variety, '';'' ) ) exit ( "$variety is an invalid value for variety!" ); Chinaz~com

Www.Chinaz.com

正如我们在前面所提到的,只要你仔细分析你的用户输入期望,那么,你应该能够很容易地检查出其中存在的许多问题。

Chinaz.com

六、 从你的查询中滤去每一个可疑字符 [中国站长站]

尽管在以前的文章中,我们已经讨论过如何过滤掉危险字符的问题;但是在此,还是让我们再次简单地强调并归纳一下这个问题:

Chinaz^com

· 不要使用magic_quotes_gpc指令或它的"幕后搭挡"-addslashes()函数,此函数在应用程序开发中是被限制使用的,并且此函数还要求使用额外的步骤-使用stripslashes()函数。 站.长.站

· 相比之下,mysql_real_escape_string()函数更为常用,但是也有它自己的缺点。

  • 广告推荐