我目前正在处理我开始的个人业务的第二版。在第一个版本中,我遇到了用户sql注入和使用xss的问题。
现在事情变得有点严重了(大量的活动),我花时间尽可能多地学习卫生,准备声明等,以增加我的项目的安全性。我知道没有100%的修复/安全系统来实现,我相信我实现了足够的保证足够的安全性,我只是想知道是否有更多的我能做的。
我使用PDO准备语句的所有数据库交互。
数据库交互将不再需要delete函数(用户在v1上删除表)
我使用PHP 5.5 password_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等,还有各种其他的东西,我添加了尝试保护网站。在我们重新开始之前,我只是想确保我没有忽略任何事情。
如果任何人有任何资源,我可以从中受益,我将非常感激。我四处看了看,我相信我所看到的一切都涵盖了。无论如何,提前感谢你的帮助。
你的观点已经是最重要的,另外你可以这样做:
- 整个站点使用HTTPS,这避免了很多问题,参见SSL-strip。
- 将X-Frame-Options添加到登录页面的HTTP头中,这样页面就不能在iframe中显示。这有助于防止点击劫持。在PHP中是这样的:
header('X-Frame-Options: DENY');
. - 将Content-Security-Policy添加到登录页面的HTTP头中。如果浏览器支持CSP,这可以有效地防止跨站点脚本。在PHP中是这样的:
header("Content-Security-Policy: default-src 'self'; script-src 'self';");
. - 删除内联JavaScript并将其放置到外部*.js文件中。这使得CSP更有效。
- 在登录页面重新生成会话id,使会话固定更加困难。
- 如果你的网站只有HTTPS,那么你可以添加HTTP严格传输安全头。HSTS可以防止用户(已经访问过您的站点一次)调用不安全的HTTP页面。
当然还有很多事情可以做,例如,我将分开验证(测试输入是否符合预期)和转义(尽可能晚,仅针对给定的输出类型)。对输入进行消毒有点可疑,不管它是否有效,然后我将拒绝它。
可以简单地使用PEAR验证包来验证任何类型的输入。这比使用简单的函数来验证输入要可靠得多。
正如你提到的,安全性从来没有100%保证,但SSL有能力阻止会话劫持。因为您有一个票据系统,所以最好使用SSL。如果你关心你的网站的速度,你可以在https协议上运行你的登录部分
好运