【发布时间】:2014-03-10 15:51:25
【问题描述】:
我是 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,那么您不应该自己转义值。使用占位符,让数据库为您完成所有工作。但除此之外,是的,您正在“正确”使用它,因为使用不正确/过时的编码方法可以被认为是“正确的”
-
准备好的/参数化的查询是要走的路。我不会认为这是正确的。
-
仅供参考,在没有加密的情况下在数据库中拥有密码与不转义输入一样糟糕。我的意思不是 md5——使用适当的单向加密和盐。
-
请在
mysqli_real_escape_string之前和生成的字符串之后给我一个例子。因为会造成混淆,所以没有给出例子。
标签: php mysqli sql-injection