【问题标题】:PHP (int) on Compound Statements复合语句上的 PHP (int)
【发布时间】:2017-01-30 21:07:34
【问题描述】:

这让我大吃一惊。代码

$strA = '1234';
$strB = '56';
$cast = (int) $strA.$strB;
var_dump($cast);

输出:字符串(6)“123456”

我期待 $cast 是一个整数。如果有人将 $_POST 中的字符串放在一起,此行为可能会导致安全漏洞。代码

$strA = '1234';
$strB = '56-SQL Injection';
$cast = (int) $strA.$strB;

输出:字符串(20)“123456-SQL 注入”

如果 $strB 来自外部源,例如 $_POST;该脚本可能会受到注入攻击。

我一直在阅读difference between (int) and intval() 之类的帖子,试图找出 (int) 的完整行为记录在哪里。

所以我的问题是:我期望 "(int) $strA.$strB" 是一个整数。为什么它仍然是一个字符串,这种行为记录在哪里?

【问题讨论】:

  • 括号! (int) "abc"."def"(int) ("abc"."def") 不同,但与((int) "abc")."def" 相同 - 哦,顺便说一句:为了防止 SQL 注入,请仅使用 参数化语句!
  • 完全正确 - 运算符优先级:php.net/manual/en/language.operators.precedence.php
  • @FranzGleichmann 你绝对可以写出答案)

标签: php int


【解决方案1】:

该行为是由运算符优先级引起的,另见相应的manual page

基本上:

(int) $a.$b;

不一样

(int) ($a.$b); //which is the one you want

但相同

((int) $a).$b;

在您的情况下,将 $a 转换为有效的 int,然后将其隐式转换回字符串以与 $b 连接。
(对于非数字字符串,例如$a="b",这将导致最终字符串"0456"

查看此示例输出:

<?php
$a = "123";
$b = "456";
$c = (int) $a.$b;
$d = (int) ($a.$b);
$e = ((int) $a).$b;
var_dump($c, $d, $e);

字符串“123456”(长度=6)
整数 123456
字符串'123456'(长度=6)

另外:除非您绝对不能,否则请始终使用参数化语句来防止 SQL 注入 - 它们尽可能地接近万无一失。

【讨论】:

  • 谢谢。我承认在问这个问题之前我已经想出了答案。 (int) 的行为类似于运算符。它具有出乎意料的高优先级。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-30
  • 2013-02-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多