服务器端&最终用户Web应用程序安全性和验证方法

时间:2011-01-21 23:53:12

标签: php security .htaccess server-side

我想知道如果可能的话,每个人都使用什么安全方法来保证银行等级的Web应用程序。

据我所知,这是我所知道的方法/技术。

Front - End-user Section
-------------------------
SSL (128 bit encryption)
htaccess (protection against bots and using mod-rewrite to hide parameter calls)
input field cleaning
session cleaning before use
PDO access to mysql ( although oracle is better yet expensive)
not being on a shared hosting account.
using a cisco based firewall (not very familiar with these)
restricting what can be uploaded (if the site requires an upload)
blocking off directory index access with htaccess
not storing credit card information locally
encrypting user passwords with sha1 or encryption with salt 
(never could figure these out)

not using hidden input fields
turn off global variables
turn off error displays
using another file extension displayed to the user rather than php , aspx, etc.
blocking ping/requests for server/apache information and version.


backend access
-------------------
not having its access being something like /admin (if you know what i mean)
"all of the above listed for end-user"
verifying if the user who logs in exists as an admin 

而不是使用mysql_real_escape_string或htmlentities来清理输入字段 然后有filter_input(),它不起作用。它有点混乱清洁。 所以你们推荐什么?我知道你们中的一些人可能会认为这可能有点过多,但是如果你们正在研究一个网络应用程序,这个应用程序会被超过50k的用户点击,而这些用户将会发生基于电子商务的交易。你会怎么做?

感谢

ps:这就是我在htaccess中所拥有的,以防止非友好机器人和限制访问重要文件。

#=============================================================================#
#          Deny access to hidden files
#=============================================================================#
<FilesMatch "\.(htaccess|log|sh)$">
 Order Allow,Deny
 Deny from all
</FilesMatch>

#=============================================================================#
#          Deny access to evil bots / security
#=============================================================================#

RewriteBase /
RewriteCond %{HTTP_USER_AGENT} ^JetCar.* [NC]
RewriteCond %{HTTP_USER_AGENT} ^FlashGet.* [NC,OR]
RewriteCond %{HTTP_USER_AGENT} ^Teleport.* [NC,OR]
RewriteCond %{HTTP_USER_AGENT} ^NetAnts.* [NC,OR]
RewriteCond %{HTTP_USER_AGENT} ^WebZIP.* [NC,OR]
RewriteCond %{HTTP_USER_AGENT} ^Offline.* [NC,OR]
RewriteCond %{HTTP_USER_AGENT} ^GetRight.* [NC,OR]
RewriteCond %{HTTP_USER_AGENT} ^Go!Zilla.* [NC,OR]
RewriteCond %{HTTP_USER_AGENT} ^GoZilla.* [NC,OR]
RewriteCond %{HTTP_USER_AGENT} ^WebReaper.* [NC,OR]
RewriteCond %{HTTP_USER_AGENT} ^ia_archiver.* [NC,OR]
RewriteCond %{HTTP_USER_AGENT} ^wget.* [NC,OR]
RewriteCond %{HTTP_USER_AGENT} ^HTTrack.* [NC,OR]
RewriteCond %{HTTP_USER_AGENT} ^WebStripper.* [NC,OR]
RewriteCond %{HTTP_USER_AGENT} ^WebCapture.* [NC,OR]
RewriteCond %{HTTP_USER_AGENT} ^Scooter-W3.* [NC,OR]
RewriteCond %{HTTP_USER_AGENT} ^WebCopier.* [NC,OR]
RewriteCond %{HTTP_USER_AGENT} ^FlashGe.* [NC,OR]
RewriteCond %{HTTP_USER_AGENT} ^Webdupe.* [NC,OR]
RewriteCond %{HTTP_USER_AGENT} ^NetAnts.* [NC,OR]
RewriteCond %{HTTP_USER_AGENT} ^Pockey.* [NC,OR]
RewriteCond %{HTTP_USER_AGENT} ^DiscoPump.* [NC,OR]
RewriteCond %{HTTP_USER_AGENT} ^InternetNinja.* [NC,OR]
RewriteCond %{HTTP_USER_AGENT} ^BlackWidow [OR]
RewriteCond %{HTTP_USER_AGENT} ^Bot\ mailto:craftbot@yahoo.com [OR]
RewriteCond %{HTTP_USER_AGENT} ^ChinaClaw [OR]
RewriteCond %{HTTP_USER_AGENT} ^Custo [OR]
RewriteCond %{HTTP_USER_AGENT} ^DISCo [OR]
RewriteCond %{HTTP_USER_AGENT} ^Download\ Demon [OR]
RewriteCond %{HTTP_USER_AGENT} ^eCatch [OR]
RewriteCond %{HTTP_USER_AGENT} ^EirGrabber [OR]
RewriteCond %{HTTP_USER_AGENT} ^EmailSiphon [OR]
RewriteCond %{HTTP_USER_AGENT} ^EmailWolf [OR]
RewriteCond %{HTTP_USER_AGENT} ^Express\ WebPictures [OR]
RewriteCond %{HTTP_USER_AGENT} ^ExtractorPro [OR]
RewriteCond %{HTTP_USER_AGENT} ^EyeNetIE [OR]
RewriteCond %{HTTP_USER_AGENT} ^FlashGet [OR]
RewriteCond %{HTTP_USER_AGENT} ^GetRight [OR]
RewriteCond %{HTTP_USER_AGENT} ^GetWeb! [OR]
RewriteCond %{HTTP_USER_AGENT} ^Go!Zilla [OR]
RewriteCond %{HTTP_USER_AGENT} ^Go-Ahead-Got-It [OR]
RewriteCond %{HTTP_USER_AGENT} ^GrabNet [OR]
RewriteCond %{HTTP_USER_AGENT} ^Grafula [OR]
RewriteCond %{HTTP_USER_AGENT} ^HMView [OR]
RewriteCond %{HTTP_USER_AGENT} ^HTTrack [NC,OR]
RewriteCond %{HTTP_USER_AGENT} ^Image\ Stripper [OR]
RewriteCond %{HTTP_USER_AGENT} ^Image\ Sucker [OR]
RewriteCond %{HTTP_USER_AGENT} ^Indy\ Library [NC,OR]
RewriteCond %{HTTP_USER_AGENT} ^InterGET [OR]
RewriteCond %{HTTP_USER_AGENT} ^Internet\ Ninja [OR]
RewriteCond %{HTTP_USER_AGENT} ^JetCar [OR]
RewriteCond %{HTTP_USER_AGENT} ^JOC\ Web\ Spider [OR]
RewriteCond %{HTTP_USER_AGENT} ^larbin [OR]
RewriteCond %{HTTP_USER_AGENT} ^LeechFTP [OR]
RewriteCond %{HTTP_USER_AGENT} ^Mass\ Downloader [OR]
RewriteCond %{HTTP_USER_AGENT} ^MIDown\ tool [OR]
RewriteCond %{HTTP_USER_AGENT} ^Mister\ PiX [OR]
RewriteCond %{HTTP_USER_AGENT} ^Navroad [OR]
RewriteCond %{HTTP_USER_AGENT} ^NearSite [OR]
RewriteCond %{HTTP_USER_AGENT} ^NetAnts [OR]
RewriteCond %{HTTP_USER_AGENT} ^NetSpider [OR]
RewriteCond %{HTTP_USER_AGENT} ^Net\ Vampire [OR]
RewriteCond %{HTTP_USER_AGENT} ^NetZIP [OR]
RewriteCond %{HTTP_USER_AGENT} ^Octopus [OR]
RewriteCond %{HTTP_USER_AGENT} ^Offline\ Explorer [OR]
RewriteCond %{HTTP_USER_AGENT} ^Offline\ Navigator [OR]
RewriteCond %{HTTP_USER_AGENT} ^PageGrabber [OR]
RewriteCond %{HTTP_USER_AGENT} ^Papa\ Foto [OR]
RewriteCond %{HTTP_USER_AGENT} ^pavuk [OR]
RewriteCond %{HTTP_USER_AGENT} ^pcBrowser [OR]
RewriteCond %{HTTP_USER_AGENT} ^RealDownload [OR]
RewriteCond %{HTTP_USER_AGENT} ^ReGet [OR]
RewriteCond %{HTTP_USER_AGENT} ^SiteSnagger [OR]
RewriteCond %{HTTP_USER_AGENT} ^SmartDownload [OR]
RewriteCond %{HTTP_USER_AGENT} ^SuperBot [OR]
RewriteCond %{HTTP_USER_AGENT} ^SuperHTTP [OR]
RewriteCond %{HTTP_USER_AGENT} ^Surfbot [OR]
RewriteCond %{HTTP_USER_AGENT} ^tAkeOut [OR]
RewriteCond %{HTTP_USER_AGENT} ^Teleport\ Pro [OR]
RewriteCond %{HTTP_USER_AGENT} ^VoidEYE [OR]
RewriteCond %{HTTP_USER_AGENT} ^Web\ Image\ Collector [OR]
RewriteCond %{HTTP_USER_AGENT} ^Web\ Sucker [OR]
RewriteCond %{HTTP_USER_AGENT} ^WebAuto [OR]
RewriteCond %{HTTP_USER_AGENT} ^WebCopier [OR]
RewriteCond %{HTTP_USER_AGENT} ^WebFetch [OR]
RewriteCond %{HTTP_USER_AGENT} ^WebGo\ IS [OR]
RewriteCond %{HTTP_USER_AGENT} ^WebLeacher [OR]
RewriteCond %{HTTP_USER_AGENT} ^WebReaper [OR]
RewriteCond %{HTTP_USER_AGENT} ^WebSauger [OR]
RewriteCond %{HTTP_USER_AGENT} ^Website\ eXtractor [OR]
RewriteCond %{HTTP_USER_AGENT} ^Website\ Quester [OR]
RewriteCond %{HTTP_USER_AGENT} ^WebStripper [OR]
RewriteCond %{HTTP_USER_AGENT} ^WebWhacker [OR]
RewriteCond %{HTTP_USER_AGENT} ^WebZIP [OR]
RewriteCond %{HTTP_USER_AGENT} ^Wget [OR]
RewriteCond %{HTTP_USER_AGENT} ^Widow [OR]
RewriteCond %{HTTP_USER_AGENT} ^WWWOFFLE [OR]
RewriteCond %{HTTP_USER_AGENT} ^Xaldon\ WebSpider [OR]
RewriteCond %{HTTP_USER_AGENT} ^GoZilla.* [NC,OR]
RewriteCond %{HTTP_USER_AGENT} ^WebCapture.* [NC,OR]
RewriteCond %{HTTP_USER_AGENT} ^Webdupe.* [NC,OR]
RewriteCond %{HTTP_USER_AGENT} ^Pockey.* [NC,OR]
RewriteCond %{HTTP_USER_AGENT} ^DiscoPump.* [NC,OR]
RewriteCond %{HTTP_USER_AGENT} ^InternetSeer.com.* [NC,OR]
RewriteCond %{HTTP_REFERER} ^http://www.hostitcheap.com/* [OR]
RewriteCond %{HTTP_REFERER} ^http://www.bravespider.com/* [OR]
RewriteCond %{HTTP_REFERER} ^http://www.bigweblist.com/* [OR]
RewriteCond %{HTTP_REFERER} ^http://www.weblinkvalidator.com/* [OR]
RewriteCond %{HTTP_REFERER} ^http://traffixer.com* [OR]
RewriteCond %{HTTP_REFERER} ^http://www.youradultpaysite.com/* [OR]
RewriteCond %{HTTP_REFERER} ^http://www.paysiteprofits.com/* [OR]
RewriteCond %{HTTP_REFERER} ^http://www.hotlivewebcams.com/* [OR]
RewriteCond %{HTTP_REFERER} ^http://www.paysiteprofits.com/* [OR]
RewriteCond %{REQUEST_URI} FormMail.*
RewriteCond %{HTTP_REFERER} ^www.addresses.com/* [OR]
RewriteCond %{HTTP_REFERER} ^http://www.business-socket.com/* [OR]
RewriteCond %{HTTP_REFERER} ^www.datashaping.com/* [OR]
RewriteCond %{HTTP_REFERER} ^http://cheapweb.biz/* [OR]
RewriteCond %{HTTP_REFERER} ^http://traffixer.com* [OR]
RewriteCond %{HTTP_REFERER} ^http://www.hostitcheap.com/* [OR]
RewriteCond %{HTTP_REFERER} ^http://www.weblinkvalidator.com/* [OR]
RewriteCond %{REQUEST_URI} FormMail.*
RewriteRule .* - [F,L]

3 个答案:

答案 0 :(得分:1)

浏览每个脚本并真正使用良好的输入卫生设施。如果数据应该是数字,那么请确保它只接受数字等。这是发现大多数中层错误的地方。

您的htaccess中没有要阻止的文件的模式。而是阻止所有内容,只允许使用您知道将要使用的特定文件集。

使用数据库的特殊设计用户运行应用程序(甚至应用程序的不同部分),访问受限。如果应用程序的一部分只显示表中的信息,那么它用于连接数据库的db用户应该只能看到该特定的表,并且应该只能读取该数据库,而不能修改它。将所有奇怪的数据库权限错误报告给特殊文件并定期检查。

在eval()周围要非常小心,不要只是运行来自脚本外部的任何内容,最好不要使用eval()。

小心地为服务器运行的用户设置权限。它应该只能写入它需要的diretories,并且永远不允许执行这些目录中的文件。

最重要的是,永远不要开始认为您的应用程序是安全的。没有什么是安全的。新的bug甚至类型的bug都会随时出现,请留意它们。例如,您可以订阅一些安全公告,并检查出来的新漏洞和漏洞,然后尝试思考是否可以在应用程序的某些部分使用相同类型的漏洞。

答案 1 :(得分:0)

  

使用另一个文件扩展名显示   对用户而不是php,aspx,   等

     

阻止ping /请求   服务器/ apache信息和版本。

使用Apache AddHandler在.html(或任何其他文件扩展名)下运行php可能会让业余的脚本混乱变得有趣,但任何知道他们正在做什么的人都不应该很难找出你的服务器模型重新审视各种其他的捅和刺激......

  

使用sha1或加密用户密码   用盐加密(永远不可能   想出这些)

使用密码哈希很容易。您编写了一个运行密码的脚本,以及通过加密方法(如sha1)因用户而异的“密钥”,并且此哈希存储在数据库中。当用户登录时,他们提供的密码将通过相同的脚本运行,并比较哈希值。 “密钥”的目的是即使2个用户具有相同的密码,由于密钥不同,它们的哈希值仍然不同。然而,不是存储散列键,我发现最好使用一个更复杂的脚本,它将用户名和密码与多个加密混合在一起,如下所示:

$hash = sha1(substr(sha1($password), 0, strlen($_POST['password'])).substr(sha1($loginUsername), 0, (40-strlen($_POST['password']))));

加密密码,加密用户名,使用密码的字符串长度来确定如何连接2个哈希的子串,然后再次加密整个字符串。这可能看起来有点过分,但即使他们知道用户名和相关的哈希,也没有任何人会破解它。

  

不存储信用卡信息   本地

实际上我相信法律规定你不能存储信用卡号码,只能存储最后4位数字和信用卡号码。我从来没有处理过信用卡交易,但这是我在电子商务课上教的,我花了几个学期回来。

对于输入卫生,当我需要超出mysql_real_escape_string的东西时,我通常根据预期输入来编写我自己的正则表达式验证脚本...

答案 2 :(得分:0)

要添加到这个漂亮的大清单中的一些内容:

  • 从PHP中删除版本公开信息(非常详细): expose_php关闭
  

而不是使用mysql_real_escape_string或htmlentities来清理输入字段,然后有filter_input(),它不起作用。它有点混乱清洁。所以你们推荐什么

那么规则就是不要过滤一次并使用它。规则是根据您需要时的输出类型进行过滤。

  • 当输出是数据库时,数据库的escape / filter(mysql_real_escape等)
  • 输出为HTML(htmlspecialchars)的HTML转义时
  • 当输出为CSV(分隔符,回车等)的CSV转义时
  • 当输出为PDF(等等,......)的PDF转义时

您还应该针对不同类型的输入采用不同的策略来保护自己。将整数转换为整数,过滤白色值列表,限制字符串的长度。

  • 过滤条目(删除有害的东西 下一步)
  • 验证条目
  • 输出条目(在数据库中或在HTML中等)

在大型系统上很难确保始终完成此操作,因此请尽早构建自己的对象,以确保安全步骤始终完成。不要让应用程序的任何 functionnal 部分直接使用用户条目($ _GET,$ _POST,$ _COOKIE,$ _SERVER)。并且不要让它们直接输出 final 输出(数据库,HTML等)。

关于that and on Hugarian Apps: making Wrong Code Look Wrong的真实好读。本周第二次我链接了这个页面,但这真是一个了不起的读物:-)

然后,对于大型应用程序,我会建议使用 2数据库(编辑: 抱歉@Cray我没见过你刚才说过)访问,一个只读和一个读写。仅在需要时使用读写访问(事务等),您将获得更好的可伸缩性应用程序,并且只需一个想法即可获得更安全的应用程序: - )。

修改 其他一些事情:

  • 会话给你一个身份,这个 是不够的,你需要添加 ACL ,访问控制。你必须对每个请求执行acl检查, 将它设置在低级别,即尝试 在任何之前执行此检查 应用缓存发生。尝试设置 您的申请中的网址政策 这将有助于您使用此ACL 政策。并且不要忘记其中的AJAX调用。
  • Url基础安全性仍然很难 maitain,如果允许用户 伪造自定义GET请求和搜索 数据他并不完全完整 允许看?有时使用隐藏或GET令牌进行验证 服务器端的会话数据可以 防止这种手动搜索。
  • 您可能需要考虑行级别 数据库中的安全性(如 Oracle中的虚拟专用数据库)。 使用像PostgreSQL这样的现代数据库 你可以用一些来模仿它 触发/规则和会话 变量