【问题标题】:Help to understand magic_quotes_gpc()帮助理解magic_quotes_gpc()
【发布时间】:2010-08-18 00:57:54
【问题描述】:

我正在从一个上传文件的教程中学习这个 PHP 代码

<form method="post" enctype="multipart/form-data">
  <input name="userfile" type="file" id="userfile">  
</form>

<?php
  if (isset($_POST['upload']) && $_FILES['userfile']['size'] > 0) {
    $fileName = $_FILES['userfile']['name'];
    $tmpName  = $_FILES['userfile']['tmp_name'];
    $fileSize = $_FILES['userfile']['size'];
    $fileType = $_FILES['userfile']['type'];

    $fp      = fopen($tmpName, 'r');
    $content = fread($fp, filesize($tmpName));
    $content = addslashes($content);
    fclose($fp);

   if (!get_magic_quotes_gpc()) {
     $fileName = addslashes($fileName);
   }

   include 'library/config.php';
   include 'library/opendb.php';

   $query = "INSERT INTO upload (name, size, type, content ) ".
     "VALUES ('$fileName', '$fileSize', '$fileType', '$content')";

   mysql_query($query) or die('Error, query failed');
   include 'library/closedb.php';

现在我通过使用 php 文档了解了每个函数和所有内容

除了

get_magic_quotes_gpc()
  • 这是什么?它有什么作用?
  • 这很重要吗?如果是,是否有替代品?
  • PHP 手册说“自 PHP 5.3.0 起,此功能已被弃用。强烈建议不要依赖此功能。”。请详细说明?
  • 有没有办法将文件上传到(网络)服务器硬盘并提供指向它们的链接..

【问题讨论】:

  • 无论magic_quotes如何,这段代码都容易受到sql注入的影响,如果你想要一个更好的答案,你应该给它一个[security]标签。写这篇文章的人不懂 php 或安全性。
  • 好吧,如果禁止在我的输入(文本框)中输入 '(引号)字符,那么我将确保 SQL 注入不是我...

标签: php security function manual


【解决方案1】:

get_magic_quotes_gpc() 是一个检查配置 (php.ini) 的函数,如果 magic_quotes_gpc 关闭则返回 0(否则返回 1)。

打开magic_quotes 时,所有'(单引号)、"(双引号)、\(反斜杠)和NUL 都会自动用反斜杠转义。这是为了防止各种注入安全问题。

在您的情况下,代码会检查设置是否关闭并添加斜杠以正确转义内容以防止 SQL 注入。

就像你说的——这个特性已经被弃用了,将来肯定会被移除(事实上他们在 PHP6 中移除了它)。

另一种方法是在运行时根据需要转义数据

【讨论】:

  • awesome.... 无法给出更好的解释... 伙计,你能重写 PHP 手册让全世界都理解吗
  • 我唯一要补充的是,它试图防止注入安全问题。它做得不是很好(因此是mysql_real_escape_string之类的功能的原因)。其次,永远不要使用它 (magic_quotes_gpc)。如果函数返回 true(已启用),则在所有输入上运行 stripslashes。然后通过准备好的查询绑定您的参数,或使用mysql_real_escape_string/mysqli::real_escape_string。 不要依赖magic_quotes_gpc...它被弃用是有原因的...(因此您在问题中发布的代码很容易受到攻击)...
【解决方案2】:

在阅读了您的帖子以及所有答案和 cmets 后,我认为此功能可能会有所帮助,

function mysql_prep( $value ) {
    $magic_quotes_active = get_magic_quotes_gpc();
    $new_enough_php = function_exists( "mysql_real_escape_string" ); // i.e. PHP >= v4.3.0
    if( $new_enough_php ) { // PHP v4.3.0 or higher
        // undo any magic quote effects so mysql_real_escape_string can do the work
        if( $magic_quotes_active ) { $value = stripslashes( $value ); }
        $value = mysql_real_escape_string( $value );
    } else { // before PHP v4.3.0
        // if magic quotes aren't already on then add slashes manually
        if( !$magic_quotes_active ) { $value = addslashes( $value ); }
        // if magic quotes are active, then the slashes already exist
    }
    return $value;
}

【讨论】:

    猜你喜欢
    • 2011-09-20
    • 1970-01-01
    • 2018-12-21
    • 2011-08-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多