PHP代码易受SQL注入攻击:如何使用`mysql_real_escape_string()`?

时间:2011-08-12 15:10:25

标签: php sql sql-injection

当我从几年前的教程中学习时,我最终得到了以下易于进行SQL注入的代码。

有人可以向我解释如何使用mysql_real_escape_string()吗? 这是目前的防弹方法吗?

//Function to sanitize values received from the form. Prevents SQL injection
    function clean($str) {
    $str = @trim($str);
    if(get_magic_quotes_gpc()) {
        $str = stripslashes($str);
    }
    return mysql_real_escape_string($str);
}

//Sanitize the POST values
$usr = $_SESSION['usr'];
$live = (isset($_POST['live']))?1:0;
$created = date("F j, Y, g:i a",time()+60*60);
$title= clean($_POST['title']);
$content = clean($_POST['content']);

//Create INSERT query
$qry = "INSERT INTO news( usr, live, created, title, content) VALUES( '$usr', '$live', '$created', '$title', '$content') ";
$result = @mysql_query($qry);

7 个答案:

答案 0 :(得分:2)

是的,这个很好。 You can use prepared statements,但

不要使用@来隐藏所有错误!

答案 1 :(得分:2)

您追加查询字符串的所有内容都应使用mysql_real_escape_string进行转义。它将阻止大多数SQL注入。但最好使用prepared statements

示例:

$pdo = new PDO($dsn,$username,$pass);
$stmt = $pdo->prepare("select * from Table where id=?");
if ($stmt->execute(array(1))){
    $content = $stmt->fetchAll();
}

请参阅PDO::__construct以获取参考资料

答案 2 :(得分:1)

在黑客攻击方面没有什么是防弹的;话虽如此,是的.. mysql_real_escape_string()可以防止SQL注入攻击。

答案 3 :(得分:1)

我认为你的方法是sql注入保存。

答案 4 :(得分:1)

我会做像

这样的事情
sprintf(" SELECT * from table_name WHERE value = '%s'", mysql_escape_string("$var_value"));

  

来自sprintf()函数的%s表示该参数被视为字符串并以字符串形式显示。

     

如果发生了攻击,例如上一个示例中的攻击,则发送的查询将是:   查看源   打印?

SELECT * FROM `members` WHERE username='john' AND password='\' OR \'\'=\''
     

并返回一个空结果集。 (source)

答案 5 :(得分:1)

是的,确实如此。 在这种情况下。

请注意,没有什么比“普遍消毒”更像。我们称之为引用,因为这就是它的全部内容。

引用时,始终为某些特定输出 引用文字,例如:

  1. mysql查询的字符串值
  2. like mysql查询表达式
  3. html代码
  4. JS​​ON
  5. mysql正则表达式
  6. php正则表达式
  7. 对于每种情况,您需要不同的引用,因为每种用法都存在于不同的语法上下文中。这也意味着引用不应该在PHP的输入中进行,而是在特定的输出!这就是magic_quotes_gpc等功能被破坏的原因(我建议将其关闭)。

    那么,在这些特定情况下,用什么方法来引用? (随意纠正我,可能有更现代的方法,但这些对我有用)

    1. mysql_real_escape_string($str)
    2. mysql_real_escape_string(addcslashes($str, "%_"))
    3. htmlspecialchars($str)
    4. json_encode() - 仅适用于utf8!我将我的功能用于iso-8859-2
    5. mysql_real_escape_string(addcslashes($str, '^.[]$()|*+?{}')) - 在这种情况下你不能使用preg_quote,因为反斜杠会被转义两次!
    6. preg_quote()

答案 6 :(得分:1)

你可以使用mysql_real_escape_string来逃避危险的角色......

$sanitized_query = sprintf("SELECT * FROM table WHERE field='%s', mysql_real_escape_string($value));