Security 您何时信任数据/变量

Security 您何时信任数据/变量,security,validation,Security,Validation,我们都知道,所有用户数据、GET/POST/Cookie等都需要进行安全性验证 但当它转换成局部变量后,什么时候停止 乙二醇 对我来说,这太过分了。 但是如果你从数据库中加载值 我希望我说得有道理:)你想得太多了 验证所有需要验证的内容(即,所有用户输入),一旦进入代码路径,就要在同一服务器会话中用户无法对其进行修改的时间点进行验证 什么时候开始并不重要。只要保持一致,并尽一切努力保持代码的可读性和可维护性。关键是程序的外部(用户)输入不可信,需要在使用前进行验证。输入是否来自web表单、配置文

我们都知道,所有用户数据、GET/POST/Cookie等都需要进行安全性验证

但当它转换成局部变量后,什么时候停止

乙二醇

对我来说,这太过分了。 但是如果你从数据库中加载值


我希望我说得有道理:)

你想得太多了

验证所有需要验证的内容(即,所有用户输入),一旦进入代码路径,就要在同一服务器会话中用户无法对其进行修改的时间点进行验证


什么时候开始并不重要。只要保持一致,并尽一切努力保持代码的可读性和可维护性。

关键是程序的外部(用户)输入不可信,需要在使用前进行验证。输入是否来自web表单、配置文件或用户可访问的数据库并不重要。代码的用户总是可以恶意或意外地提供垃圾值。但是一旦进行了验证,就没有必要重新验证这些值——您必须信任自己的组件


由您的代码单独控制的数据库可以被视为受信任系统的另一个组件。这种数据库中的值不需要验证,除非您有理由相信它们可能由于外部环境而损坏。例如,您可能希望验证通过网络传输的值。

超级全局变量,如$\u-GET、$\u-POST、$\u-COOKIE或$\u-SERVER不能在脚本期间由用户更改。一旦你的脚本加载完毕。因此,当它们出现时,您只需要验证它们一次。多次这样做没有任何意义,而且会浪费CPU时间。

要回答您的问题,千万不要相信$\u GET和$\u POST
。但是,在使用变量之前,它不是一个漏洞。如果将其打印出来
print($\u GET[xss])
,则存在xss漏洞。如果将此变量插入数据库,然后将其打印出来(如论坛帖子),则存储的xss会更糟糕


你需要更好地理解攻击者的心态。像$\u GET这样的变量是污点的来源,像
print()
mysql\u query()
这样的函数调用是接收器。一名黑客正在寻找他可以用受污染的变量影响的汇。php中有很多水槽,我建议阅读(或红纸,不管它是什么,不是白色…)。请务必阅读“语言与程序员”一节

“什么时候真的不重要”,只要数据在你做了之后不会发生变异…@格雷厄姆·李:这是一个很好的观点,我应该说得更清楚。
if (isValidxxx($_GET['foo']) == false) {
  throw InvalidArgumentException('Please enter a valid foo!');
}

$foo = $_GET['foo'];
fooProcessor($foo);

function fooProcessor($foo) {
  if (isValidxxx($foo) == false) {
    throw Invalid......
  }
//other stuff
}