On Mon, 21 Mar 2016 07:35:46 +0100, Daniel Beardsley <dan...@ifixit.com> wrote:

Issue is "Escaping is done on a specific context".

I understand your proposal is focused on HTML escaping. However,
setting names like
__auto_escape_exempt_class
is not good choice. It has to be
__auto_html_escape_exempt_class
at least because it is for HTML escaping.

Yes, the ini settings have poor names and can totally be changed.

In addition, HTML consists of multiple contexts

 - HTML context that requires HTML escape
 - URI context that requires URI escape
 - JavaScript context, embedded JavaScript strings for example , that
   requires JavaScript string escape, etc.
   e.g. http://blog.ohgaki.net/javascript-string-escape (Sorry. It's
   my blog and written in Japanese.
   You may try translation service or you should be able to understand
   PHP code at least)
 - CSS context that requires CSS escape.
   e.g. https://developer.mozilla.org/ja/docs/Web/API/CSS/escape
 - And so on

You are right. Though not all those problems are serious:
* HTML attributes:
  Use ENT_QUOTES so that content is escaped well enough
  for use in quoted attributes (still need quotes though)
* URI escaping:
  Does anyone really use <?= ?> or echo when generating a uri?
* Javascript:
  Good point, though I would say it's fairly rare to create javascript
  code using a php template with variables. The most we ever do
  in our app is  <?= json_encode($someArray) ?>
* Eveything else:
I think the better solution here is to simply let the user control this.
  Provide an ini setting that allows a custom output function to be set
  so the user could control what happens to unsafe strings and what
  the exemptions are. I'm considering doing this. This was html-only
  at the beginning because we only created this for html templates
  and were able to call the internal php functions directly, ginving
  us nearly no performance penalty.


Dealing HTML context only would be problematic even if it works for many cases.

Escaping must be done depends on context. Multiple contexts may apply
also. HTML context only escaping would not work well.. Applying proper
escapes to variables in HTML is very complex task..

Regards,

--
Yasuo Ohgaki
yohg...@ohgaki.net


The escape context could be detected (e.g. Latte template engine supports context-aware escaping for years – https://latte.nette.org/en/#toc-context-aware-escaping) but the logic is quite complex for it to be included in PHP core.

Also relying on ini setting is evil as it may break existing libraries. You would need to introduce a different way to manage the setting, e.g. introduce new language construct require_template which would turn this behavior on for a single included file or new declare(template_mode=1) which you would need to write at the beginning of each template.

Regards,
Jan Tvrdik

--
PHP Internals - PHP Runtime Development Mailing List
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to