我知道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()吗?
答案 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 01
和Situation 02
的描述不足以回答这些具体问题。它可能是yes
。