mysqli_real_escape_string安全吗?

时间:2014-03-10 15:51:26

标签: php mysqli sql-injection

我是PHP的新手,我意识到我的数据库连接,使用php表单(使用用户和传递文本输入)完全不安全:

这很有效,但不安全:

<?php
$link=mysqli_connect('localhost','xx','xx','xx');
$sql='  SELECT * FROM usuarios 
        WHERE username="'.$_POST['usuario'].'" 
        AND pass="'.$_POST['usuario'].'"
     ';
$rs=mysqli_query($link,$sql);
mysqli_close($link);
?>

所以,我读过mysqli_real_escape_string,并决定尝试一下:

<?php    
$link=mysqli_connect('localhost','xx','xx','xx');
$usuario=mysqli_real_escape_string($link, $_POST["usuario"]);
$clave=mysqli_real_escape_string($link, $_POST["clave"]);
$sql='  SELECT * FROM usuarios 
        WHERE username="'.$usuario.'" 
        AND pass="'.$clave.'"
     ';
$rs=mysqli_query($link,$sql);
mysqli_close($link);
?>

这是对的吗?这是如何使用mysqli_real_escape_string的一个很好的例子吗?

3 个答案:

答案 0 :(得分:18)

  

这是对的吗?

  

这是如何使用mysqli_real_escape_string的一个很好的例子吗?

NO

如果曾经使用过,这个函数必须封装到一些内部处理中,而不必从应用程序代码中直接调用。必须使用占位符来表示查询中的数据:

$sql='SELECT * FROM usuarios WHERE username=? AND pass=?';

然后,在处理占位符标记时,可以 应用此函数(如果适用),但不能单独应用,而是应用所有格式规则。

答案 1 :(得分:7)

是的,你现在就省时使用它。

使用mysqli的好处是它面向对象。 所以你可以像这样使用它:

<?php

$mysqli = new mysqli("host", "user", "password", "database");

$usuario = $mysqli->real_escape_string($_POST["usuario"]);
$clave = $mysqli->real_escape_string($_POST["clave"]);

$sql='  SELECT * FROM usuarios 
        WHERE username="'.$usuario.'" 
        AND pass="'.$clave.'"
     ';

$mysqli->query($sql);

$mysqli->close();
?>

或者您可以使用PDO。

答案 2 :(得分:5)

mysqli()函数的使用只应保留给框架开发人员以及了解其可能带来的所有安全问题的其他人。对于其他人来说,有PDO。它和mysqli()一样容易使用,而且更安全。

相关问题