我目前正在处理我开始的个人业务的第2版。在第一个版本中,我遇到了用户sql注入和使用xss的问题。
现在事情变得有点严重(活动量更大)我花时间尽可能多地学习卫生,准备好的陈述等,以提高项目的安全性。我知道没有100%的修复/安全系统可以实现,我相信我的实施足以保证足够的安全性,我只是想知道我能做多少。
我正在为所有数据库交互使用PDO Prepared语句。
数据库交互将不再需要删除功能(用户在v1上删除了表)
我使用PHP 5.5密码_hash作为密码
对所有输入和输出进行消毒(通过以下主题代码的各种意见阅读)
// Input Sanitation
function input($input) {
$input = trim($input);
$search = array(
'@<script[^>]*?>.*?</script>@si', // Strip out javascript
'@<[\/\!]*?[^<>]*?>@si', // Strip out HTML tags
'@<style[^>]*?>.*?</style>@siU', // Strip style tags properly
'@<![\s\S]*?--[ \t\n\r]*>@' // Strip multi-line comments
);
if (get_magic_quotes_gpc()) {
$input = stripslashes($input);
}
return preg_replace($search, '', $input);
}
// Html Sanitation
function htmlInput($input) {
$input = trim($input);
return strip_tags($input, '<p><b><i>');
}
// Output Sanitation
function output($input) {
return htmlspecialchars($input);
}
// Url Sanitation
function url($input){
$input = trim($input);
$input = strip_tags($input);
$input = preg_replace('/[^A-Za-z0-9-]+/', '-', $input);
$input = preg_replace("/[\/\&%#\$]/", "_", $input);
$input = preg_replace("/[\"\']/", " ", $input);
$output = strtolower($input);
return $output;
}
由于尺寸的原因,我还没决定使用htmlpurifier。我希望在不牺牲安全性的前提下尽可能保持轻量级。
网站示例的某些部分:故障单系统 用户需要能够通过ckeditor创建格式化文本(允许标签
) 我一直有问题清理文本,同时保留允许的标签,所以如果有人有解决方案,我会喜欢听到它。
除此之外,我已经创建了各种检查,输入应该是数字通过is_numeric,登录表单受到保护免受强力尝试,我们将使用ssl进行登录,注册等。(罪犯ip被记录并被阻止一次管理员决定这样做),图像不能作为PHP等执行,并且我添加了各种其他东西来尝试保护网站。在我们重新启动之前,我只是想确保我没有忽视任何事情。
如果有人有任何我可以从中受益的资源,我会非常感激。我一直在环顾四周,我相信我已经涵盖了我所看到的一切。无论如何,请事先感谢你的帮助。
答案 0 :(得分:1)
您的观点已经是最重要的观点,另外您可以这样做:
header('X-Frame-Options: DENY');
。header("Content-Security-Policy: default-src 'self'; script-src 'self';");
。当然还有更多可以做的事情,例如我会单独验证(测试输入是否符合预期)和转义(尽可能晚地仅针对给定的输出类型)。消毒输入有点可疑,无论是否有效,然后我会拒绝它。
答案 1 :(得分:0)
您可以简单地使用PEAR验证包来验证任何类型的输入。这比使用简单函数验证输入更可靠。
正如您所提到的,安全性绝不是100%保证,但SSL使得能够停止会话劫持。由于您有票务系统,因此最好使用SSL。如果您关注网站的速度,您可以在https协议上运行您的登录部分
祝你好运