jjzjj

PHP/MySQL 形式 : escaping, sanitizer ,散列......我什至从哪里开始?

coder 2023-10-03 原文

我通常在自己查找信息方面非常机智,但是当涉及到这个主题时,它真的令人生畏,那里有大量的东西。我有点信息过载。
我找到了数十篇关于个别安全主题的文章,但我无法了解大局以及它们在实践中是如何结合在一起的。
我需要看到一个鸟瞰路线图。以这个假设的例子为例:

A Simple Hypothetical "Comments" Section:

  • Sign up: create a password/username combo that is to be stored safely in a MySQL table.

  • Log in.

  • Leave a comment.


在这个最基本的案例中遵循的“安全路线图”是什么?
地球上的每个教程和 PHP 书籍都使用 MySQL 扩展,这无济于事,如果我理解正确,这是一个坏主意吗?

最佳答案

答:一般来说……

  • 我在这里假设程序员不是服务器管理员,并且服务器管理员或多或少知道如何在默认情况下正确和安全地配置 LAMP。

    当然,如有必要,程序员可以覆盖自定义 php.ini 中的大多数 PHP 设置。文件位于 Web 根目录中。
  • 使用 MVC 框架。

    我使用 CakePHP。该框架本身在很大程度上确保了从根本上健全和安全的编码实践。

  • B. 传入数据…
  • 清理和验证 $_GET, $_POST, $_COOKIE, 中包含的所有数据和 $_REQUEST在以编程方式操作数据之前。
  • SQL注入(inject)

    定义:利用发生在应用程序数据库层的安全漏洞的代码注入(inject)技术。当用户输入被错误地过滤为嵌入在 SQL 语句中的字符串文字转义字符或用户输入不是强类型并因此意外执行时,就会出现该漏洞。

    预防:使用诸如 mysqli 之类的库进行参数化查询或 PDO .见 OWASP SQL Injection cheat sheet (不推荐使用像 mysql_real_escape_string 这样的字符串转义函数)
  • 跨站脚本 (XSS)

    定义:安全漏洞通常存在于 Web 应用程序中,允许恶意 Web 用户将代码注入(inject)其他用户查看的网页。此类代码的示例包括客户端脚本(即 JavaScript)。

    预防:上下文相关的输出转义和编码。见 OWASP XSS prevention cheat sheet .

  • C. 浏览器请求...
  • 跨站请求伪造 (CSRF)

    定义:恶意利用网站的类型,由此从网站信任的用户传输未经授权的命令。与利用用户对特定站点的信任的跨站点脚本 (XSS) 不同,CSRF 利用站点对用户浏览器的信任。

    预防:生成唯一的“ token ”,通常是在浏览器 session 开始时。全部传递 token POSTGET要求。关注 POST/GET action,检查 session 中是否存在 token ,然后确认POST发送的 token /GET与存储在 session 中的 token 相同。 (像 CakePHP 这样的 MVC 框架使得在整个应用程序中统一实现这一点相对容易。)

  • D. session ……
  • 杀死 session 时销毁 session 数据

    session 完成(“注销”)后,销毁其数据,不要只是清除 cookie(否则恶意用户可能只是重新设置 cookie 并再次使用 session )。取消设置 $_SESSION 中的所有索引通过将它分配给一个空数组。
  • 将 session 存储为 Web 根目录或数据库中的文件

    服务器上保存 session 的默认路径可能会被劫持——尤其是在共享托管环境中。

  • E. 密码…
  • 强制选择强密码
  • 密码中需要数字、符号、大小写字母
  • 密码长度应在 12 到 14 个字符左右
  • 散列和加盐所有密码

    请勿使用 sha1() , md5()hash()散列密码 .它们不是为此而设计的。你会想要使用像 bcrypt 这样的函数或 PBDFK2。有some really good suggestions on this question .您的盐值应该是完全随机的,并存储在数据库中(这不是真正的 secret )。一个额外的 secret 值(通常称为“pepper”)可以存储在您的应用程序中,并在使用 bcrypt 之前添加到密码中,但目前尚不清楚这真正增加了多少安全性。

  • F. 在定制 php.ini位于网络根…
  • 禁用 register_globals

    预防: register_globals = Off
  • 禁用魔术引号

    预防: magic_quotes_gpc = Off
  • 禁用错误报告

    预防: display_errors = Off
  • 启用错误日志记录并将日志文件保存到 Web 根目录上方的目录中

    预防:
    log_errors = On; 
    ignore_repeated_errors = On; 
    html_errors = Off; 
    error_log = /path/above/webroot/logs/php_error_log
    
  • 将 session 数据存储在 Web 根目录上方的目录中

    预防: session.save_path = /path/above/webroot/sessions

  • G. 在 .htaccess文件位于 web 根目录...
  • 在站点范围内禁用目录列表

    预防: Options -Indexes

  • H. 贵重/敏感文件……
  • 通过将此类文件存储在 Web 根目录之上来防止未经授权的访问/下载

    这包括站点管理/仅限成员(member)部分和站点/数据库配置文件!!
  • 使用中间脚本内联或作为附件提供文件
  • 保持您的脚本(WordPress、PHPMyAdmin 等)更新。
  • 仅在您使用 PHPMyAdmin 时才允许访问它。这可以防止人们在您的安装中使用零日漏洞。

  • 一、上传文件...
  • 验证存储在 $_FILES 中的文件名在将其用于任何类型的数据操作之前
  • 请注意,提供的 mime 类型可能被欺骗或以其他方式错误
  • 将所有用户上传的文件移动到 web 根目录之上!!!
  • 不要使用 include()
  • 执行/提供上传的文件
  • 尽量不要提供内容类型为“application/octet-stream”、“application/unknown”或“plain/text”的文件

  • J. 杂项…
  • 开发人员在开发站点/应用程序期间创建和使用的 Web 根目录中的所有“实用程序”文件/程序,这些文件/程序不打算或不需要被 future 的站点用户访问,或者以其他方式构成某种安全风险,应该当网站上线时被删除。

    例如,这包括 phpinfo.php文件(打印 phpinfo() 结果的文件)、数据库实用程序脚本等
  • 关于PHP/MySQL 形式 : escaping, sanitizer ,散列......我什至从哪里开始?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12257386/

    有关PHP/MySQL 形式 : escaping, sanitizer ,散列......我什至从哪里开始?的更多相关文章

    1. ruby - 将散列转换为嵌套散列 - 2

      这道题是thisquestion的逆题.给定一个散列,每个键都有一个数组,例如{[:a,:b,:c]=>1,[:a,:b,:d]=>2,[:a,:e]=>3,[:f]=>4,}将其转换为嵌套哈希的最佳方法是什么{:a=>{:b=>{:c=>1,:d=>2},:e=>3,},:f=>4,} 最佳答案 这是一个迭代的解决方案,递归的解决方案留给读者作为练习:defconvert(h={})ret={}h.eachdo|k,v|node=retk[0..-2].each{|x|node[x]||={};node=node[x]}node[

    2. ruby - 检查字符串是否包含散列中的任何键并返回它包含的键的值 - 2

      我有一个包含多个键的散列和一个字符串,该字符串不包含散列中的任何键或包含一个键。h={"k1"=>"v1","k2"=>"v2","k3"=>"v3"}s="thisisanexamplestringthatmightoccurwithakeysomewhereinthestringk1(withspecialcharacterslike(^&*$#@!^&&*))"检查s是否包含h中的任何键的最佳方法是什么,如果包含,则返回它包含的键的值?例如,对于上面的h和s的例子,输出应该是v1。编辑:只有字符串是用户定义的。哈希将始终相同。 最佳答案

    3. ruby - 按值降序排列散列,然后按升序键入 ruby - 2

      我有这样的哈希trial_hash={"key1"=>1000,"key2"=>34,"key3"=>500,"key4"=>500,"key5"=>500,"key6"=>500}我按值降序排列:my_hash=trial_hash.sort_by{|k,v|v}.reverse我现在是这样理解的:[["key1",1000],["key4",500],["key5",500],["key6",500],["key3",500],["key2",34]]但我希望当值相同时按键的升序排序。我该怎么做?例如:上面的散列将以这种方式排序:[["key1",1000],["key3",500

    4. ruby-on-rails - 使用回形针的嵌套形式 - 2

      我有一个名为posts的模型,它有很多附件。附件模型使用回形针。我制作了一个用于创建附件的独立模型,效果很好,这是此处说明的View(https://github.com/thoughtbot/paperclip):@attachment,:html=>{:multipart=>true}do|form|%>posts中的嵌套表单如下所示:prohibitedthispostfrombeingsaved:@attachment,:html=>{:multipart=>true}do|at_form|%>附件记录已创建,但它是空的。文件未上传。同时,帖子已成功创建...有什么想法吗?

    5. ruby-on-rails - 使用 ruby​​ 将多个实例变量转换为散列的更好方法? - 2

      我收到格式为的回复#我需要将其转换为哈希值(针对活跃商家)。目前我正在遍历变量并执行此操作:response.instance_variables.eachdo|r|my_hash.merge!(r.to_s.delete("@").intern=>response.instance_eval(r.to_s.delete("@")))end这有效,它将生成{:first="charlie",:last=>"kelly"},但它似乎有点hacky和不稳定。有更好的方法吗?编辑:我刚刚意识到我可以使用instance_variable_get作为该等式的第二部分,但这仍然是主要问题。

    6. 使用canal同步MySQL数据到ES - 2

      文章目录一、概述简介原理模块二、配置Mysql使用版本环境要求1.操作系统2.mysql要求三、配置canal-server离线下载在线下载上传解压修改配置单机配置集群配置分库分表配置1.修改全局配置2.实例配置垂直分库水平分库3.修改group-instance.xml4.启动监听四、配置canal-adapter1修改启动配置2配置映射文件3启动ES数据同步查询所有订阅同步数据同步开关启动4.验证五、配置canal-admin一、概述简介canal是Alibaba旗下的一款开源项目,Java开发。基于数据库增量日志解析,提供增量数据订阅&消费。Git地址:https://github.co

    7. Observability:从零开始创建 Java 微服务并监控它 (二) - 2

      这篇文章是继上一篇文章“Observability:从零开始创建Java微服务并监控它(一)”的续篇。在上一篇文章中,我们讲述了如何创建一个Javaweb应用,并使用Filebeat来收集应用所生成的日志。在今天的文章中,我来详述如何收集应用的指标,使用APM来监控应用并监督web服务的在线情况。源码可以在地址 https://github.com/liu-xiao-guo/java_observability 进行下载。摄入指标指标被视为可以随时更改的时间点值。当前请求的数量可以改变任何毫秒。你可能有1000个请求的峰值,然后一切都回到一个请求。这也意味着这些指标可能不准确,你还想提取最小/

    8. ruby - 如何根据长度将路径数组转换为嵌套数组或散列 - 2

      我需要根据字符串路径的长度将字符串路径数组转换为符号、哈希和数组的数组给定以下数组:array=["info","services","about/company","about/history/part1","about/history/part2"]我想生成以下输出,对不同级别进行分组,根据级别的结构混合使用符号和对象。产生以下输出:[:info,:services,about:[:company,history:[:part1,:part2]]]#altsyntax[:info,:services,{:about=>[:company,{:history=>[:part1,:pa

    9. Ruby:如何使用带有散列的 'send' 方法调用方法? - 2

      假设我有一个类A,里面有一些方法。假设stringmethodName是这些方法之一,我已经知道我想给它什么参数。它们在散列中{'param1'=>value1,'param2'=>value2}所以我有:params={'param1'=>value1,'param2'=>value2}a=A.new()a.send(methodName,value1,value2)#callmethodnamewithbothparams我希望能够通过传递我的哈希以某种方式调用该方法。这可能吗? 最佳答案 确保methodName是一个符号,而

    10. ruby-on-rails - 无法安装 mysql2 0.3.14 gem - 2

      我看到其他人也遇到过类似的问题,但没有一个解决方案对我有用。0.3.14gem与其他gem文件一起存在。我已经完全按照此处指示完成了所有操作:https://github.com/brianmario/mysql2.我仍然得到以下信息。我不知道为什么安装程序指示它找不到include目录,因为我已经检查过它存在。thread.h文件存在,但不在ruby​​目录中。相反,它在这里:C:\RailsInstaller\DevKit\lib\perl5\5.8\msys\CORE\我正在运行Windows7并尝试在Aptana3中构建我的Rails项目。我的Ruby是1.9.3。$gemin

    随机推荐