2010-08-18 56 views
7

我从一个教程学习这个PHP上传文件代码有助于了解magic_quotes_gpc的()

<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文件每一个函数和一切

EXCEPT

get_magic_quotes_gpc() 
  • 这是什么?它能做什么?
  • 它是否是重要的?如果是,是否有替代品?
  • PHP手册说:“这个特性自PHP 5.3.0开始已经被拒绝了,依靠这个特性是非常令人沮丧的。”请详细说明一下?
  • 是不是有文件上传到(网络)服务器harDisk并提供链接到他们的方式..
+1

此代码是容易受到SQL注入不论magic_quotes的后,你应该给它一个[安全]标签,如果你想一个更好的答案。谁写这不懂php或安全。 – rook 2010-08-18 02:39:41

+0

好,如果禁止输入'(引号)字符在我的输入(文本框),那么我将安全SQL注入不会我... – Moon 2010-08-19 08:05:40

回答

15

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

当magic_quotes的是,所有'(单引号),“(双引号),\(反斜线)和完全无效会自动用一个反斜杠转义。这是为了防止各种注射安全问题。

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

就像你说的 - 此功能已被弃用,将来肯定会被删除(事实上,它在PHP6中)

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

+0

真棒....不能给出一个更好的解释...人可以你重写全世界的PHP手册以了解 – Moon 2010-08-18 01:18:30

+1

我唯一的补充是说它试图防止注入安全问题。它没有做很好的工作(因此也是像'mysql_real_escape_string'这样的函数的原因)。其次,永远不要使用它('magic_quotes_gpc')。如果函数返回true(已启用),请在所有输入上运行'stripslashes'。然后通过一个准备好的查询绑定你的参数,或者使用'mysql_real_escape_string/mysqli :: real_escape_string'。 **不要依赖'magic_quotes_gpc' ** ...有一个原因,它已被弃用...(并且你的代码在这个问题上发布是脆弱的,因为这一点)... – ircmaxell 2010-08-18 02:21:17

+0

你的意思是它只是预先斜线'\ \对任何这样的html实体/字符? – 2017-06-27 11:58:59

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