手机版

谈PHP安全

时间:2021-10-09 来源:互联网 编辑:宝哥软件园 浏览:

1.apache服务器安全设置1。像无名小卒一样奔跑。通常,Apache是由Root安装和运行的。如果Apache Server进程拥有Root权限,会对系统的安全性造成很大的威胁,所以要保证Apache Server进程以尽可能低的权限用户运行。通过修改httpd.conf文件中的以下选项,Apache可以作为None运行以实现相对安全性。用户无人组# -1 2。ServerRoot目录的权限为了确保所有的配置都是适当的和安全的,需要严格控制Apache主目录的访问权限,这样非超级用户就不能修改这个目录的内容。Apache的主目录对应Apache服务器配置文件httpd.conf的服务器根控制项,应该是:服务器根/usr/local/apache 3,SSI配置。在配置文件access.conf或httpd.conf中的选项指令处添加Includes NO EXEC选项,以禁用Apache Server中的执行功能。避免用户在Apache服务器中直接执行执行器,导致服务器系统的开放性。选项包括Noexec 4。防止用户修改系统设置。在Apache服务器的配置文件中进行以下设置,以防止用户创建和修改。htaccess文件和超过可定义的系统安全功能。不允许所有选项不允许所有选项,然后适当配置特定目录。5.更改Apache服务器的默认访问特征。Apache的默认设置只能保证一定程度的安全性。如果服务器可以通过正常的映射规则找到该文件,那么客户端将获得该文件。例如,http://本地主机/~ root/将允许用户访问整个文件系统。将以下内容添加到服务器文件:订单拒绝,从所有拒绝将禁止对文件系统的默认访问。6.CGI脚本安全注意事项CGI脚本是一系列可以通过Web服务器运行的程序。为了保证系统的安全性,CGI的作者应该是可信的。对于CGI,最好限制在特定的目录,比如cgi-bin,便于管理;此外,CGI目录中的文件应保证不写,以避免一些欺骗性程序驻留或混合在其中。如果能给用户提供一个安全性好的CGI程序模块作为参考,可能会减少很多不必要的麻烦和安全隐患。删除CGI目录下非业务应用的所有脚本,防止异常信息泄露。7.SSL链接加密这些常用的措施可以给Apache Server一个基本的安全运行环境,显然还需要在具体实现中进一步细化和分解,从而制定出符合实际应用的安全配置方案。第二,PHP安全设置服务器无法防范所有安全问题,比如程序漏洞、用户输入表单、PHP文件权限等。还有一些方法可以迷惑黑客或者别有用心的人。1.程序代码的脆弱性许多PHP程序的主要弱点不是PHP语言本身,而是程序员的安全意识低。因此,我们必须时刻关注每一段代码中可能存在的问题,找出提交不正确数据时可能产生的影响。复制代码如下:PHP unlink($邪恶_ var);fwrite ($fp,$邪恶_ var);系统($邪恶_ var);exec($邪恶_ var);始终注意您的代码,以确保从客户端提交的每个变量都经过了正确的检查,然后问自己以下问题:这个脚本只能影响预期的文件吗?异常数据提交后能否生效?这个脚本可以用于计划外的目的吗?这个剧本可以和其他剧本结合做坏事吗?所有交易都有完整记录吗?写代码的时候问自己这些问题,否则以后可能要重写代码来增加安全性。如果我们注意这些问题,可能不能完全保证系统的安全性,但至少可以提高安全性。您也可以考虑关闭register_globals、magic_quotes或其他使编程更方便但会混淆变量的合法性、来源和值的设置。

2.用户输入表单的问题验证了用户输入的任何数据,保证了PHP代码的安全性。注意:JS的创建只是为了提高访问用户的体验,而不是验证工具。因为任何访问用户都可能或无意中禁用客户端脚本的执行,从而跳过这一层验证。因此,我们必须在PHP的服务器端程序上检查这些数据。注意:不要使用超级变量$ _ SERVER[' HTTP _ REFER ']来检查数据的源地址。一个非常小的新手黑客会使用工具伪造这个变量的数据,并尽可能使用M5或rand函数生成一个令牌。验证源时,请验证令牌是否匹配。3.PHP文件权限问题PHP是为了在用户级访问文件系统而设计的,所以完全可以通过编写一个PHP代码来读取/etc/passwd等系统文件,改变网络连接,发送大量打印任务。因此,您必须确保PHP代码读写适当的文件。请参见以下代码。用户想要删除其主目录中的文件。假设文件系统是通过web界面管理的,因此Apache用户有权删除用户目录中的文件。复制代码如下:PHP $ username=$ _ POST[' user _ submit _ name '];$ homedir='/home/$ username ';$ file _ to _ delete=' $ userfile解除链接(' $ homedir/$ user file ');echo '$file_to_delete已被删除!';因为用户名变量可以通过用户表单提交,所以您可以提交其他人的用户名和文件名并删除该文件。在这种情况下,我们应该考虑其他身份验证方法:只给PHP web用户非常有限的权限。检查所有提交的变量。以下是对文件名和变量更安全的验证和检查:复制代码如下:PHP $ username=$ _ SERVER[' REMOTE _ USER '];$ homedir='/home/$ username ';if(!ereg('^[^./][^/]*$',$userfile))死('错误的文件名');if(!ereg('^[^./][^/]*$',$username))死('错误的username ');4.隐藏PHP扩展一般来说,通过隐藏手段提高安全性被认为收效甚微。但是在某些情况下,增加尽可能多的安全性是值得的。一些简单的方法可以帮助隐藏PHP,这会让攻击者更难发现系统弱点。在php.ini文件中设置expose_php=off可以减少他们可以获得的有用信息。另一个策略是让web服务器解析PHP中的不同扩展。要么通过。htaccess文件或Apache配置文件,可以设置可能误导攻击者的文件扩展名:#让php看起来像其他编程语言AddType application/x-httpd-php . ASP . py . pl #让PHP看起来像未知的文件类型AddType application/X-httpd-PHP。bop。foo .133t #使php代码看起来像HTML页面addtypeapplication/x-httpd-PHP . htm . HTML要使此方法生效,必须将PHP文件的扩展名更改为上述扩展名。因此,通过隐藏提高了安全性,尽管防御能力较低并且存在一些缺点。3.Mysql数据库安全设置PHP本身无法保护数据库的安全。下一章只讲述如何使用PHP脚本访问和操作数据库。记住一个简单的原则:纵深防御。保护数据库的措施越多,攻击者获取和使用数据库中的信息就越困难。正确设计和应用数据库可以减少被攻击的恐惧。1.数据库设计问题应用程序不应使用数据库所有者或超级用户帐户来连接数据库,因为这些帐户可以执行任意操作,例如修改数据库结构(例如,删除表)或清空整个数据库。下面截图的用户设置很危险。

应该为程序的每个方面创建不同的数据库帐户,并且应该给数据库对象非常有限的权限。只分配完成其功能所需的权限,以免同一用户完成另一用户的工作。这样,即使攻击者通过利用程序的漏洞获得对数据库的访问权限,也最多只能达到与程序相同的影响范围。2.数据库连接问题基于SSL加密技术的连接可以增加客户端和服务器之间通信的安全性,或者SSH也可以用来加密客户端和数据库之间的连接。如果使用这些技术,攻击者很难监控服务器的通信或获取数据库的信息。3.数据库数据的加密SSL/SSH可以保护客户端和服务器之间交换的数据,但是SSL/SSH不能保护数据库中现有的数据。SSL只是一个加密网络数据流的协议。如果攻击者获得直接访问数据库的权限(绕过web服务器),敏感数据可能会被暴露或滥用,除非数据库本身保护信息。对数据库中的数据进行加密是降低此类风险的有效方法,但只有少数数据库提供这些加密功能。这个问题有一个简单的解决方案,就是创建自己的加密机制,然后在PHP程序中使用。最常见的例子是在数据库中存储用MD5加密的密码哈希,而不是原始的明文密码。复制代码如下:PHP $ query=sprint f(' INSERT INTO user(name,pwd) VALUES('%s ',' % s ');',addslashes($username),MD5($ password));$result=pg_query($connection,$ query);$ query=sprint f(' SELECT 1 FROM users WHERE name=' % s ' AND pwd=' % s ';',addslashes($username),MD5($ password));$result=pg_query($connection,$ query);if(pg _ num _ rows($ result)0){ echo ' Welcome,$username!';} else { echo :“$ username”的身份验证失败;} ?4.SQL注入问题直接SQL命令注入是攻击者常用的一种技术,用于创建或修改现有的SQL语句,从而获取隐藏数据、覆盖键值,甚至执行数据库主机操作系统的命令。这是通过应用程序获取用户输入并将其与静态参数相结合以形成SQL查询来实现的。下面将给出一些真实的例子。复制代码如下:php $query='SELECT id,name,inserted,size FROM products WHERE size=' $ size ' ORDER BY $ ORDER LIMIT $ LIMIT,$ offset';$result=odbc_exec($conn,$ query);您可以在原始查询中添加另一个SELECT查询来获取密码:union SELECT“1”,concat (uname | |'-'| | passwd)作为名称,usertable中的“1971-01-01”、“0”;如果将上述语句(使用' and-)添加到$query中的任何变量中,将会很麻烦。这些攻击总是基于发现安全意识薄弱的代码。因此,永远不要相信外部输入的数据,尤其是来自客户端的数据,包括选择框、表单的隐藏字段和cookie。与上面的第一个示例一样,即使是正常的查询也会导致灾难。切勿使用超级用户或所有者帐户连接到数据库。使用权限受到严格限制的帐户。检查输入数据是否具有预期的数据格式。PHP可以使用很多函数来检查输入,从简单的变量函数和字符类型函数(如is_numeric()、ctype_digit())到复杂的与Perl兼容的正则表达式函数。如果程序正在等待输入一个数字,可以考虑使用is_numeric()进行检查,或者直接使用settype()转换其类型,或者使用sprintf()将其格式化为数字。防止SQL注入的更安全的寻呼显示方法:复制代码如下:php settype($offset,' integer ');$query='SELECT id,name FROM products ORDER BY name LIMIT 20 OFFSET $ OFFSET;$query=sprintf('SELECT id,name FROM products ORDER BY name LIMIT 20 OFFSET % d;$ offset);

版权声明:谈PHP安全是由宝哥软件园云端程序自动收集整理而来。如果本文侵犯了你的权益,请联系本站底部QQ或者邮箱删除。