我刚刚开始尝试在PHP中验证数据,并且我试图更好地理解这个概念。我希望将作为$data
参数test_input()
参数的参数传递给trim()
函数的字符串由以下PHP函数格式化。
stripslashes()
从字符串末尾删除空格htmlspecialchars()
返回带有反斜杠的字符串$santised_input
将特殊字符转换为HTML实体问题是我在函数结尾处回显的字符串没有按照我想要的方式进行格式化。事实上,当我在我的服务器上运行此代码时,它看起来完全一样 - 没有删除空格,反斜杠没有被删除,也没有特殊字符转换为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 ""><script>alert('hacked')</script>"
?>
吗?
{{1}}
答案 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进行正则表达式。
答案 3 :(得分:0)
您还应该了解PHP 5中添加的filtering functions。filter_var
字符串可以按如下方式消毒
$sanitised = filter_var($data, FILTER_SANITIZE_STRING);
您可以使用各种选项对其进行消毒,例如
$sanitised = filter_var($data, FILTER_SANITIZE_STRING, FILTER_FLAG_NO_ENCODE_QUOTES);
这些功能对于通过FILTER_SANITIZE_URL
和FILTER_SANITIZE_EMAIL