当参数字符集为 utf-8 时,在 php 中使用 addslashes 是否安全?

Is it safe using addslashes in php when parameter charset is utf-8?

我读过很多 post 谈论 addslashes 对于 SQL 注入是不安全的, 但它们都引用了使用 GBK 编码的相同示例。 所以我的问题是: 当参数字符集为 utf-8 时,使用 addslashes() 来防止 php 中的 SQL 注入是否安全?

实际上,一题两题。所以最好分开发声。

对于问题

Is it safe using addslashes() if charset is utf8?

答案是肯定的,它是安全的。
单独来看,如果您的字符集是 utf8.

,则 addslashes 可以生成一个安全序列用于 SQL 字符串文字

然而,作为一种保护措施,如通常使用的那样,旨在“处理所有输入数据以使其安全”,它被证明是致命的不安全。问题

Is it safe using addslashes() to prevent SQL injection

使其成为唯一的答案:

不行!

仅仅是因为这个诚实的功能与防止任何注入无关。从来没有。

您必须了解的是,主要威胁 并非来自半神话的 GBK 漏洞,而是完全来自 对该功能的滥用. 因为它并不是为了保护您免受注射。保护的话题比简单的字符串转义要复杂得多。

问题是有一个lot of rules to keep in mind。而且还有很多可能失败的点。

由于这些原因,简单的字符串转义不能被视为包罗万象的保护规则。

从这个角度来看,参数化查询虽然没有提供 100% 的保护,但无论如何都可以被认为是一种更好的措施,消除了三种最危险的威胁:

  • 因为数字也被覆盖了,无法通过数字字面量注入
  • 由于完整的格式,错误转义的标识符不是漏洞而是开发阶段错误。
  • 由于自动格式化,消除了人为错误

以上这三个原因我认为足以改变你的做法。

此外,正确实施的参数化查询可使您的代码更加简洁。将基于 addslashes 的代码片段提供给我,我将向您展示如何将其缩短 3-5 倍并使其更清晰。