防止xss攻击的更好方法

发布于 2024-11-17 14:21:32 字数 141 浏览 0 评论 0原文

这两种方法中哪一种是更好的防止 xss 攻击的方法?

  1. 时保存在 db
  2. HTMLEntities在显示/回显

HTMLEntities 中时我发现第一个更好,因为您可能会在显示时忘记添加它。

Which of the two is a better way to prevent an xss attack?

  1. HTMLEntities while saving in db
  2. HTMLEntities while displaying/echoing

I find the first one better because you may forget to add this while displaying.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

随梦而飞# 2024-11-24 14:21:32

这两种方式哪个是更好的防止xss攻击的方法。

  1. 保存在数据库中时的 HTMLEntities
  2. 显示/回显时的 HTMLEntities

2 — 您应该在最后一刻转换为目标格式。例如,如果您决定在电子邮件、PDF 中使用相同的内容,作为文本返回给用户进行编辑等,这可以帮助您避免出现问题。

我发现第一个更好,因为您可能会在显示时忘记添加它

而在插入数据库时​​也可能会忘记。

此外,并非所有数据都会进入数据库。例如,由于错误而要插入的数据预览或放回到表单中的数据都是可能的 XSS 向量。您不想处理诸如“在放入数据库之前进行编码,或者如果文档不是来自数据库则在回显文档时进行编码”之类的事情。异常是让自己陷入忘记编码的情况的最好方法。

which of the two is a better way to prevent xss attack.

  1. HTMLEntities while saving in db
  2. HTMLEntities while displaying/echoing

2 — you should convert to the target format at the last possible moment. This saves you from problems down the road should you, for example, decide you want to use the same content in an email, a PDF, as text back to the user for editing, etc, etc.

i find the first one better coz you may forget to add this while displaying

You might forget when inserting into the database too.

Also, not all data goes into the database. e.g. A preview of data about to be inserted or data put back into a form because of errors are both possible XSS vectors. You don't want to be dealing with things like "Encode before putting into the database, or when echoing back into the document if it didn't come from a database". Exceptions are the best way to get yourself into a situation where you forget to encode.

因为看清所以看轻 2024-11-24 14:21:32

如果你问我,最好的方法(选项号 3..)是使用最新的 过滤器 扩展来为您处理过滤(PHP5)。我喜欢将 filter_input_array 放在我的 php 文件的顶部保护自己免受 POST XSS 攻击等攻击

$_POST  = filter_input_array(INPUT_POST, FILTER_SANITIZE_STRING);

您应该阅读过滤器文档(教程)并保护自己免受输入 XSS 攻击。

The best way(option number 3..) if you ask me is using the latest filter extension to handle filtering for you(PHP5). I like to put filter_input_array at the top of my php file to protect myself against for example POST XSS attacks

$_POST  = filter_input_array(INPUT_POST, FILTER_SANITIZE_STRING);

You should read the filter documentation(tutorials) and protect yourself against XSS for input.

天暗了我发光 2024-11-24 14:21:32

在显示代码中进行编码的原因(即从数据库读取文本后):

  • 可以在需要修改的非基于 HTML 的 GUI 中查看数据库。修改通用数据库管理工具以自动解码单个应用程序的特定文本(使用哪个字符集?)既不可行也不可取。
  • 未正确编码 HTML 意味着您必须相信数据库是安全的。如果直接在数据库或另一个 Web 应用程序中存在漏洞,您的应用程序也将变得容易受到攻击。
  • 在数据库中存储编码的 HTML 可以防止搜索;你不能直接使用像 Lucene 这样的专用搜索库。此外,由于 html 编码可能不是双射的,因此全文搜索必须对数据库的解码副本进行操作,或者对数据库中的所有条目进行解码,从而导致 O(数据库大小)性能。
  • 如果所有编码代码都集中在显示代码中,未来的编码转换也会变得更加容易。
  • 编码增加了占用的存储空间

我在写的时候想不出什么编码的理由。您提到人们可能会忘记在显示逻辑中对数据进行编码,但我认为您同样可能会在存储代码的数据库中忘记它。

Reasons for encoding in the display code (i.e. after reading text from the database):

  • The database may be viewed in a non-HTML based GUI that would require modification. Modifying general-purpose database administration tools to automatically decode specific text(in which charset?) for a single application is neither feasible nor desirable.
  • Not properly encoding HTML means that you will have to trust the database to be safe. If there is ever a vulnerability – directly in the database or in another web application, your application will become vulnerable too.
  • Storing encoded HTML in the database prevents searching; you cannot directly use dedicated searching libraries like Lucene. Also, since html-encoding may not be bijective, full text searches must either operate on a decoded copy of the database or decode all entries in the database, incurring O(database size) performance.
  • Future encoding transitions are also way more easier if all the encoding code is concentrated in the display code.
  • Encoding increases the occupied storage space

I can't think of any reason for encoding when writing. You mention one may forget to encode data in the displaying logic, but I'd argue you're equally likely to forget it in the database storing code.

风月客 2024-11-24 14:21:32

更好的方法是在保存到数据库之前使用 strip_tags()htmlentities() (如果您不介意一些额外的数据位)。

但是,请确保您还采取了其他预防措施,通过使用 mysql_real_escape_string() 或准备好的语句数据访问抽象层(例如 PDO)来防止 SQL 注入。

A better way would be strip_tags() and htmlentities() before saving to db (if you don't mind some extra bits of data).

However, make sure you have taken other precautions as well to protect against SQL injection, by using mysql_real_escape_string() or a prepared statement data-access abstraction layer, such as PDO.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文