mysqli_real_escape_string安全吗?

Ros*_*nda 14 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);
?>
Run Code Online (Sandbox Code Playgroud)

所以,我读过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);
?>
Run Code Online (Sandbox Code Playgroud)

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

You*_*nse 19

它是否正确?

是.

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

没有

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

$sql='SELECT * FROM usuarios WHERE username=? AND pass=?';
Run Code Online (Sandbox Code Playgroud)

然后,在处理占位符标记,此功能可以被应用(如适用),但不是本身,而是沿着所有的格式规则.

  • 请在mysqli_real_escape_string`之前和生成的字符串之后给我示例.因为它混乱而且没有给出任何例子. (6认同)

小智 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();
?>
Run Code Online (Sandbox Code Playgroud)

或者您可以使用PDO.

  • 请不要使用未准备好的语句。说真的,只是不要/。有几十年的漏洞利用 unicode 和其他边缘情况来绕过 mysql_real_escape 和 real_escape 。只需将其放入准备好的声明中并让驱动程序处理即可。 (2认同)

Erm*_*mir 6

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

  • "*它和mysqli()一样容易使用,而且**更安全.***" - [引证需要] (6认同)
  • 如果您之前不知道,PDO不会对准备好的声明拥有垄断权. (5认同)
  • 我以前读过那篇文章而且我看不出它在哪里解释"PDO更安全*". (4认同)
  • 好吧,我发布的链接解释了为什么PDO比mysqli()和字符串连接更安全.如果您仍然不相信,那么[这个](http://stackoverflow.com/questions/134099/are-pdo-prepared-statements-sufficient-to-prevent-sql-injection)讨论是从2008年开始的,并且仍然相关今天.在我看来,对大部分SQL攻击的免疫力肯定是"更安全". (2认同)