◂◂ POLICIES
The technical and organisational controls protecting student data in both Trainers, how we respond to incidents, and — stated plainly — where our current limitations lie.
This policy describes how r2 Education protects the confidentiality, integrity and availability of information in the OLNA Trainer and the NAPLAN Trainer. It is published so schools and education authorities can assess us without having to send a questionnaire first.
In scope: both Trainers, the homepage, the two databases, the server functions, hosting and CDN, the AI provider integration, the source repositories and deployment pipelines, and the operator's own practices.
Out of scope: school‑owned devices, networks, identity systems and premises. Endpoint security, network filtering and supervision of students remain the school's responsibility.
r2 Education is a small Australian operation, not a large vendor with a security team. This policy describes controls that genuinely exist and claims no certifications we do not hold. Section 19 lists our limitations without varnish. A school is better served by an accurate picture than an impressive one.
| Control | Status | Detail |
|---|---|---|
| Passwords as one‑way hashes (bcrypt) | IN PLACE | §6.2 |
| TLS/HTTPS on all traffic | IN PLACE | §8.1 |
| Encryption at rest | IN PLACE | §8.2 |
| Databases closed to public access by default | IN PLACE | §7.1 |
| Server‑side identity binding | IN PLACE | §7.2 |
| Role and class‑level access scoping | IN PLACE | §7.3 |
| Separate databases per Trainer | IN PLACE | §5.1 |
| Brute‑force rate limiting on sign‑in | IN PLACE | §6.3 |
| Sign‑in audit log | IN PLACE | §14.1 |
| Secrets held outside source code | IN PLACE | §12 |
| Automated point‑in‑time backups | IN PLACE | §15 |
| Version control and reviewed deployment | IN PLACE | §13 |
| AI fair‑use caps and output validation | IN PLACE | §10 |
| Documented 72‑hour breach notification | IN PLACE | §16 |
| HTTP security response headers | PARTIAL | Complete except OLNA — §9.1, §19.3 |
| Origin‑restricted API access (CORS) | PARTIAL | §19.4 |
| Patch management | PARTIAL | §19.5 |
| Continuous automated monitoring | PARTIAL | §14.2, §19.7 |
| Australian data residency | NOT IN PLACE | §11.1, §19.1 |
| Multi‑factor authentication for staff | NOT IN PLACE | §19.2 |
| Independent penetration test | NOT YET | §19.6 |
| ISO 27001 / IRAP / SOC 2 | NOT HELD | §20.2 |
r2 Education is run by a single principal, accountable for every security decision and the contact point for every security and privacy matter. There is no separate security team and this policy does not pretend otherwise.
| Tier | Includes | Handling |
|---|---|---|
| Sensitive | Adjustment settings, teacher notes, password hashes, sign‑in logs with IP addresses, and OLNA stored writing submissions. | Server access only. Never returned to a client that does not need it. Excluded from leaderboards and every shared view. Schools instructed to keep health and welfare information out of free‑text fields. |
| Confidential | Student and teacher accounts, question attempts, results, session history, class membership. | Visible only to the student concerned, their class teachers and school administrators. Enforced server‑side. |
| Internal | AI usage and cost metering, aggregate statistics, infrastructure logs. | No question content, answers or writing. Operator access only. |
The full inventory of what is held, and what is deliberately not, is in sections 4 and 5 of the Privacy Policy.
Both Trainers have three tiers, with one deliberate security property: the browser never talks to the database.
A common failure in education apps is a browser that queries the database directly, where a modified client can ask for records it should not see. That is structurally impossible here: there is no database credential in the browser to abuse, and no table readable without one.
The OLNA Trainer and the NAPLAN Trainer run on entirely separate databases, with separate credentials, separate server functions and separate hosting projects. A compromise of one does not reach the other, and a school using only one Trainer has data in only one system.
There is no public sign‑up on either Trainer. Every account is created by a teacher or administrator, so the attack surface of an open registration flow — automated account creation, enumeration, spam — does not exist.
Passwords are stored only as bcrypt hashes with a per‑password salt. Plaintext is never written to a database or a log, and cannot be recovered by us or by anyone holding a copy of the database. A forgotten password is reset by a teacher, not recovered.
Every sign‑in attempt, successful or failed, is recorded with username, role, source IP, timestamp and outcome. Over a rolling 15‑minute window:
The per‑IP limit is deliberately generous because a whole class typically shares one school IP through network address translation, and a tighter limit would lock out a classroom. The per‑username limit is the control that actually stops password guessing.
Failures return a single generic message that does not reveal whether the username exists, and internal error detail never reaches the browser.
Schools should tell students to sign out on shared devices — a token left on a classroom machine stays valid until it expires. See §19.2.
Every table has row‑level security enabled with no permissive policies — in PostgreSQL that denies access to every role except the privileged service role. No table is readable by an anonymous or public client, and there is no way around the server functions.
Where a view shapes data for a report, it is created with invoker security so it inherits the caller's permissions rather than its definer's. A view that silently bypasses row‑level security is a well‑known way to leak data out of an otherwise locked‑down schema, and we check for it specifically.
This is the single most important control in both Trainers. When a student records an answer, flags a question, submits writing or asks for their results, the student identifier is taken from the verified token on the server and any identifier in the request body is ignored. A modified client cannot read or write another student's records by changing an ID.
Where a request refers to a child object — an answer belonging to a particular practice test, say — the server checks that object belongs to the calling student before accepting the write.
| Role | Server‑enforced scope |
|---|---|
| Student | Their own records only. Cannot enumerate, view or change any other account. |
| Class teacher | Only students in their explicitly assigned class groups, resolved server‑side on every request. |
| School administrator | All students and teachers at the school, plus account management. |
Scoping happens in the server function, not the interface. Hiding a button is not access control; removing the data from the response is.
Responses carry only the fields the caller needs. The leaderboard, for instance, returns display names and aggregate accuracy only — deliberately excluding usernames, account identifiers, teacher notes, adjustment settings and individual answers, so a feature every student can see cannot become a data leak.
Each database's service key lives in its server function environment. It is never sent to a browser, never built into the application bundle, and never committed to source control.
All traffic — browser to site, browser to server functions, server functions to database, server functions to the AI provider — uses HTTPS with TLS 1.2 or higher. HTTP is redirected to HTTPS by the hosting platform, and certificates are issued and renewed automatically.
Both databases and their backups are encrypted at rest by the platform using AES‑256, with keys managed by the underlying cloud provider. Static site files contain no personal information.
Passwords carry the additional one‑way bcrypt protection in §6.2, so they stay unusable even to someone with full database access.
| Risk | Control |
|---|---|
| SQL injection | All database access goes through a parameterised client library. No query is built by concatenating user input. |
| Broken object‑level authorisation | Identifiers come from the verified token, and ownership of child objects is checked server‑side before any write (§7.2). |
| Cross‑site scripting | All user‑supplied and model‑generated text is HTML‑escaped before insertion into the page. |
| Oversized or malformed input | Server functions whitelist the fields they accept and truncate every text field to a fixed maximum before storage. Unexpected fields are discarded. |
| Information disclosure in errors | Authentication failures return a generic message; internal error detail is not returned to the browser. |
| Resource exhaustion / cost abuse | Per‑account daily caps on every AI endpoint (§10.2) plus sign‑in rate limiting (§6.3). |
| Dependency risk | A deliberately small footprint — a database client, a password hashing library and a token library, each pinned to a specific version (§13.3). |
| Malicious file upload | Not applicable. Neither Trainer accepts file uploads of any kind. |
Security response headers are configured per hosting project, and are currently uneven across the three:
| Property | Status | Headers sent |
|---|---|---|
| r2education.com.au (homepage) | COMPLETE | Content‑Security‑Policy, Strict‑Transport‑Security, X‑Frame‑Options, X‑Content‑Type‑Options, Referrer‑Policy, Permissions‑Policy, Cross‑Origin‑Opener‑Policy. |
| NAPLAN Trainer | COMPLETE | Content‑Security‑Policy, Strict‑Transport‑Security, X‑Frame‑Options, X‑Content‑Type‑Options, Referrer‑Policy, Permissions‑Policy, Cross‑Origin‑Opener‑Policy. |
| OLNA Trainer | PARTIAL | X‑Content‑Type‑Options, X‑Frame‑Options, Referrer‑Policy. No CSP, HSTS or Permissions‑Policy yet. |
Bringing the OLNA Trainer up to the same configuration is a small change to a static header file and is our next scheduled security task (§19.3). These headers are defence in depth: the controls in §7 do not depend on them.
Both Trainers are single‑file applications with inline scripts and inline event handlers, so their content security policies must allow 'unsafe-inline' for scripts and styles. That means the policy restricts where code may be loaded from — no script from a host we have not listed — but does not by itself stop an injected inline script. Neither Trainer uses eval(), so 'unsafe-eval' is withheld. The real defence against injection is the output escaping in §9, not the policy.
Requests to the AI provider carry only what the task needs: for generation, a year level, topic and difficulty; for writing feedback, the response text, the prompt and the year level. No student name, username, account identifier, class or school name goes into any AI request. The provider receives student writing without knowing whose it is.
Each account has a daily cap on each AI endpoint, calculated on the Perth calendar day — 20 writing responses per account per day, with lower caps on generation endpoints. If the cap check itself fails the request is allowed, so a database hiccup never locks a student out mid‑lesson.
Model responses must match a strict predefined schema before display. A malformed or refused response is discarded and the failure logged rather than rendered. Generated content is HTML‑escaped like any other untrusted input.
Every AI call is logged with function, model, outcome, token counts, cost, duration and calling account — and no question content, answers or writing. It exists for cost control and abuse detection.
Our AI provider's commercial API terms state that customer inputs and outputs are not used to train its models. We have not enabled and will not enable any arrangement under which student work trains a model.
AI features are non‑essential. If the provider is unavailable, the fixed question banks, practice tests and all reporting keep working.
| Provider | Function | Data received | Location |
|---|---|---|---|
| Supabase (on AWS) | Managed PostgreSQL and server functions. Two separate projects, one per Trainer. | All stored personal information. | OLNA Singapore ap-southeast-1NAPLAN Tokyo ap-northeast-1 |
| Anthropic | AI generation, marking and hints. | Writing text, prompt, year level, topic, difficulty. No identifiers. | United States |
| Cloudflare | Static hosting (Pages), CDN, TLS, network‑layer protection. | IP address and request metadata only. | Global edge, including Australia |
| GitHub | Source control and deployment pipelines. | Source code only. No student data. | United States |
| Google Fonts, jsDelivr | Typefaces and one open‑source library delivered to the browser. | IP address and browser type only. | Global CDN |
We choose providers that publish enterprise security programmes and independent audit reports — Supabase and its underlying AWS infrastructure, Cloudflare and GitHub all hold SOC 2 Type II or equivalent attestations. We will not add a sub‑processor receiving personal information without updating this policy and the Privacy Policy and giving schools 30 days' notice.
Neither database is in Australia. The OLNA Trainer's is in Singapore, the NAPLAN Trainer's in Tokyo, and writing is marked in the United States.
Our database platform offers an Australian (Sydney) region. If your school or authority requires Australian residency, email hello@r2education.com.au before deploying and we will discuss migrating that Trainer's database to Sydney. AI marking would remain a United States service; a school that cannot accept that can run either Trainer with AI writing marking switched off, everything else intact.
All code lives in private repositories. Every change is attributable to an author and a time, giving a full audit trail of what changed and why.
Third‑party libraries are pinned to specific versions rather than floating ranges, so a compromised upstream release cannot be pulled in silently. The footprint is intentionally minimal. We watch advisories for what we use and patch on the timeline in §19.5.
| Log | Contents | Retention |
|---|---|---|
| Sign‑in attempts | Username, role, source IP, timestamp, success or failure. | 12 months |
| AI usage | Function, model, outcome, tokens, cost, duration, calling account. No content. | 24 months |
| Platform logs | Request and error logs from hosting and database platforms. | Provider default, 7–30 days |
Logs never contain passwords, tokens, secrets or writing responses.
We review sign‑in failure patterns for credential attacks, AI usage for anomalous volume, and platform error rates for malfunction or probing. Provider alerting notifies the principal of platform incidents.
Limitation. Monitoring is periodic and manual, not continuous and automated. There is no SIEM and no 24/7 alerting, so a slow, low‑volume intrusion could go undetected longer than it should. Stated rather than glossed over — see §19.7.
Because both Trainers are practice tools rather than systems of record, a school's essential records do not depend on them. We still recommend exporting class results at the end of each term.
| Who | When | What |
|---|---|---|
| Affected school | Within 72 hours of forming a reasonable belief a breach affecting its data occurred | What happened, what information was involved, which students, what we have done, what we recommend. We notify even while assessment continues. |
| OAIC | As soon as practicable, per the Notifiable Data Breaches scheme | Where an eligible breach is likely to cause serious harm. |
| Affected individuals | In coordination with the school | The school leads communication with students and families; we supply the factual content and support. |
| Education department | On the school's request, or where required | We complete departmental incident reporting and cooperate fully with any investigation. |
We will not delay notifying a school while we investigate, and we will not minimise or withhold detail. A school is entitled to know promptly and completely when its students' information may have been exposed, even if our assessment is still running.
Email hello@r2education.com.au with "SECURITY" in the subject. We aim to acknowledge within one business day, immediately for anything reported as critical. If credentials may be compromised, deactivate the affected accounts yourself straight away — do not wait for us.
Full periods are in section 12 of the Privacy Policy. In summary:
We welcome reports from researchers, teachers, students and anyone else. We will not pursue legal action against someone who reports a vulnerability in good faith under this section.
We will keep you posted, fix confirmed issues as fast as we reasonably can, and credit you if you want credit. There is no paid bug bounty.
Every security policy should be read alongside what it does not claim. These are our current limitations, so a school can decide with its eyes open.
Singapore for OLNA, Tokyo for NAPLAN, US for AI marking (§11.1). Where an authority requires Australian residency, a database can be migrated to the platform's Sydney region — raise it before deployment. Priority: high, on request.
Sign‑in is username and password only. MFA is impractical for students, many of whom have no personal device — but a teacher or administrator account is a higher‑value target, seeing a whole class or a whole school. Optional MFA for staff accounts is on the roadmap. Until then, schools should ensure staff use strong unique passwords and change them on any suspicion. Priority: high.
The homepage and the NAPLAN Trainer send a full set including a content security policy; the OLNA Trainer sends three headers and no CSP (§9.1). Levelling it up is a small static‑file change and is the next scheduled security task. Note the inherent limit on both Trainers' policies described in §9.1. Priority: high, near term.
The server functions send a permissive cross‑origin policy. This does not grant access to data — every request is still authenticated and authorised server‑side, and a browser on another site cannot obtain a valid token. It does mean endpoints can be called from any origin by a client already holding a valid token. Restricting the allowed origin to our own domains is planned. Priority: medium.
Database and hosting platforms are managed services patched by the provider; application dependencies are updated by hand. Targets: 7 days for critical, 30 days for high, next release for medium and low. Automated dependency scanning is on the roadmap. Priority: medium.
Neither Trainer has been penetration tested by an independent third party. Security has been addressed by design (§5, §7) and by internal review, but that is not the same thing. We will commission one as the service grows and share results with schools that need them. Priority: medium.
See §14.2. No automated 24/7 alerting on anomalous access, so a slow intrusion could be detected late. Priority: medium.
r2 Education is one person. That is good for access control — exactly one human can reach student data — but it means no separation of duties, no peer review of every change, and a single point of failure for incident response. Schools should weigh it. It is inherent to an operation this size, and disclosed rather than engineered away.
We will keep this section honest. Items come off only when the control genuinely exists, and new limitations get added as we find them. If something here matters to your assessment, tell us — it moves up the list.
Reviewed every six months, and additionally after any security incident, significant architectural change, or change of sub‑processor. The version and date at the top always reflect the current version.
r2 Education holds no ISO 27001, SOC 2, IRAP or other formal security certification, and will not imply otherwise. Our platform providers hold independent attestations (§11), but that is assurance over their infrastructure, not over our applications.
Free of charge, we will:
Contact hello@r2education.com.au.