我什么时候应该使用PHP mysqli_real_escape_string()函数?

时间:2016-03-22 03:25:29

标签: php mysqli sql-injection

我知道mysqli_real_escape_string函数可用于防止SQL注入。 (但是,mysql_real_escape_string()不会保护您免受某些注射)

我的问题是我什么时候应该使用mysqli_real_escape_string()函数?

情况01

我有一个名为“名字,姓氏,电子邮件,密码”字样的4个字段的注册表。

我是否应该使用mysqli_real_escape_string()来插入查询?所有四个领域?

或者以登录形式使用是否足够?

情况02

我有一个个人资料页面,例如 profile.php?user_name = damith

我在此页面的许多功能中使用了 $ _ GET [' user_name']

我应该在所有这些函数中使用mysqli_real_escape_string()吗?

2 个答案:

答案 0 :(得分:3)

mysqli_real_escape_string()不再是确保您在数据库中保存的数据安全的最佳方法。相反,您应该使用预准备语句:http://php.net/manual/en/mysqli.quickstart.prepared-statements.php

关于您的问题:无论何时,当您将不确定的数据(特别是如果数据来自Web表单等未知来源)放入您的数据库时,您应确保为数据库正确格式化它。 mysqli_real_escape_string()只能对字符串文字执行此操作,这就是为什么预处理语句是更好的方法。无论何时执行依赖于用户提交数据的查询,都应该使用预准备语句。

当您输出要显示给用户的数据时,您不需要使用mysqli_real_escape_string(),而应该使用htmlspecialchars()http://php.net/htmlspecialchars

情况1 - 肯定是肯定的,甚至更好的是使用准备好的陈述。

情况2 - 如果要在网页上向用户显示数据,则不需要使用mysqli_real_escape_string(),而应使用htmlspecialchars()来降低XSS和其他代码注入攻击的风险

一些例子:

<?php 
// Prepared statement.  Save the user's first name to the database:
$stmt = $mysqli->prepare("INSERT INTO users(first_name) VALUES (?)");
$stmt->bind_param("s", $first_name);
$stmt->execute();

// Echo the user's first name back to them
echo "Saved your first name: " . 
      htmlspecialchars($first_name) . " to the database.";

有关阻止SQL注入的更多信息,请参阅以下优秀答案:How can I prevent SQL injection in PHP?

答案 1 :(得分:2)

您应该在任何参数上使用real_escape_string,将其作为string literal混合到sql语句中。并且仅限于那些字符串文字值。

因此Situation 01Situation 02的描述不足以回答这些具体问题。它可能是yes