php mysqli_真实的_escape_string安全吗?

slmsl1lt  于 2023-05-12  发布在  PHP
关注(0)|答案(3)|浏览(233)

我是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_真实的_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_真实的_escape_string的好例子吗?

lf3rwulv

lf3rwulv1#

是这样吗?
是的。这个单独的例子是安全的。这并不意味着,但是,mysqli_真实的_escape_string应该被视为一个函数,其目的是防止SQL注入。因为在这个例子中,它保护你只是出于意外。下面提供的一个愚蠢的例子可以证明:

$id = mysqli_real_escape_string($link, $_POST["id"]);
$sql = 'SELECT * FROM usuarios WHERE id = $id';
$rs = mysqli_query($link,$sql);

在这里,几乎任何SQL都可以添加到$_POST[“id”]并破坏数据库中的havok。
这是一个如何使用mysqli_真实的_escape_string的好例子吗?

一点也不

应该放弃此函数,而在查询中使用参数。此函数将使您无法使用字符串文字以外的任何查询部分。甚至可以简单地忽略。

占位符,也称为参数,必须用来表示查询中的数据:

$sql = 'SELECT * FROM usuarios WHERE username=?';
$stmt = $conn->prepare($sql);
$stmt->bind_param("s", $_POST['usuario']);
$stmt->execute();
$rs = $stmt->get_result();

请参阅我关于correct use of mysqli的文章中的其他示例

  • 如果曾经使用过 *,这个函数必须封装到另一个函数中,它既可以转义也可以添加引号,就像PDO::quote()一样。只有这样才安全。
xcitsw88

xcitsw882#

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

htrmnn0y

htrmnn0y3#

是的,您现在就可以使用它保存。
使用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。

相关问题