Many hyperlinks are disabled.
Use anonymous login
to enable hyperlinks.
Overview
Comment: | Updates to the documentation. |
---|---|
Downloads: | Tarball | ZIP archive |
Timelines: | family | ancestors | descendants | both | trunk |
Files: | files | file ages | folders |
SHA3-256: |
c594b958164d384e1e07cf700a822489 |
User & Date: | drh 2018-02-01 03:45:01.040 |
Context
2018-02-01
| ||
13:31 | More shoplist.tcl enhancements. (check-in: 2169d31440 user: drh tags: trunk) | |
03:45 | Updates to the documentation. (check-in: c594b95816 user: drh tags: trunk) | |
03:11 | Safety enhancements: (A) Invoke the application with the --lint option to do a self-check for unsafe constructs. (B) Bring back the wapp-unsafe command for the rare cases where it is actually needed. (C) Comment out wapp.tcl comment lines when building the wapptclsh application. (check-in: 15fbf713e6 user: drh tags: trunk) | |
Changes
Changes to README.md.
1 2 3 4 5 6 | Wapp - A Web-Application Framework for TCL ========================================== 1.0 Introduction ---------------- | | | > > > > | | | | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 | Wapp - A Web-Application Framework for TCL ========================================== 1.0 Introduction ---------------- Wapp is a lightweight framework that simplifies the construction of web application written in TCL. The same Wapp-based application can be launched in multiple ways: 1. From the command-line, with automatic web-browser startup 2. As a stand-alone web server 3. As a CGI script 4. As an SCGI program All four methods use the same application code and present the same interface to the application user. An application can be developed on the desktop using stand-alone mode (1), then deployed as a stand-alone server (2), or a CGI script (3), or as an SCGI program (4). Wapp applications are inheriently resistant against XSS and CSRF attacks. See the "Security Considerations" section below for further details on the attack resistance of Wapp applications. 2.0 Hello World! ---------------- Wapp applications are easy to develop. A hello-world program is as follows: > #!/usr/bin/tclsh package require wapp proc wapp-default {req} { wapp-subst {<h1>Hello, World!</h1>\n} } wapp-start $::argv Every Wapp application defines one or more procedures that accept HTTP requests and generate appropriate replies. For an HTTP request where the initial portion of the URI path is "abcde", the procedure named "wapp-page-abcde" will be invoked to construct the reply. If no such procedure exists, "wapp-default" is invoked instead. The latter technique is used for the hello-world example above. The procedure generates a reply using one or more calls to the "wapp-subst" command. Each "wapp-subst" command appends new text to the reply, applying |
︙ | ︙ | |||
424 425 426 427 428 429 430 431 | + **wapp-escape-url** _TEXT_ Add _TEXT_ to the web page under construction after first escaping any characters so that the result is safe to include as the value of a query parameter on a URL. This command is equivalent to "wapp-subst {%url(_TEXT_)}". | > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | | > > > | | 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 | + **wapp-escape-url** _TEXT_ Add _TEXT_ to the web page under construction after first escaping any characters so that the result is safe to include as the value of a query parameter on a URL. This command is equivalent to "wapp-subst {%url(_TEXT_)}". 6.0 Security Considerations --------------------------- Wapp strives for security by default. Applications can disable security features on an as-needed basis, but the default setting for security features is always "on". Security features in Wapp include the following: 1. The default [Content Security Policy](https://en.wikipedia.org/wiki/Content_Security_Policy) of "CSP" for all Wapp applications is _default\_src 'self'_. In that mode, resources must all be loaded from the same origin, the use of eval() and similar commands in javascript is prohibited, and no in-line javascript or CSS is allowed. These limitations help keep application safe from [XSS attacks](https://en.wikipedia.org/wiki/Cross-site_scripting) attacks, even in the face of application coding errors. If these restrictions are too severe for an application, the CSP can be relaxed using the "wapp-content-security-policy" command. 2. Access to GET query parameters and POST parameters is prohibited unless the origin of the request is the application itself, as determined by the Referrer field in the HTTP header. This feature helps to prevent [Cross-site Request Forgery](https://en.wikipedia.org/wiki/Cross-site_request_forgery) attacks. The "wapp-allow-xorigin-params" command can be used to disable this protection on a case-by-case basis. 3. Cookies, query parameters, and POST parameters are automatically decoded before they ever reach application code. There is no risk that the application program will forget a decoding step or accidently miscode a decoding operation. 4. Reply text generated using the "wapp-subst" and "wapp-trim" commands automatically escape generated text so that it is safe for inclusion within HTML, within a javascript string literal, as a URL, or as the value of a query parameter. As long as the application programmer is careful to always use "wapp-subst" and/or "wapp-trim" to generate replies, there is little risk of injection attacks. 5. If the application is launched on a command-line with the --trim option, then instead of running the application, Wapp scans the application code looking for constructs that are unsafe. Unsafe constructs include things such as using "wapp-subst" with an argument that is not contained within {...}. Part of what makes Wapp easy to use is that it helps free application developers from the worry of accidently introducing security vulnerabilities via programming errors. Of course, no framework is fool-proof. Developers still must be aware of security. Wapp does not prevent every error, but it does help make writing a secure application easier and less stressful. 7.0 Developing Applications Using Wapp -------------------------------------- You can use whatever development practices you are comformable with. But if you want some hints for getting started, consider the following: 1. Compile the "wapptclsh" executable. You do not need a separate interpreter to run Wapp. A standard "tclsh" will work fine. But "wapptclsh" contains the a built-in copy of "wapp.tcl" and it has SQLite compiled in. We find it convenient to use. The sequel will assume you have "wapptclsh" somewhere on your $PATH. 2. Seed your application using one of the short scripts shown above, or perhaps one of the [examples](/file/examples) in this repository. 3. Make a few simple changes to the code. 4. Run "wapptclsh yourcode.tcl" to test your changes. Use the --trace option to list each HTTP request URI as it is encountered. Use the --lint option to scan the application code for dodgy constructs that must be a security problem. 5. Goto 3. Continue until your application is working. 6. Move the "yourcode.tcl" file to your server for deployment. During the loop between steps (3) and (5), there is no web server sitting in between the application and your browser, which means there is no translation or interpretation of traffic. This can help make debugging easier. Also, you can add "puts" commands to the application to get interactive debugging information on your screen while the application is running. 8.0 Limitations --------------- Each Wapp process is single-threaded. The fileevent command is used to allow accepting multiple simultaneous HTTP requests. However, as soon as a complete request is received, and the "wapp-page-NAME" proc runs, all other processing is suspended until that proc completes. |
︙ | ︙ | |||
477 478 479 480 481 482 483 | The POST data parser for Wapp currently only understands application/x-www-form-urlencoded content. Wapp does not (currently) have a decoder for multipart/form-data content. A multipart/form-data decoder might be added in the future. Or, individual applications can implement their own multipart/form-data decoder using the raw POST data held in the CONTENT parameter. | | | 538 539 540 541 542 543 544 545 546 547 548 549 550 | The POST data parser for Wapp currently only understands application/x-www-form-urlencoded content. Wapp does not (currently) have a decoder for multipart/form-data content. A multipart/form-data decoder might be added in the future. Or, individual applications can implement their own multipart/form-data decoder using the raw POST data held in the CONTENT parameter. 9.0 Design Rules ---------------- All global procs and variables used by Wapp begin with the four character prefix "wapp". Procs and variable intended for internal use begin with the seven character prefix "wappInt". |