-1

这是我在 stackoverflow 上的第一篇文章。我需要问一些与PHP 清理输入相关的简单 :D 问题,并且非常感谢任何可以帮助我的人 :)

1)好的,当我运行 get_magic_quotes_gpc() 时,它返回 false。这意味着魔术引号已关闭。它是否正确?

2) 当魔术引号关闭时,我是否应该使用 stripslashes()、htmlentities() 和 strip_tags() 清理任何用户输入的字符串?

3)即使当我输入诸如 \ 或其他字符之类的字符时关闭了魔术引号,我的程序也无法避免它们。这是为什么?

4)然后我修改了我的程序以在处理字符串之前调用一个函数来清理字符串。即使清除了字符串,它仍然会显示那些不需要的字符。sanitizeString() 函数有什么问题吗

下面是我的代码,与问题 3 相关)(该程序应该将华氏温度转换为摄氏温度,反之亦然)

<!DOCTYPE html>
<html>
    <head>

    </head>

    <body>

        <form action="TemperatureConverter.php" method="post">
            <label>Fahrenheit</label><input type="text" name="f" size="10"/><br>
            <label>Celsius</label><input type="text" name="c" size="10"/><br>
            <input type="submit" name="submit" value="SUBMIT">

        </form>


    </body>


</html>




<?php
$f='';
$c='';

if(isset($_POST["f"])){
    $f= sanitizeString($_POST["f"]);
}
if(isset($_POST["c"])){
    $c=sanitizeString($_POST["c"]);
}

if($f!=""){
    $c=(5/9)*($f-32);
    echo $f.' Fahrenhite is equal to '.$c.' Celsius ';
}
else if($c!=""){
    $f=$c*(9/5)+32;
    echo $c.' Celsius is equal to '.$f.' Fahrenhite ';
}

function sanitizeString($str){
    $str=  stripslashes($str);
    $str=  htmlentities($str);
    $str=  strip_tags($str);
    return $str;
}

我想我已经正确发布了符合stackoverflow规则的代码。如果不后悔。:(

4

2 回答 2

0

在您的示例中,您知道输入是一个数字,最好简单地检查它,而不是尝试添加额外的过滤。

例如,

if(isset($_POST["f"])){
    $inFahrenhite = trim($_POST['f']); // remove any leading/trailing spaces
    if (is_numeric($inFahrenhite)) $f = $_POST['f'];
}

上面的代码验证输入是否为数字。由于您期望一个数字,因此其他任何内容都是无效的,可以忽略。

其他问题。

  1. 是的,这意味着设置已关闭。
  2. 不需要所有过滤器。如果输入应该是数字,则无需允许 html 值。使用http://www.php.net/manual/en/book.filter.php将是一个开始。
  3. Magic Quotes 仅转义某些字符。这些设置将被弃用,因此您应该避免使用它。
  4. 这些函数仅用于确保正确转义字符。例如, an&将转换为&amp;. 那里仍然&有一个,但它现在有不同的目的。
于 2014-01-16T11:14:33.260 回答
0

那里有无数写得不好的过时 PHP 教程,基本上表明清理是一个神奇的过程,它可以自动修复您的数据以避免任何潜在的漏洞。许多开发人员接受了这一事实并应用了推荐的功能,甚至没有查看文档以了解他们真正做了什么。结果,他们不仅编写易受攻击的应用程序,而且还在此过程中破坏了合法用户数据。

我的建议:

  1. 阅读您第一次使用的任何功能的文档
  2. 了解你需要解决什么问题
  3. 考虑该函数是否可以解决该问题

例如

strip_tags — 从字符串中去除 HTML 和 PHP 标记

Example #1 strip_tags() 例子

<?php
$text = '<p>Test paragraph.</p><!-- Comment --> <a href="#fragment">Other text</a>';
echo strip_tags($text);
echo "\n";

// Allow <p> and <a>
echo strip_tags($text, '<p><a>');
?>

你有一个温度转换工具。从华氏度中删除 HTML 标记是否有意义?

但是想象一下,您有一个发布 HTML 片段的网站。现在你有了 HTML,在它上面使用 HTML 函数是有意义的,不是吗?但是,为什么要从 HTML 片段中删除HTML?你会让你的网站毫无用处!您需要解决的问题是将这些代码段注入站点并将它们显示为原始 HTML 而不是呈现。为此,您需要例如将每个<符号转换为&lt;.

于 2014-01-16T11:27:31.943 回答