因此,随着 HTML5 在客户端为我们提供本地 SQL 数据库,如果您想编写 select 或 insert,您不再能够通过说
$buddski = mysql_real_escape_string($tuddski)
来清理第三方输入,因为 PHP 解析器和 MySQL 桥接器相距甚远。离开。这是 SQLite 的一个全新世界,您可以在其中使用 JavaScript 编写查询并解析结果。
但是,虽然您可能不会让整个站点的数据库瘫痪,但由于恶意注入攻击而导致其数据库损坏或擦除的用户将会感到相当不安。
那么,在纯 JavaScript 中,有哪些方法可以转义/清理您的输入,以便它们不会对用户的内置数据库造成严重破坏?
Scriptlet?规格?有人吗?
一旦你将计算完全委托给客户端,游戏就结束了。即使您的脚本是防弹的,用户仍然可以在本地加载自己的脚本(有关良性示例,请参阅 GreaseMonkey) - 并绕过您的脚本自行访问客户端数据库。
在我看来,客户端数据库与不受信任的客户端(也就是说,几乎所有客户端)的唯一有用的应用程序是镜像/缓存主服务器端数据库的部分 - 这样客户端就不必通过重复请求通过网络提取数据(如果此类客户端数据库损坏,只需使其无效并再次从服务器加载数据)。
我不确定 HTML5 和本地数据库,但在服务器端最好使用 prepared statements 而不是转义。我相信客户端的数据库也是一样的。
我认为,即使您清理了 JavaScript 上的输入,也会使您的系统容易受到攻击。另外,如果您在 javascript 中放置一个输入清理程序,并在 php 文件中放置另一个输入清理程序,这将是多余的。
使用 Google 的 JavaScript Html Sanitizer,作为 Caja 发行版的一部分提供,网址为: http://code.google.com/p/google-caja/
这个库可以在客户端和服务器端使用。我在一个经典 ASP 项目的服务器端使用它,该项目在 ASP JScript 主机下运行该库。
有一些图书馆可以帮助你。您可以使用 sqlstring,这是一个小实用程序,用于转义要作为查询的一部分传递到 MySQL 的值。
另一个有用的库是prep-composer(我正在开发)。它专注于为所有 SQL 方言编写复杂查询。它不是像 Knex.js 这样的查询构建器,但它为您提供了更大的灵活性。您可以在编写查询时内联传递值,它会跟踪这些位置和顺序。它可以与第三方转义库一起使用,例如 sqlstring。
使用示例:
const name = "O'Brien";
const jobTitles = ['Developer', 'Designer'];
const selectFromPart = sql('SELECT * FROM', $['my_db']['employees']);
const conditionPart = sql('name =', $(name), 'AND job_title IN (', $(jobTitles), ')');
const query = sql(selectFromPart, 'WHERE', conditionPart);
console.log(query.toString());
// SELECT * FROM `my_db`.`employees` WHERE name = ? AND job_title IN ( ?, ? )
输出可以在准备好的语句中使用(为了最大程度的安全),但也可以进行转义。参数值可通过
query.parameters
访问。