PHP 问题:表单变量
问题
给定以下形式:
表单提交后如何获取输入框的值?
回答
为了获得这里的输入框,我们将使用$_POST超全局数组。这个数组填充了从表单提交的所有内容,包括提交按钮的值。isset()在请求之前使用该函数检查该值是否已设置是一个好主意,否则您的代码将产生警告和通知。
if (isset($_POST['text'])) { $text = $_POST['text']; }
我们使用$_POST超全局变量是因为表单的方法是“post”。如果该方法被省略,或设置为“get”,那么我们将使用$_GET超全局数组代替。这与$_POST的工作方式相同。
理论上可以使用$_REQUEST超全局变量来获取这些数据,如下例所示。
if (isset($_REQUEST['text'])) { $text = $_REQUEST['text']; }
$_REQUEST超全局数组将采用$_COOKIE、$_GET、$_POST超全局变量中的变量值。问题是任何$_COOKIE值都会覆盖任何$_GET和$_POST变量,这意味着如果攻击者设法在用户机器上设置cookie,他们可以覆盖他们提交的任何表单数据。如果这是密码信息,这尤其危险。从PHP5.3开始,request_order指令可用于更改$_REQUEST变量填充方式的顺序,但也可以完全忽略$_COOKIE值。但是,最好暂时避免使用$_REQUEST变量,因为它被认为有些不安全。
当然,仅仅接受来自$_GET和$_POST超全局数组的值是非常危险的。必须使用类似函数strip_tags()和某种形式的转义函数来避免诸如SQL注入攻击或跨站点脚本之类的安全问题。要转义字符串,您可以使用addslashes()或首选的数据库特定功能,例如mysql_real_escape_string(),但请注意,您需要一个活动的数据库连接才能使用这些功能。下面的示例是一个狡猾的字符串,用户可能会尝试输入该字符串,以便在将其打印到浏览器时显示弹出框。通过剥离标签并正确转义来防止攻击。
$input = ''; $text = addslashes(strip_tags($input)); mysql_connect('hostname', 'username', 'password'); $text = mysql_real_escape_string(strip_tags($input)); echo $text;
$text变量现在包含“alert('boo');”并且如果打印出来不会被执行。同样,任何SQL注入攻击也会失败,因为注入代码将被覆盖并按原样插入数据库。这些知识相当简单,但却是PHP开发人员技能的重要组成部分。