在php中执行服务器之前清理输入

时间:2012-09-05 15:08:53

标签: php javascript

我想让用户在表单中输入两个变量Name和Password。我想在输入值中禁用任何XSS或脚本插入。我在表单方法中有以下代码:

<form name="form1" method="post" action="checkpw.php">
Your Name:
<table>
  <tr><td><input class="text" name="name" onBlur="capitalize(this);" maxlength=12 type="text" /></td></tr>
</table> 
Password:
<table>
  <tr><td><input class="text" name="passwd" maxlength=8 type="password" /></td></tr>
  <tr><td align="center"><br/>
     <input class="text" type="submit" name="submitbt" value="Login" />
  </td></tr>
</table>  

以及以下checkpw.php:

<?php

// Clean up the input values 
$post = filter_input_array(INPUT_POST, array(
    'name' => FILTER_SANITIZE_STRING,
    'pw' => FILTER_SANITIZE_STRING,
));

if (is_null($post) || in_array(null, $post)) {
    header("location:login.php");
    return; // missing fields (or failed filter)
} 

// pw is the password sent from the form 
$pw=$_POST['passwd'];
$name=$_POST['name'];

if($pw == 'testpass'){
    header("location:index.php");
} else {
    header("location:wrong.php");
}
?>

这是一种安全的方法来确保将表单发送到服务器并仅在输入值被清理后执行吗?

另外,$ name值我想将它传递给index.php文件。我在index.php中插入一个代码,如下所示:

<?php echo $name ?>

但它是空的。知道怎么解决吗?

2 个答案:

答案 0 :(得分:2)

您正在发出header( .. ),这意味着您正在重定向到另一个页面并从头开始。

您有3个选项:

  • 将您的$ name放入会话中。
  • 在标题函数中传递$ name,例如header("location: index.php?name=$name");
  • 不重定向,但包含php文件。在这种情况下,您根本不需要会话。也会更快,因为你不需要往返浏览器。

至于消毒,一开始就可以。它取决于您稍后将对数据执行的操作。我建议,如果将数据放在数据库中以更详细地查看要做什么。

答案 1 :(得分:1)

现在大多数服务器都应禁用magic_quotes_gpc;但是,请阅读this article以查看禁用它们的其他方法。

此外,您可以使用filter_input_array()(PHP&gt; = 5.2)来实现此目的:

$post = filter_input_array(INPUT_POST, array(
    'name' => FILTER_SANITIZE_STRING,
    'pw' => FILTER_SANITIZE_STRING,
));

if (is_null($post) || in_array(null, $post)) {
    return; // missing fields (or failed filter)
}

// you can safely use $post['name'] and $post['pw'] here