PHP - 当关闭魔法点击时我应该清理字符串吗?

时间:2014-01-16 11:06:09

标签: php html input-sanitization

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

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

2)我应该使用stripslashes(),htmlentities()&amp ;;来清理任何用户输入的字符串。 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的规则。如果没有抱歉。 :(

2 个答案:

答案 0 :(得分: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. 这些功能仅用于确保正确转义字符。例如,&会转换为&amp;。那里还有&,但它现在有不同的目的。

答案 1 :(得分:0)

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

我的建议:

  1. 阅读您第一次使用的任何功能的文档
  2. 了解您需要解决的问题
  3. 考虑该功能是否能解决该问题
  4. For instance

      

    strip_tags - 从字符串中删除HTML和PHP标记

         

    示例#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;