php表单获取数据过滤 php获取表格数据( 三 )


while ($data = https://www.04ip.com/post/mysql_fetch_object($result)){if ($data-ctr == 1){
//they're okay to enter the application!
$okay = 1;
}
}
if ($okay){
$_SESSION['loginokay'] = true;
header(”index.php”);
}else{
header(”login.php”);
}
?
使用 mysql_real_escape_string() 作为用户输入的包装器,就可以避免用户输入中的任何恶意 SQL 注入 。如果用户尝试通过 SQL 注入传递畸形的密码,那么会将以下查询传递给数据库:
select count(*) as ctr from users where username='foo' and password='\' or \'1\'=\'1′ limit 1″数据库中没有任何东西与这样的密码匹配 。仅仅采用一个简单的步骤,就堵住了 Web 应用程序中的一个大漏洞 。这里得出的经验是,总是应该对 SQL 查询的用户输入进行转义 。
但是,还有几个安全漏洞需要堵住 。下一项是操纵 GET 变量 。
防止用户操纵 GET 变量
在前一节中,防止了用户使用畸形的密码进行登录 。如果您很聪明,应该应用您学到的方法 , 确保对 SQL 语句的所有用户输入进行转义 。
但 是,用户现在已经安全地登录了 。用户拥有有效的密码,并不意味着他将按照规则行事 —— 他有很多机会能够造成损害 。例如,应用程序可能允许用户查看特殊的内容 。所有链接指向 template.php?pid=33 或 template.php?pid=321 这样的位置 。URL 中问号后面的部分称为查询字符串 。因为查询字符串直接放在 URL 中,所以也称为 GET 查询字符串 。
在 PHP 中,如果禁用了 register_globals,那么可以用 $_GET['pid'] 访问这个字符串 。在 template.php 页面中,可能会执行与清单 8 相似的操作 。
清单 8. 示例 template.php
复制代码 代码如下:
?php
$pid = $_GET['pid'];
//we create an object of a fictional class Page$obj = new Page;
$content = $obj-fetchPage($pid);
//and now we have a bunch of PHP that displays the page?
这 里有什么错吗?首先,这里隐含地相信来自浏览器的 GET 变量 pid 是安全的 。这会怎么样呢?大多数用户没那么聪明,无法构造出语义攻击 。但是,如果他们注意到浏览器的 URL 位置域中的 pid=33,就可能开始捣乱 。如果他们输入另一个数字,那么可能没问题;但是如果输入别的东西 , 比如输入 SQL 命令或某个文件的名称(比如 /etc/passwd),或者搞别的恶作剧 , 比如输入长达 3,000 个字符的数值,那么会发生什么呢?
在这种情况下,要记住基本规则,不要信任用户输入 。应用程序开发人员知道 template.php 接受的个人标识符(PID)应该是数字 , 所以可以使用 PHP 的 is_numeric()函数确保不接受非数字的 PID,如下所示:
清单 9. 使用 is_numeric() 来限制 GET 变量复制代码 代码如下:
?php
$pid = $_GET['pid'];
if (is_numeric($pid)){
//we create an object of a fictional class Page$obj = new Page;
$content = $obj-fetchPage($pid);
//and now we have a bunch of PHP that displays the page}else{
//didn't pass the is_numeric() test, do something else!
}
?
这个方法似乎是有效的,但是以下这些输入都能够轻松地通过 is_numeric() 的检查:
100 (有效)
100.1 (不应该有小数位)
+0123.45e6 (科学计数法 —— 不好)
0xff33669f (十六进制 —— 危险!危险?。┠敲?,有安全意识的 PHP 开发人员应该怎么做呢?多年的经验表明 , 最好的做法是使用正则表达式来确保整个 GET 变量由数字组成,如下所示:
清单 10. 使用正则表达式限制 GET 变量
复制代码 代码如下:
?php
$pid = $_GET['pid'];
if (strlen($pid)){

推荐阅读