Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/security/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
多少安全就足够了PHP_Php_Security_Pdo - Fatal编程技术网

多少安全就足够了PHP

多少安全就足够了PHP,php,security,pdo,Php,Security,Pdo,我目前正在从事我开始的个人业务的第2版。在第一个版本中,我遇到了用户sql注入和使用xss的问题 现在事情变得有点严重(活动量越来越大),我花时间尽可能多地学习卫生知识、准备好的报表等,以提高项目的安全性。我知道没有100%的修复/安全系统可以实现,我相信我实现的足以保证足够的安全性,我只是想知道是否还有更多我可以做的 我使用PDO准备的语句进行所有数据库交互 数据库交互不再需要删除功能(用户在v1上删除了表) 我使用PHP5.5密码\u散列作为密码 所有输入和输出都经过消毒(通读下面关于主题代

我目前正在从事我开始的个人业务的第2版。在第一个版本中,我遇到了用户sql注入和使用xss的问题

现在事情变得有点严重(活动量越来越大),我花时间尽可能多地学习卫生知识、准备好的报表等,以提高项目的安全性。我知道没有100%的修复/安全系统可以实现,我相信我实现的足以保证足够的安全性,我只是想知道是否还有更多我可以做的

我使用PDO准备的语句进行所有数据库交互

数据库交互不再需要删除功能(用户在v1上删除了表)

我使用PHP5.5密码\u散列作为密码

所有输入和输出都经过消毒(通读下面关于主题代码的各种意见)

//输入
函数输入($input){
$input=修剪($input);
$search=array(
'@]*?>.@si',//去掉javascript
“@@si”,//去掉HTML标记
“@]*?>.*?@siU”,//条形样式标记正确
'@@'//带多行注释
);
如果(获取\u魔术\u引号\u gpc()){
$input=条带斜杠($input);
}
返回preg_replace($search,,$input);
}
//卫生设施
函数htmlInput($input){
$input=修剪($input);
返回条带标签($input,);
}
//输出卫生
函数输出($input){
返回htmlspecialchars($input);
}
//网址卫生
函数url($input){
$input=修剪($input);
$input=带标签($input);
$input=preg_replace('/[^A-Za-z0-9-]+/','-',$input);
$input=preg\u replace(“/[\/\&%\$]/”、“\\”、$input);
$input=preg\u replace(“/[\”\']/”,“,$input);
$output=strtolower($input);
返回$output;
} 
由于尺寸的原因,我还没有决定使用htmlpurifier。我希望在不牺牲安全性的情况下尽可能地保持轻量级

网站的一个特定部分示例:票务系统 用户需要能够通过ckeditor创建格式化文本(允许的标记) 我一直有消毒文本的问题,同时保留允许的标签,因此,如果有人有一个解决方案,我希望听到它

除此之外,我还创建了各种检查,应该是数字的输入通过是数字的,登录表单受到暴力尝试的保护,我们将使用ssl进行登录、注册等。(一旦管理员决定这样做,就会记录和阻止违规ip),图像不能作为php等执行,我还添加了许多其他东西试图保护网站。在我们重新启动之前,我只想确保我没有忽略任何东西


如果有人能从中受益,我将不胜感激。我一直在四处寻找,我相信我已经涵盖了我所看到的一切。无论如何,提前感谢您的帮助。

您可以简单地使用PEAR验证包验证任何类型的输入。这比使用简单的函数要可靠得多验证输入

正如您所提到的,安全性从来没有100%得到保证,但SSL使其能够阻止会话劫持。由于您有一个票证系统,因此最好使用SSL。如果您担心网站的速度,您可以在https协议上运行您的登录部分


祝你好运

你的观点已经是最重要的,此外,你还可以这样做:

  • 对整个站点使用HTTPS,这避免了许多问题,另请参见SSL strip
  • X-Frame-Options添加到登录页面的HTTP标题中,以便该页面不能显示在iframe中。这有助于防止点击劫持。在PHP中,这类似于:
    标题('X-Frame-Options:DENY');
  • 内容安全策略添加到登录页面的HTTP头中。如果浏览器支持CSP,这可以有效地防止跨站点脚本编写。在PHP中,它如下所示:
    头(“内容安全策略:默认src'self';脚本src'self';”;
  • 删除内联JavaScript并将其放在外部*.js文件中。这使CSP更加有效
  • 在登录页面上重新生成会话id,使会话固定更加困难
  • 如果您的站点仅为HTTPS,则可以添加HTTP严格传输安全性标题。HST可以防止用户(已经访问过您的站点一次)调用不安全的HTTP页面。这有助于防止SSL剥离

  • 当然,还有很多事情可以做,例如,我会单独验证(测试输入是否如预期的那样)和转义(尽可能晚地只针对给定的输出类型)。对输入进行清理有点可疑,无论它是否有效,我都会拒绝它。

    在表单中使用令牌/nonce以防止CSRF?我已经通过SSL会话在每种表单中实现了这一点;使用包含令牌链接的限时电子邮件重置密码您无法了解所有需要了解的内容关于安全性的问题和评论。您也无法验证您所有具有安全意识的修改或方法是否都得到了正确实施。安全性本质上是基于时间、成本和风险的,现在您听起来像是受到了风险的约束(您缺乏真正的能力,尽管是暂时的)。如果你有钱,请雇佣一位经验丰富的开发人员来审查你的网站代码。这是你应该拥有的安全性(根据风险大小,考虑到时间限制,你可以负担得起的安全性)。如果您仅在HTTPS中运行登录部分,则在您切换回HTTPS后,有人可以获取您的登录会话ID。我指的是您网站的控制面板
        // 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;
        }