繁体   English   中英

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

[英]PHP code vulnerable to SQL injection: how to work with `mysql_real_escape_string()`?

当我从几年前的教程中学习时,我最终得到了以下代码,这些代码易受 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);

是的,这个很好。 不过,您可以使用准备好的语句

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

您 append 查询字符串的所有内容都应该使用mysql_real_escape_string进行转义。 它将阻止大多数 SQL 注射。 但最好使用准备好的语句

例子:

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

请参阅PDO::__construct以供参考

黑客攻击没有什么是万无一失的。 话虽如此,是的.. mysql_real_escape_string() 可以防止 SQL 注入攻击。

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

我会做类似的事情

sprintf(" SELECT * from table_name WHERE value = '%s'", mysql_escape_string("$var_value"));

sprintf() function 中的 %s 表示该参数被视为字符串并显示为字符串。

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

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

并将返回一个空的结果集。 (资源)

是的。 在这种情况下。

请注意,没有什么比得上“通用消毒”。 让我们称之为引用,因为这就是它的全部内容。

引用时,您总是引用某些特定 output的文本,例如:

  1. mysql 查询的字符串值
  2. mysql 查询的like表达式
  3. html代码
  4. json
  5. mysql 正则表达式
  6. php 正则表达式

对于每种情况,您需要不同的引用,因为每种用法都存在于不同的语法上下文中。 这也意味着不应在 PHP 的输入处进行引用,而应在特定的 output 处进行引用 这就是诸如magic_quotes_gpc之类的功能被破坏的原因(我建议将其关闭)。

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

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

您可以使用 mysql_real_escape_string 来转义危险字符...

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM