0

我想让用户在表单中输入两个变量,名称和密码。我想禁用输入值中的任何 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 ?>

但它是空的。知道如何解决吗?

4

2 回答 2

2

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

您有 3 个选项:

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

至于消毒,一开始就可以。这取决于您以后将如何处理这些数据。我建议,如果将数据放入数据库中以更详细地查看该怎么做。

于 2012-09-05T15:15:11.760 回答
1

现在magic_quotes_gpc应该在大多数服务器上禁用;但是,请阅读本文以了解禁用它们的其他方法。

此外,您可以filter_input_array()为此目的使用 (PHP >= 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
于 2012-09-05T15:31:20.630 回答