Security 获取\u magic\u quotes\u gpc()和mysql\u real\u escape\u字符串-安全性

Security 获取\u magic\u quotes\u gpc()和mysql\u real\u escape\u字符串-安全性,security,function,mysql-real-escape-string,Security,Function,Mysql Real Escape String,我正在练习php,在解释函数以逃避危险的sql字符时感到困惑。我想知道它是如何工作的,尤其是第二个if中的$value。对我来说,理解函数的实际流程是一件令人费解的事情 function quote_smart($value, $handle) { if (get_magic_quotes_gpc()) { $value = stripslashes($value); } if (!is_numeric($value)) { $value = "

我正在练习php,在解释函数以逃避危险的sql字符时感到困惑。我想知道它是如何工作的,尤其是第二个if中的$value。对我来说,理解函数的实际流程是一件令人费解的事情

function quote_smart($value, $handle) {

   if (get_magic_quotes_gpc()) {
       $value = stripslashes($value);
   }

   if (!is_numeric($value)) {
       $value = "'" . mysql_real_escape_string($value, $handle) . "'";
   }
   return $value;
}
此函数不会“转义危险的sql字符”。它确实将
$value
格式化为正确的mySQL文本。但是它错了吗

  • 因为它处理
    get\u magic\u quotes\u gpc()
    
  • 它有一些魔力,试图格式化数字或字符串
  • 它的目的是直接格式化插入到查询中的值,而不是通过占位符
必须提供正确的版本

function quote_string($value, $handle)
{
    return = "'" . mysql_real_escape_string($value, $handle) . "'";
}
它应该只用于处理占位符


虽然魔引号必须在引导文件中处理,但对于所有输入值,不仅仅是进入查询的值,尽管只是出于兼容性目的。

代码的基本功能是

  • 首先,它删除了当且仅当在服务器中启用时的效果。不应该这样,因为magic_quotes已经被弃用了一段时间(并且在新的PHP版本中被完全删除)

  • 其次,它将
    $value
    的所有非数字值括在单引号中,并使用
    mysql\u real\u escape\u string
    对值进行转义,以避免在值字符串中注入SQL


使用最新版本的PHP,这种方法应该根本不存在,因为永远不应该启用
magic\u quotes\u gpc
,并且您将使用
PDO
MySQLi
参数化查询,这些查询不需要转义它们的值。

@YourCommonSense blink我可能没有咖啡了,但是,如果回答说您应该转义字符,而不是删除字符,那么该函数中转义字符而不是删除字符的内容与此函数中的任何内容有何矛盾?参数化查询当然会更好,但是…你可能不明白我想说什么。。实际上,这是我代码的一部分,实际上,我在表单中传递用户输入的参数,然后在$handle中连接到数据库,并将输入作为$value传递,我只关心传递变量$uname=quote_smart($uname,$db_handle)的特定代码部分;$pword=quote_smart($pword$db_handle);如果我在特定的函数中传递一个像O'corner这样的值,那么它将作为查询传递给sql………..$uname=quote_smart($uname,$db_handle);$SQL=“SELECT*FROM login,其中L1=$uname;$result=mysql\u query($SQL);@user2591221您可能会将其用作
$SQL='SELECT*FROM users WHERE name='。quote_smart(“O'Corner”);
这将提供一个有效的MySQL查询,类似于
SELECT*FROM users WHERE name='O'Corner'
。与参数化查询相比,从字符串生成查询相对容易出错。如果从更新版本的php中删除magic quote,我们现在使用的代码是什么it@user2591221如果您正确使用
mysql\u real\u escape\u string
,您不需要神奇的引号。添加它的初衷是,如果您忘记逃逸SQL,它会误导您阻止SQL注入,但由于它很容易被黑客绕过,因此在互联网上没有多大用处。