这个功能安全吗?

时间:2011-11-12 17:25:27

标签: php security

支付某人做安全工作,他们说这是安全的,所以想和你们一起检查:

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

4 个答案:

答案 0 :(得分:4)

说实话......我建议你进入下一个级别,跳过mysql_库,去一个数据库抽象层,比如PDO并使用预备语句。你将拥有许多新功能,你的生活将更简单,更快,更好,更强。

http://net.tutsplus.com/tutorials/php/why-you-should-be-using-phps-pdo-for-database-access/

是的,上面的功能是安全的。但是可以修改,我高度怀疑你有一个版本少于5.但它确实很旧,确实......

答案 1 :(得分:1)

对我来说很好 - 只要确保他们在SQL查询中使用单引号,因为仅mysql_real_escape_string是不够的。

例如,而不是:

"SELECT Forename FROM users WHERE userID = $user_id;"

应该是:

"SELECT Forename FROM users WHERE userID = '$user_id';"

假设已使用该函数转义$user_id

答案 2 :(得分:0)

您应该使用MySQLi为您提供准备好的语句,并且无需手动转义字符串。

此外,如果您需要多次执行相同的查询(使用不同的参数),则准备语句要快得多。

答案 3 :(得分:0)

此功能混合了两个不同的问题:

  • 在无法控制魔术引号的环境中规范化输入值
  • 转义 sql参数

撤消输入转义应该在代码开头的单个函数中完成。或者,如果您控制环境,则只需禁用魔术引号。

SQL转义应该在查询形成的地方发生。或者甚至更好地使用预处理语句或类似机制,您根本不需要手动转义参数。


这种关注的混合会产生奇怪的效果:

如果您有来自请求的用户创建数据和来自其他来源的不受信任数据,则需要以不同方式对待它们。否则,您可以在启用了魔术引号的系统上设置安全漏洞。