花钱请人做保安工作,他们说这是安全的,所以想和你们核实一下:
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;
}
说实话…我建议你进入下一个层次,跳过mysql_库,去一个数据库抽象层,比如PDO,并使用准备好的语句。你将有很多新功能可以使用,你的生活将更简单、更快、更好、更强大。
http://net.tutsplus.com/tutorials/php/why-you-should-be-using-phps-pdo-for-database-access/是的,上面的函数是安全的。但可以修改,我非常怀疑你有一个版本少于5。
对我来说很好-只要确保他们在SQL查询中使用单引号,因为仅mysql_real_escape_string
是不够的。
例如:
"SELECT Forename FROM users WHERE userID = $user_id;"
应该是:
"SELECT Forename FROM users WHERE userID = '$user_id';"
假设$user_id
已经使用该函数进行了转义。
你应该使用MySQLi,它给你准备好的语句,并消除了手动转义字符串的需要。
另外,如果您需要多次执行相同的查询(使用不同的参数),则准备语句要快得多。
这个函数混合了两个不同的关注点:
- 在魔术引号无法控制的环境中规范输入值
- 转义sql参数
输入转义的撤销应该在代码开头的一个函数中完成。或者,如果您控制环境,只需禁用魔术引号。
SQL转义应该发生在形成查询的地方。或者更好地使用预处理语句或类似的机制,您根本不需要手动转义参数。
这种关注点的混合导致了奇怪的效果:
如果您有来自请求的用户创建的数据,以及来自其他来源的不受信任的数据,您需要区别对待它们。否则,您可能会在启用魔术引号的系统上造成安全漏洞。