php - 我可以使用 mysqli_prepare() 阻止在我的 php 网站上运行 javascript 作为输入吗
问题描述
我正在使用 mysql_prepare() 函数来避免我的网站上的 SQL 注入。我想知道它是否有效!
当我<script>alert("something")</script>
用作其中一个字段的输入时,脚本会进入我的数据库,我想知道它是否正常!?!
我错过了什么吗?
或者准备函数只是避免 SQL 注入。
解决方案
不,您不能通过使用参数化查询来阻止在您的页面上执行 JavaScript。
使用参数化查询的全部目的是防止您的 SQL 在提供意外输入时中断。当您将数据与 SQL 分开绑定时,数据不会影响 SQL。例如:
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$mysqli = new mysqli('localhost', 'user', 'pass', 'test');
$mysqli->set_charset('utf8mb4'); // always set the charset
$email = '1 or 1=1';
$stmt = $mysqli->prepare('SELECT user FROM users WHERE email=?');
$stmt->bind_param('s', $email);
$stmt->execute();
在此示例中,电子邮件看起来像 SQL,但 MySQL 服务器永远不会将其视为 SQL。它是单独绑定的,因此 MySQL 在解析 SQL 后已经接收到它。这有助于防止 SQL 注入。永远不要逃避您绑定的数据!
如您所见,准备好的语句仅保护 SQL。它们不会保护用户将 JavaScript 或 HTML 代码提交到您的数据库中。您需要添加额外的验证规则或简单地将其视为任何其他数据。
为了防止 JavaScript 或 HTML 或任何其他数据破坏您的网站,您需要确保在输出方面始终遵循最佳实践。您必须始终正确格式化数据。
- 用于 HTML
htmlentities()
或htmlspecialchars()
输出数据时 - 对于 JavaScript 使用
json_encode()
- 对于 URL 使用
http_build_query()
- 等等
推荐阅读
- windows - 7-zip 安装和卸载后的 zip 错误
- python-3.x - 定义多个 Python 脚本中使用的常量
- python - Pandas/matplotlib 线图不显示 x 轴文本标签
- ruby-on-rails - CSS类选择器不适用于form.collection_select Rails 5
- java - 如何根据语言选择Url?
- excel - 如何找到用户 Outlook 默认签名的文件名?
- google-analytics - 我可以将参数传递给 Google 数据洞察吗?
- c++ - 源文件中模板类的显式实例化不起作用
- javascript - 如何在表中选择一列以搜索其中的值?
- c# - 我正在关注统一引擎的过时教程,但无法让我的脚本做预期的事情