帮助理解magic_quotes_gpc()

时间:2010-08-18 00:57:54

标签: php security function manual

我正在从上传文件的教程中学习这个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开始,此功能已被弃用。非常不鼓励依赖此功能。”请详细说明吗?
  • 没有办法将文件上传到(网络)服务器harDisk并提供指向它们的链接..

2 个答案:

答案 0 :(得分:17)

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

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

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

就像你说的那样 - 这个功能已被弃用,将来肯定会被删除(实际上他们已经在PHP6中删除了它)。

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

答案 1 :(得分:0)

阅读完您的帖子以及所有答案和评论后,我认为这个功能可能会有所帮助,

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;
}