我从登录表单教程中得到了这个:
function sanitize($securitystring) {
$securitystring = @trim($str);
if(get_magic_quotes_gpc()) {
$securitystring = stripslashes($str);
}
return mysql_real_escape_string($securitystring);
}
有人可以准确解释这是做什么的吗?我知道之后会打电话给'干净'的var来消毒田地;即$email = sanitize($_POST['email']);
答案 0 :(得分:6)
基本上,如果您启用了魔术引号,POST / SESSION数据中的特殊字符将自动转义(与将addslashes()应用于字符串相同)。 MySQL转义函数比PHP的addslashes()好(虽然我不记得确切的原因)。
您的代码所做的是检查php.ini文件是否启用了魔术引号,如果是,则从数据中删除斜杠,然后使用MySQL函数对其进行重新清理。如果未启用魔术引号,则无需删除斜杠,因此只需使用MySQL函数对数据进行清理并返回。
答案 1 :(得分:2)
首先,这段代码是错误的 它有错误的含义和错误的名称。
没有SQL数据准备代码进行任何清理或清理。 它只是逃避。这种逃避必须是无条件的。 逃避不应与其他任何东西混在一起。
所以,它必须是三个独立的函数,而不是一个。
所以,这里唯一的mysql相关函数是mysql_real_escape_string()。虽然它没有数据“干净”,但只是逃避分隔符。因此,此函数必须仅使用被视为字符串并用引号括起来的数据。所以,这是一个很好的例子:
$num=6;
$string='name';
$num=mysql_real_escape_string($num);
$string=mysql_real_escape_string($string);
$query="SELECT * FROM table WHERE name='$name' AND num='$num'";
虽然这个例子是错误的:
$num=6;
$string='name';
$num=mysql_real_escape_string($num);
$string=mysql_real_escape_string($string);
$query2="SELECT * FROM table WHERE name='$name' AND num=$num";
即使$ query2不会抛出语法错误,这也是错误的数据准备,而mysql_real_escape_string在这里没有任何帮助。因此,此函数只能用于转义被视为字符串的数据。虽然可以对任何数据类型进行,但也有一些例外,例如LIMIT参数,不能将其视为字符串。
答案 2 :(得分:0)
trim()
删除所有空格,如果启用了魔术引号,则会从stripslashes()
的任何转义引号中删除反斜杠。 mysql_real_escape_string()
准备好安全地在mysql查询中使用的字符串。
以下是所用功能的文档:http://php.net/manual/en/function.trim.php,http://php.net/manual/en/function.get-magic-quotes-gpc.php,http://php.net/manual/en/function.stripslashes.php,http://php.net/manual/en/function.mysql-real-escape-string.php
答案 3 :(得分:0)
mysql_real_escape_string
用于转义字符串中的字符,以便向'
等字符添加反斜杠,从而防止攻击者将其他SQL语句嵌入到字符串中。如果字符串未转义,则可以追加其他SQL。例如,可能会执行以下内容:
SELECT * FROM tbl WHERE col =' test'; DELETE * FROM tbl;选择'拥有'
magic_quotes
确实逃脱了自己,但如果我没记错的话,现在不鼓励使用它。此外,MySQL函数将完成防止SQL注入攻击所需的所有转义。
答案 4 :(得分:0)
某些(旧)服务器已启用magic_quotes。这意味着所有外部输入都被更改为(假设)转义它以便在MySQL查询中注入。因此O'Brian
变为O\'Brian
。这是PHP团队早期的设计决定,证明是错误的:
所以在没有magic_quotes的情况下进行编码会更好。问题来自可再发行代码:您无法知道服务器是否启用或禁用magic_quotes。因此,您可以使用get_magic_quotes_gpc()来检测它们是否已打开,如果是,请使用stripslashes()来(尝试)恢复原始输入。