如何使用PHP和MySQLi正确地转义和恢复字符串

时间:2018-02-12 16:28:57

标签: php mysqli escaping

可能我在这里错过了一些观点。我总是假设,那个序列

mysqli -> real_escape_string($var);
insert into database
.....
select from database
$var = stripslashes

是用于存储和检索用户的字符串输入的正确选项。我刚刚发现,除了一种情况外,这种方法工作正常 - 它会删除用户输入的所有斜杠。它只在我使用

时才有效
$var = str_replace("\\","\\\\",$var);

在real_escape_string之前。假设由于某种原因我不能使用预准备语句,这是完全正确的方法吗?

1 个答案:

答案 0 :(得分:0)

这里的答案是以极其自律的方式使用带有占位符值的预备语句。任何和所有用户数据,无论是直接来自表单输入,查询参数,会话数据还是其他数据库记录,都必须被视为可能是敌对的,因此需要转义。在处理数据库时,最可靠的方法是使用占位符值,保持查询和数据之间的严格分离。

例如:

INSERT INTO users (name, shoes) VALUES (?, ?)

这些?值表示任意用户数据。使用bind_param,您可以绑定这些:

$stmt->bind_param('si', $_POST['name'], $_POST['shoes']);

分别将其正确编码为字符串和整数。

在显示内容时,您需要注意,对于您正在呈现内容的上下文来说,同样重要的是HTML,JavaScript / JSON或URI,每个都有不同的要求和格式

始终以最中性的格式存储您的数据。永远不要预先转义HTML或任意剥离字符。非破坏性清洁,例如修剪前导和尾随空间,很好,但是不应该阻止任何与理想形式的归一化无关的积极格式。