【发布时间】:2014-01-29 00:04:48
【问题描述】:
我学会了以下清理数据的方法
function sanitize($data)
{
return mysql_real_escape_string( $data);
}
那么,对于不了解 mysql 的初学者来说,弃用 mysql 中的某些扩展变得有点令人沮丧,但是正确了解 PHP 是一种学习体验。建议使用 mysqli_real_escape_string 代替,因为这个函数需要 2 个参数,所以我有以下
function sanitize($data){
// 1. Create a database connection
$db = new mysqli('localhost','root','somepass','secured_login');
if($db->connect_errno){
$connect_error = 'Sorry, we are experiencing connection problems.';
die ($connect_error);
}
return htmlentities(strip_tags(mysqli_real_escape_string($db, $data)));
}
但是,我感觉很多 PHP 程序员强烈推荐使用 PDO 方法来代替
对于这么长的介绍,我深表歉意,我的问题是......使用修改后的函数 sanitize 是否安全,其中使用 mysqli_real_escape_string 代替 mysql_real_escape_string?
如果没有!然后通过使用 PDO,我需要学习 OOP PHP 而不是程序。我希望我正确地提出了这个问题。正在混合两种编程方向(过程和 OOP)不受欢迎。
长期使用 PDO 的真正优势是什么?谢谢!
【问题讨论】:
-
不要!如果您使用 MySQLi,请使用准备好的语句/绑定变量
-
马克,所以我需要忽略使用函数 sanitize 并在使用 mysqli 时使用准备好的语句,我做对了吗
-
您的
sanitize()函数将重复实例化新的数据库对象。您最好将数据库对象作为参数传递,如$result = sanitize($db, $data)或类似的东西。混合 OOP 和过程方法是不明智的。它可能有效,但如果代码需要维护,它会让你或像你这样的人感到困惑。 -
您在addition到
mysql_real_escape_string中使用htmlentities和strip_tags的非常事实意味着重要概念不理解。这些功能服务于不同的目的,添加额外的功能不会使任何东西“更安全”。最好的方法是使用占位符,但如果做不到这一点,请在 SQL 字符串中使用之前直接在数据上使用mysqli_real_escape_string。 (htmlentites应该在 输出 HTML 时使用,而不是在这里;stripslashes有一些情况,但不是在这里或与 HTML 一起使用。) -
@user3001162 你should use placeholders 忘记这个可怕的
sanitize方法。 (但是,是的,这是我的一个错字 - 避免使用不推荐使用的方法。)