【发布时间】: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 你绝对可以写出答案)