我最近问了一个关于仅包含单选按钮的表单的问题。一位经验丰富的用户回答并告诉我,我对 SQL 注入持开放态度。有人可以解释一下吗?- 没有文本用户输入。
4 回答
用户可以轻松地编辑 HTML 或以其他方式更改提交的内容。仅仅因为它们是单选按钮并不意味着它们不能改变值;他们可以将它们设置为任何东西,包括可能导致注入的值。
通用浏览器工具使用户能够修改 HTTP 请求,因此有人可以轻松地将您的单选按钮值更改为任何值。
任何用户都可以使用 DOM 浏览器编辑这些字段,例如Firefox 中的Firebug或 Chrome 中包含的浏览器。(检查元素选项)
没有用户输入,但用户仍然可以编辑 DOM 结构和包含。
但不仅仅是编辑它们。如果您的站点对跨站点脚本攻击 (XSS)不安全,任何人都可以在自己的计算机或主机中创建一个表单,并使用自己的输入将其发送到您的站点POST
。
您可以在此站点中阅读有关安全性和 PHP 的更多信息。
除了过滤输入之外,避免 SQL 注入的最佳方法是使用PDO或准备好的语句对 DB 进行安全调用。
例如:
$stmt = $dbh->prepare("INSERT INTO REGISTRY (name, value) VALUES (:name, :value)");
$stmt->bindParam(':name', $name);
$stmt->bindParam(':value', $value);
// insert one row
$name = 'one';
$value = 1;
$stmt->execute();
表单为人们提供了一种向您的 HTTP 端点提交数据的方法,但人们不需要使用它来提交数据。例如,他们可以创建自己的表单,或者手动构建 HTTP 请求。
您发送给客户的任何内容都无法阻止人们提交他们想要的任何内容。
端点需要对任何输入保持安全,因为您无法控制它将接收什么输入。
恶意用户不需要您的表单来向您的服务器创建自己的 POST 请求。他们只需要知道您的服务器接受的表单密钥,然后他们就可以在那里创建自己的请求。
如果您允许将未转义的$_POST/$_GET/$_REQUEST/$_COOKIE/(some $_SERVER)
值直接插入到您的查询中,那么您将受到影响。
为了安全起见,使用带有 PDO 或 mysqli 的参数化查询。
请阅读这篇文章:如何防止 PHP 中的 SQL 注入?