可能我在这里错过了一些观点。我总是假设,那个序列
mysqli -> real_escape_string($var);
insert into database
.....
select from database
$var = stripslashes
是用于存储和检索用户的字符串输入的正确选项。我刚刚发现,除了一种情况外,这种方法工作正常 - 它会删除用户输入的所有斜杠。它只在我使用
时才有效$var = str_replace("\\","\\\\",$var);
在real_escape_string之前。假设由于某种原因我不能使用预准备语句,这是完全正确的方法吗?
答案 0 :(得分:0)
这里的答案是以极其自律的方式使用带有占位符值的预备语句。任何和所有用户数据,无论是直接来自表单输入,查询参数,会话数据还是其他数据库记录,都必须被视为可能是敌对的,因此需要转义。在处理数据库时,最可靠的方法是使用占位符值,保持查询和数据之间的严格分离。
例如:
INSERT INTO users (name, shoes) VALUES (?, ?)
这些?
值表示任意用户数据。使用bind_param
,您可以绑定这些:
$stmt->bind_param('si', $_POST['name'], $_POST['shoes']);
分别将其正确编码为字符串和整数。
在显示内容时,您需要注意,对于您正在呈现内容的上下文来说,同样重要的是HTML,JavaScript / JSON或URI,每个都有不同的要求和格式
始终以最中性的格式存储您的数据。永远不要预先转义HTML或任意剥离字符。非破坏性清洁,例如修剪前导和尾随空间,很好,但是不应该阻止任何与理想形式的归一化无关的积极格式。