【问题标题】:Mysql: Is this safe enought to not use prepared statements?Mysql:不使用准备好的语句是否足够安全?
【发布时间】:2023-03-07 00:50:01
【问题描述】:

我知道,您应该始终使用准备好的语句...,这就是我所做的,但是!它们速度较慢,如果有一些 100% 安全的输入,我想我无法使用它们。

(PHP)

if ( ctype_digit($_POST['id']) ){

 $int_id = (int)$_POST['id'];

  if ( is_int($int_id) ){

   $query = "SELECT id FROM ids WHERE id = {$int_id}";

  }

}

【问题讨论】:

  • ctype_digit 并转换为 int 就足够了。 ctype_digitis_int 都没有使用意义。只有当给定字符串中的所有字符都是数字时,第一个才是真的
  • 但增加了额外的虚假安全性,以支持我不使用准备好的语句的决定。
  • 支持多么愚蠢的决定。
  • 无法使用它们。但最好尽可能使用它们。开销(如果有的话)可以忽略不计,这是最佳实践。如果您绝对不想 使用它们,那么只有少数情况是相当安全的。 恕我直言 其中一个正在转换为 int,另一个正在使用字符串的白名单。但同样:准备好的语句是最好的和最干净的方式。 (另外:每当对 PDO 有疑问时,请听 @YourCommonSense ;))

标签: php mysql sql-injection


【解决方案1】:

说到这个特别愚蠢的例子,虽然是多余的,但在技术上是安全的。

但您必须了解,我们的代码并不总是仅限于这样的意大利面条式代码示例。

  • 首先,在设计合理的应用程序中,数据库交互与输入验证是分开的。并且数据库层只是不知道发送的变量是否“安全”。因此,将每个变量都视为“不安全”并统一对待所有变量要简单得多。
  • 其次,想象一下不只是一个愚蠢的变量,而是十几个变量。你的代码会变成多长时间?
  • 如果您计划混合使用不同的方法(prepared 和 non-prepared),它仍然没有意义 - 它会无缘无故地使您的代码过于复杂。为什么不一直使用统一的解决方案?

此外,您的前提是完全错误的。准备好的语句并不慢。

【讨论】:

  • 每当我完成测试时,prepared statements 一直比较慢,我想在这里使用的查询现在测试慢了 100%,我不知道为什么会这样,但理论上他们必须除非您运行多行,否则始终变慢,事实并非如此。
  • 然后,首先在我设计不当的应用程序中,数据库交互在代码内部,其次真实案例和示例一样愚蠢,只有一个积分器,我对任何 POST/GET 输入使用准备好的语句,但是对于这种情况,只有这个,一个积分器,我想不要。然后我的应用程序已经准备好和未准备好混合在一起,因为在我所有的测试准备中,一行执行总是较慢,所以对于“内部”安全查询,我不使用它们。
  • 因此,您不是在寻找正确的做法,而是在寻找保持不良做法的借口。不要自吹自擂,你永远也得不到。
  • 我追求的是效率,因为这个特定的查询效率是关键,你们中的一些人可能不使用高流量的应用程序,它的好处与效率有很高的关系,但这里更高效的是更多的钱,这是最常用的查询之一。所以我的观点是,重要的事情是客户满意度、利益和安全性,然后程序员必须把自己扔进泥里,最大化我提到的那些关键。那么查询是否更快=是,(+钱,更快地向用户传递数据),它是否安全?显然是的,这就是我要问的。
  • 你说的这个“效率”不过是一种错觉。您永远不会注意到任何改进,使您的一些查询没有准备好。查看您的问题记录,我注意到您一直在为不良做法寻找借口。事实上,沿着这条路走,你最终会得到效率极低的应用程序,这将在它达到高流量水平时显示出来。
猜你喜欢
  • 2016-07-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-09
  • 2011-09-16
  • 2010-11-21
  • 2012-08-12
相关资源
最近更新 更多