TL; DR
我正在使用PHP表单直接输出到PHP文件。我意识到这是一个很大的安全风险。请告诉我如何从用户的输入中过滤掉任何标记,并将PHP文件的操作限制在自己的目录中(以便最大限度地减少损坏)妥协)。
详情
我有一个页面,我可以使用PHP表单收集客户的反馈,然后将结果输出到我的团队成员可以阅读的另一个PHP页面。
<?php
if($_POST['CUSTFEEDBACK']) {
$addition = '<div class="FDBKbox">' . $_POST['CUSTFEEDBACK'] . '</div>';
$file_open = fopen("FDBKCOLLECTION.PHP", "a+");
fwrite($file_open, $addition);
fclose($file_open);
}
?>
<form action="<?=$PHP_SELF?>" method="POST">
<textarea name="CUSTFEEDBACK" style="width:100%;max-height:250px;">
</textarea>
<br>
<input type="submit" name="button" value="Submit Feedback">
</form>
然后我发现有权访问这两个页面的人也可以放入恶意代码,只需添加PHP代码就可以从我的服务器打开和重写其他文件,或者使用我的表单执行XSS代码。
从那时起,我已将表单操作更改为<form action="<?=$PHP_SELF?>" method="POST">
以阻止XSS代码。但是,其他方法对我来说仍然存在很大的风险。
目前,我正在使用Javascript替换任何&lt;或者&gt;在textarea有空间。我还在页面顶部放置了一个整页div,其脚本为其提供了“display:none”属性,以便在禁用Javascript时页面将无法使用。但是,我很快发现使用旧的浏览器(IE 8及以下版本),浏览器只是忽略了脚本来替换标签。使用Javascript进行网站安全可能是一个糟糕的主意,但我现在必须使用它。
$(document).on('change',':text,textarea', function () {
if (this.value.match(/[<>]/g)) {
this.value = this.value.replace(/[<>]/g, '');
}
});
我做了一些谷歌搜索,并找到了一些方法,如“逃避”标签,或使用PHP来清理表格。但是,我对PHP仍然相对较新,而且这些听起来都非常令人生畏(而且我不知道将这些代码放在哪里)。
请告诉我如何从表单输入中删除任何类型的标记(我对textarea中的任何标记都不感兴趣)。
作为故障保护,如何将PHP文件的操作限制在其自己的目录中。这是为了在发生不幸事件的情况下,可以最大限度地减少损害,并保护我的所有其他文件。
如果有人能给我一些指示,那将非常感激!
附带问题,我目前正在使用codeacademy.com学习PHP吗?有没有人建议其他好网站学习PHP?
答案 0 :(得分:2)
没有银弹解决方案。你需要混合搭配。一些可能有帮助的要点:
建议使用open_basedir这会限制可以使用的文件 PHP访问指定的目录树
您可能不想使用strip_tags,因为它会删除所有PHP标记,并且无法覆盖此行为。你可能最好重新标记标签 - 唯一需要注意的是你不要随之删除PHP打开/关闭标签。
编辑:正如您的评论所指出的,如果您要创建一个单一的PHP文件,那么您可以使用strip_tags然后将PHP标记添加到开头和结尾。
php -l <filename>
并检查输出以查看是否存在语法错误
Trivia:在版本5.0.1到5.0.5之间,PHP有一个名为php_check_syntax
的函数,您可以使用它来检查另一个PHP文件的语法。 最后根本不推荐在生产中的任何地方都有这样的系统。对于测试/学术/研究等,它的罚款。在生产中 - 不太好。