当前位置: 首页 > 知识库问答 >
问题:

仅使用html防止SQL注入

濮赤岩
2023-03-14

我正在尝试验证注释框的输入,以便只接受文本,并在用户输入数字(1-0)或符号(@\$%)时提醒消息^

有没有办法在html中做到这一点

共有3个答案

边翔宇
2023-03-14

简短回答:不,你不能在HTML中这样做。即使只有一个复选框和提交按钮的表单也可能被滥用。

更长的答案...

虽然我强烈反对用HTML和JavaScript无法增强安全性,但对此的全面讨论远远超出了本文的范围。

但最终,您不能假设来自您无法控制的计算机系统的任何数据在任何方面都是安全的(事实上,在许多应用程序中,您不应该假设来自您确实控制的机器的数据是安全的)。

针对任何攻击的主要防御措施是将数据转换为发送和接收组件的已知安全格式,然后再在系统组件之间传递。这里,我们具体讨论的是将数据从服务器端应用程序逻辑传递到数据库。此交换中既不涉及HTML也不涉及JavaScript。

向客户端移动,您可以做出选择。您可以根据数据中的模式验证和接受/拒绝内容以进行进一步处理,或者您可以处理所有数据并信任较低层正确处理内容。通常,人们会选择第一个选项,但这会引发新的安全问题;绘制防御并找到任何漏洞变得很容易。在一个不太重要的理想世界中——更深层次的防御将解决问题,但在现实世界中,开发人员受到时间和能力的限制。如果归结为选择你的技能/时间预算在哪里,那么答案应该总是让输出比验证输入更安全。

施彬郁
2023-03-14

有没有办法在html中做到这一点

不。正如其他人所指出的,您不能通过在HTML或Javascript中执行任何操作来提高安全性。

原因是浏览器和服务器之间的通信对攻击者完全透明。任何开发人员都可能熟悉Firefox、Chrome等中的“开发人员工具”。即使是那些在大多数现代浏览器中都存在的工具,也足以创建任意HTML请求(甚至通过HTTPS)。

因此,服务器决不能依赖于请求任何部分的有效性。不是URL,不是GET/POST参数,不是cookies等。;服务器端,你必须自己验证。

避免SQL注入的最佳方法是确保永远不要有这样的代码:

 sql = "select xyz from abc where aaa='" + search_argument + "'"  # UNSAFE
 result = db.execute_statement(sql) 

也就是说,您永远不希望只将字符串连接到一起,以用于SQL语句。

相反,您要做的是使用绑定变量,类似于以下伪代码:

 request = db.prepare_statement("select xyz from abc where aaa=?")
 result = request.execute_statement_with_bind(sql, search_argument)

这样,用户输入永远不会被解析为SQL本身,这使得SQL注入变得不可能。

当然,在客户端检查参数以改善用户体验(避免服务器往返的延迟)仍然是明智的;也许在服务器端也是如此(以避免神秘的错误消息)。但是这些检查不应该与安全性混淆。

蔺霄
2023-03-14

你永远不能相信来自客户的东西。您必须始终进行服务器端检查,以阻止SQL注入之类的操作。

当然,您可以添加您提到的客户端验证,但这只是为了帮助用户不要输入垃圾数据。一旦发送到服务器,仍然无法信任它。

 类似资料:
  • 问题内容: 我有一个现有的代码,其中应用程序根据很多条件生成不同的sql并通过hibernate会话createSQLQuery()执行它们。在这里,这些参数与作为普通字符串替换驻留在java类中的sql字符串相连接。现在的问题是,我需要防止sql注入。因此,为此,我必须使用getNamedQuery()并绑定参数,以便hibernate将处理特殊字符。但是问题在于将字符串sql的字符串移动到xm

  • 所谓 SQL 注入,就是通过把 SQL 命令插入到 Web 表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的 SQL 命令。具体来说,它是利用现有应用程序,将(恶意)的 SQL 命令注入到后台数据库引擎执行的能力,它可以通过在 Web 表单中输入(恶意)SQL 语句得到一个存在安全漏洞的网站上的数据库,而不是按照设计者意图去执行 SQL 语句。比如先前的很多影视网站泄露 VI

  • 问题内容: 我遇到了一群黑客。他们几次入侵了我客户的网站,我的客户更加生气:(我的客户丢失了他的数据库(有数百条记录),不得不输入所有:( 现在,我将进行更多介绍。 固定文件权限 更改了ftp和主机登录信息 清除所有远程mysql访问 现在正在处理SQL注入问题。我在管理面板登录参数中添加了mysql_real_escape_string。所以我还应该在哪里使用mysql_real_escape_

  • 注意:但凡是sql注入漏洞的程序,都是因为程序要接受来自客户端用户输入的变量或URL传递的参数,并且这个变量或参数是组成sql语句的一部分,对于用户输入的内容或传递的参数,我们应该要时刻保持警惕,这是安全领域里的【外部数据不可信任】的原则,纵观web安全领域的各种攻击方式,大多数都是因为开发者违反了这个原则而导致的,所以自然能想到,就是变量的检测、过滤、验证下手,确保变量是开发者所预想的。 1、检

  • 是否可以像PHP准备语句那样防止SQL注入Node.js(最好是使用模块)。 如果是,怎么做?如果不是,有哪些例子可以绕过我提供的代码(见下文)。 某些上下文: 我正在使用node-mysql模块制作一个具有由node.js+MySql组成的后端堆栈的web应用程序。从可用性的角度来看,这个模块很棒,但是它还没有实现类似于PHP准备好的语句的东西(尽管我知道它在todo上)。 根据我的理解,PHP

  • 本文向大家介绍ThinkPHP如何防止SQL注入?相关面试题,主要包含被问及ThinkPHP如何防止SQL注入?时的应答技巧和注意事项,需要的朋友参考一下 (1)查询条件尽量使用数组方式,这是更为安全的方式; (2)如果不得已必须使用字符串查询条件,使用预处理机制; (3)使用绑定参数 (4)开启数据字段类型验证,可以对数值数据类型做强制转换;(3.1版本开始已经强制进行字段类型验证了) (5)使