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


if (!ereg(”^[0-9]+$”,$pid)){
//do something appropriate, like maybe logging them out or sending them back to home page}
}else{
//empty $pid, so send them back to the home page}
//we create an object of a fictional class Page, which is now//moderately protected from evil user input$obj = new Page;
$content = $obj-fetchPage($pid);
//and now we have a bunch of PHP that displays the page?
需 要做的只是使用 strlen() 检查变量的长度是否非零;如果是,就使用一个全数字正则表达式来确保数据元素是有效的 。如果 PID 包含字母、斜线、点号或任何与十六进制相似的内容,那么这个例程捕获它并将页面从用户活动中屏蔽 。如果看一下 Page 类幕后的情况,就会看到有安全意识的 PHP 开发人员已经对用户输入 $pid 进行了转义,从而保护了 fetchPage() 方法,如下所示:
清单 11. 对 fetchPage() 方法进行转义
复制代码 代码如下:
?php
class Page{
function fetchPage($pid){
$sql = “select pid,title,desc,kw,content,status from page where pid='”.mysql_real_escape_string($pid).”'”;}
}
?
您可能会问,“既然已经确保 PID 是数字 , 那么为什么还要进行转义?” 因为不知道在多少不同的上下文和情况中会使用 fetchPage() 方法 。必须在调用这个方法的所有地方进行保护,而方法中的转义体现了纵深防御的意义 。
如 果用户尝试输入非常长的数值 , 比如长达 1000 个字符,试图发起缓冲区溢出攻击,那么会发生什么呢?下一节更详细地讨论这个问题,但是目前可以添加另一个检查,确保输入的 PID 具有正确的长度 。您知道数据库的 pid 字段的最大长度是 5 位,所以可以添加下面的检查 。
清单 12. 使用正则表达式和长度检查来限制 GET 变量复制代码 代码如下:
?php
$pid = $_GET['pid'];
if (strlen($pid)){
if (!ereg(”^[0-9]+$”,$pid)strlen($pid)5){//do something appropriate, like maybe logging them out or sending them back to home page}
} else {
//empty $pid, so send them back to the home page}
//we create an object of a fictional class Page, which is now//even more protected from evil user input$obj = new Page;
$content = $obj-fetchPage($pid);
//and now we have a bunch of PHP that displays the page?
现在,任何人都无法在数据库应用程序中塞进一个 5,000 位的数值 —— 至少在涉及 GET 字符串的地方不会有这种情况 。想像一下黑客在试图突破您的应用程序而遭到挫折时咬牙切齿的样子吧!而且因为关闭了错误报告,黑客更难进行侦察 。
缓冲区溢出攻击
缓冲区溢出攻击 试图使 PHP 应用程序中(或者更精确地说,在 Apache 或底层操作系统中)的内存分配缓冲区发生溢出 。请记住 , 您可能是使用 PHP 这样的高级语言来编写 Web 应用程序 , 但是最终还是要调用 C(在 Apache 的情况下) 。与大多数低级语言一样 , C 对于内存分配有严格的规则 。
缓冲区溢出攻击向缓冲区发送大量数据,使部分数据溢出到相邻的内存缓冲区,从而破坏缓冲区或者重写逻辑 。这样就能够造成拒绝服务、破坏数据或者在远程服务器上执行恶意代码 。
防止缓冲区溢出攻击的惟一方法是检查所有用户输入的长度 。例如,如果有一个表单元素要求输入用户的名字,那么在这个域上添加值为 40 的 maxlength 属性,并在后端使用 substr() 进行检查 。清单 13 给出表单和 PHP 代码的简短示例 。
php自定义一个函数用来过滤表单的 。。比如说filter($_POST);调用filter函数的时function filter($array){
foreach($array as $k=$v){
$array[$k]=htmlspecialchars(strip_tags($v));

推荐阅读