Hi!请登陆

PHP天坑总结

2020-10-31 59 10/31

PHP天坑总结

PHP天坑你懂得,不断总结中。。。

语言结构

语言结构不是函数,你可以把它理解为和 ifwhile等价。由于少了一层解析,所以速度更快!

技巧:

isset() vs strlen() - a fast/clear string length calculation

注意:

参数中不能再有运算,错误的用法 echo(1 + 2)

echo()
print()
die()
isset()
unset()
include() //注意,include_once()是函数
require() //注意,require_once()是函数
array()
list()
empty()

empty

官方文档empty

如果 var 是非空或非零的值,则 empty() 返回 FALSE。换句话说,""、0、"0"、NULL、FALSE、array()、var $var; 以及没有任何属性的对象都将被认为是空的,如果 var 为空,则返回 TRUE。
除了当变量没有置值时不产生警告之外,empty() 是 (boolean) var 的反义词。参见转换为布尔值获取更多信息。

也就是说,下面的东西被empty返回真

"" (an empty string)
0 (0 as an integer)
0.0 (0 as a float)
"0" (0 as a string)
NULL
FALSE
array() (an empty array)
var $var; (a variable declared, but without a value in a class)

所以,如果你需要的变量非'空',之前如果你这样写

if(isset($_POST['passwd'] && $_POST['passwd'])){
...
}
// 可以替换为
if(!empty($_POST['passwd'])){
...
}

特别注意

5.4.0起,检查字符的非数字偏移量将会返回 TRUE。

$expected_array_got_string = 'some string';
//5.3全FALSE
var_dump(empty($expected_array_got_string['some_key']));  //5.4 TRUE
var_dump(empty($expected_array_got_string[0]));  //FALSE
var_dump(empty($expected_array_got_string['0']));  //特殊 FALSE
var_dump(empty($expected_array_got_string[0.5]));  //FALSE
var_dump(empty($expected_array_got_string['0.5']));  //5.4 TRUE
var_dump(empty($expected_array_got_string['0 Mostel']));  //5.4 TRUE

isset

官方文档isset

检测变量是否设置,并且不是 NULL,可以接多个变量。

$foo = NULL;
var_dump(isset($foo));   // FALSE

5.4.0起,检查字符的非数字偏移量将会返回 FALSE,结果与empty相反。

$expected_array_got_string = 'some string';
//5.3全TRUE
var_dump(isset($expected_array_got_string['some_key']));
var_dump(isset($expected_array_got_string[0]));
var_dump(isset($expected_array_got_string['0']));
var_dump(isset($expected_array_got_string[0.5]));
var_dump(isset($expected_array_got_string['0.5']));
var_dump(isset($expected_array_got_string['0 Mostel']));

安全检查

有些教程告诉你用户输入的变量需要过滤,以POST为例

$_POST = array_map('trim', $_POST)

但是你有没有考虑过这个表单?

<form method="POST" action="" accept-charset="utf-8">
<p>
  <label>first_field</label><br />
  <input type="text" id="first_field" name="field[1][points]" /><br />
  <input type="radio" value="inside" name="field[1][group]" checked /><br />
  <input type="radio" value="outside" name="field[1][group]"><br />
</p>
<p>
  <label>second_field</label><br />
  <input type="text" id="second_field" name="field[2][points]" /><br />
  <input type="radio" value="inside" name="field[2][group]" checked /><br />
  <input type="radio" value="outside" name="field[2][group]"><br />
</p>
</form>

正确的姿势需要你慢慢体会,OZABC在此给一些参考,围绕着关键词 php sanitize

What's the best method for sanitizing user input with PHP?
Which is the best way to sanitize user input in PHP?

并且学一些黑人的技术,比如XSS、CSRF

== 比较运算符

这个就更精彩了,不过存在即合理,建议多看看手册 - 比较运算符

Tag:

相关推荐