我是 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 的好例子吗?
它是否正确?
是的。这个精心挑选的孤立示例是安全的。这并不意味着但是,mysqli_real_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"] 中并破坏数据库。
这是如何使用 mysqli_real_escape_string 的好例子吗?
一点也不
应放弃此功能,转而使用参数在查询中。除了字符串文字之外,此函数将使您无法处理任何查询部分。甚至可以简单地忽略。
A 占位符也称为参数,必须使用它来表示查询中的数据:
$sql = 'SELECT * FROM usuarios WHERE username=?';
$stmt = $conn->prepare($sql);
$stmt->bind_param("s", $_POST['usuario']);
$stmt->execute();
$rs = $stmt->get_result();
请参阅我的文章中的其他示例mysqli的正确使用 https://phpdelusions.net/mysqli
如果曾经使用过,这个函数必须封装到另一个既进行转义又添加引号的函数中,就像PDO::quote()
做。只有这样,才会安全。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)