从注入中保护我的PHP

时间:2012-11-15 09:36:13

标签: php mysql security

  

可能重复:
  Best way to prevent SQL injection?

我知道有很多关于这个主题的指南,我已经阅读了很多关于它的内容,但我想直接问别人并得到关于此的确认。

好的,我的问题。首先,您需要多久使用一次mysql_real_escape_string。

示例,如果我有一个查询:

"SELECT * FROM tabel WHERE id = $_POST['id'] and email LIKE '%hotmail.com' and row = 2"

我到底需要逃脱什么?使用$ _POST是否足够,还是应该使用查询中的所有变量? (saferize(2), saferize(%hotmail.com))

我的另一个问题是这个功能是否有利于消毒?

function saferize($string) {
    if(get_magic_quotes_gpc() == true) { 
        $string = stripslashes($string);
    }
    $string = htmlspecialchars($string);
    if(strpos($string, '<br />')){
        $string = str_replace('&lt;br /&gt;', '<br />', $string);
    }
    return mysql_real_escape_string($string);
}

我将<br />直接插入数据库,因此为此目的我为htmlspecialchars($string)创建了一个例外。安全方面对此有何看法?

感谢您的回复。

1 个答案:

答案 0 :(得分:0)

如果$ _POST ['id']是一个整数,你可以将它显式地转换为整数并在查询中使用结果

$id = (int)$_POST['id']
"SELECT * FROM tabel WHERE id = $id and email LIKE '%hotmail.com' and row = 2"

或使用PDO准备好的声明

$stmt = $dbh->prepare("SELECT * FROM tabel WHERE id = ? and email LIKE '%hotmail.com' and row = 2");
if ($stmt->execute(array($_POST['id']))) {
  while ($row = $stmt->fetch()) {
    print_r($row);
  }
}