【问题标题】:Ways I can protect my site excluding XSS and Sql injection?除了 XSS 和 Sql 注入之外,我可以保护我的网站的方法吗?
【发布时间】:2010-06-02 15:57:52
【问题描述】:


因此,我网站的成员可以发布主题、回复、cmets、编辑它们等等。我总是将htmlspecialcharsaddslashes 用于html 输入,以保护我的网站免受XSS 和SQL 注入攻击。够了还是我还想念什么?
谢谢。

【问题讨论】:

  • +1 非常重要的问题,太糟糕了,我是唯一一个试图回答它的人。大多数人对 xss 和 sqli 的想法感到困惑和不知所措,他们没有完全意识到有多少可能会出现可怕的错误。
  • 你可以停止使用 PHP,哈哈。使用 Python/Django 或 Ruby/Rails。它们的保护会自动打开。你不必在意。
  • htmlspecialchars 和 addlashes 绝对不会保护您免受 sql 注入或 xss 的影响。

标签: php mysql security xss sql-injection


【解决方案1】:

Web 应用程序可能会出现很多问题。除了 XSS 和 SQLi,还有:

  1. CSRF - 跨站请求伪造
  2. LFI/RFI - 由include()require()...引起的本地文件包含/远程文件包含...
  3. mail() 中的 CRLF 注入
  4. 全局变量命名空间平衡通常由register_globals,extract(),import_request_variables()引起
  5. 目录遍历:fopen()file_get_contents()file_put_conents()
  6. 远程代码执行与eval()preg_replace()/e
  7. 使用passthru()exec()system() 和``进行远程代码执行

Broken Authentication and Session Management 存在一系列漏洞,这是每个网络应用程序员必须阅读的OWASP Top 10 的一部分。

A Study In Scarlet 是一个很好的黑皮书,涵盖了我列出的许多漏洞。

不过,Wordpress 中也有类似这样的奇怪漏洞。关于什么是漏洞的权威权威是 CWE system,它对 HUNDREDS 漏洞进行了分类,其中许多漏洞会影响 Web 应用程序。

【讨论】:

  • +1 是一个很好的列表和对 OP 问题的直接回答,尽管论文本身有点过时(从 2001 年开始,只讨论 PHP 4)。
  • @Justin Ethier 你说得对,纸张有点旧,但是很多“接收器功能”仍然存在问题。我也很喜欢关于“语言与程序员”的部分。它也有示例易受攻击的代码来支持我的列表,所以我仍然认为它是相关的。
  • 到目前为止最好的答案。可能你是优秀的黑客,哈哈。谢谢。
【解决方案2】:

您应该使用准备好的语句(请参阅PDO)来防止 SQL 注入。输出内容时 htmlspecialchars() 似乎足以防止 XSS。

还可以查看这些链接,了解保护您网站的更多方法:

http://phpsec.org/projects/guide/

http://cwe.mitre.org/top25/#Listing

http://www.owasp.org/index.php/Top_10_2010-Main

【讨论】:

【解决方案3】:

防止 SQL 注入的更好方法是使用专门为每个数据库编写的 escape 函数 - 例如,对于 PostGreSQL,使用 pg_escape_string 在将字符串字段插入数据库之前对其进行转义。或者在你的情况下,使用mysql_real_escape_string

【讨论】:

  • 即使我使用addslashes,黑客也可以使用 SQL 注入攻击我的网站?还不够吗?
  • @Tom 在文档中明确指出您应该使用数据库特定的转义符:php.net/manual/en/function.addslashes.php
  • 我明白了。但是,当使用 addslashes 函数还不够时,你能举个例子吗?
  • 快速谷歌显示:shiflett.org/blog/2006/jan/… 我不明白您为什么不使用为此目的创建并由 php 文档推荐的转义函数
  • baloo:我能想到的拒绝从addlashes() 切换的最好原因是,如果他的代码库中的几十个或几百个地方已经有了addlashes。这里有一个教训:总是使用some 类型的数据库抽象层,即使它只是少数手写的通用包装函数。不要在你的代码中到处散布直接与数据库相关的函数调用。
【解决方案4】:

对于 SQL,您应该使用 mysql_real_escape_string(),而不是添加斜杠。 (假设您使用的是 MySQL)

【讨论】:

  • 即使这也不是灵丹妙药。 sqli 仍然可以在不由单引号分隔的值中使用。验证数据是否符合预期模式并使用绑定的 sql 参数来保证注入安全并忘记字符串转义函数。
  • 是的,这只是整体安全性中的许多事情之一。始终从安全角度设计代码,不要等到以后
【解决方案5】:

将数据插入数据库时​​,使用准备好的语句。 PDO 优于 mysql_real_espace_string。

在显示数据时,例如 cmets、posts,使用 htmlentities。

【讨论】:

  • PDO和ADODB在连接mysql时使用mysql_real_espace_string()。
【解决方案6】:

SQL 注入:

  1. 没有添加斜杠和 mysql_real_escape_string 可以单独提供帮助。但仅在根据某些规则使用时。即便如此,这还不够。所以,这就是为什么准备好的陈述对新手来说更好——它不需要思考。

  2. 转义和准备好的语句都可以帮助仅处理数据。对于运算符/标识符,有不同的规则。 (不过没什么大不了的 - 每个可能的组合都必须在脚本中进行硬编码)

XSS:

不允许用户使用 HTML。
为了防止这种情况,strip_tags()(没有允许的标签)或htmlspecialchars()都可以使用。
如果您想允许一些标记,请考虑使用 BB 代码。

CSRF:

任何重要的表单都必须包含一个唯一的令牌,该令牌应该与一个保存在会话中的令牌进行比较。

【讨论】:

猜你喜欢
  • 2012-10-24
  • 2015-06-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-08
  • 2020-07-22
  • 1970-01-01
  • 2022-06-28
相关资源
最近更新 更多