增加对使用PHP字符串函数验证字符串的理解

时间:2014-05-29 15:04:02

标签: php

我刚刚开始尝试在PHP中验证数据,并且我试图更好地理解这个概念。我希望将作为$data参数test_input()参数的参数传递给trim()函数的字符串由以下PHP函数格式化。

  1. stripslashes()从字符串末尾删除空格
  2. htmlspecialchars()返回带有反斜杠的字符串
  3. $santised_input将特殊字符转换为HTML实体
  4. 问题是我在函数结尾处回显的字符串没有按照我想要的方式进行格式化。事实上,当我在我的服务器上运行此代码时,它看起来完全一样 - 没有删除空格,反斜杠没有被删除,也没有特殊字符转换为HTML实体。

    我的问题是,我是以错误的方式解决了这个问题吗?我是否应该在3个单独的行上创建名为trim()的变量,其中每个函数stripslashes()htmlspecialchars()$santised_input

    根据我的理解,每当我在新的代码行上重新创建它时,我肯定会覆盖trim()变量的值。因此,永远不会执行stripslashes()"$santised_input"字符串函数。

    我想要实现的是当$data参数传递给我的test_input()函数时,使用$santised_input变量来运行所有这些PHP字符串函数。换句话说,这些字符串函数可以链接在一起,这样我只需要创建一次<?php function test_input($data) { $santised_input = trim($data); $santised_input = stripslashes($data); $santised_input = htmlspecialchars($data); echo $santised_input; } test_input("%22%3E%3Cscript%3Ealert('hacked')%3C/script%3E\ "); //Does not output desired result "&quot;&gt;&lt;script&gt;alert('hacked')&lt;/script&gt;" ?> 吗?

    {{1}}

4 个答案:

答案 0 :(得分:5)

您正在原始$data变量上执行每个字符串函数,并且每次都会覆盖$santised_input的值。输出与简单地运行最后一个字符串函数和前两个函数都没有区别。

要解决,请在$santised_input变量上执行后面的功能;

function test_input($data) {
   $santised_input = trim($data);
   $santised_input = stripslashes($santised_input);
   $santised_input = htmlspecialchars($santised_input);
   echo $santised_input;
}

答案 1 :(得分:1)

编辑:对不起,误读了这个问题。你实际上可以这样做:

$sanitised_input = htmlspecialchars(stripslashes(trim($data)));

这应该可以解决问题。我想。

答案 2 :(得分:0)

我从不相信这些功能,我会使用preg_replace进行正则表达式。

http://www.php.net/manual/es/function.preg-replace.php

答案 3 :(得分:0)

您还应该了解PHP 5中添加的filtering functionsfilter_var

字符串可以按如下方式消毒

$sanitised = filter_var($data, FILTER_SANITIZE_STRING);

您可以使用各种选项对其进行消毒,例如

$sanitised = filter_var($data, FILTER_SANITIZE_STRING, FILTER_FLAG_NO_ENCODE_QUOTES);  

这些功能对于通过FILTER_SANITIZE_URLFILTER_SANITIZE_EMAIL

验证和清理网址和电子邮件特别有用