zoukankan      html  css  js  c++  java
  • SQL中# 与$ 的区别

    区别:

    (1)#将传入的数据都当成一个字符串,会对自动传入的数据加一个双引号。如:order by #user_id#,如果传入的值是id,则解析成的sql为order by "id"。

    (2)$将传入的数据直接显示生成在sql中。如:order by $user_id$,如果传入的值是id,则解析成的sql为order by id。

    (3)#方式在很大程度上能够防止sql注入。

    (4)$方式无法防止sql注入。

    (5)$方式一般用于传入数据库对象,例如传入表名。(这里得注意SQL注入问题

    (6)一般能用#的就别用$。

    ps:在使用mybatis中还遇到<![CDATA[]]>的用法,在该符号内的语句,将不会被当成字符串来处理,而是直接当成sql语句,比如要执行一个存储过程。

    总结区别:#{} 传入值时,sql解析时,参数是带引号的,而${}穿入值,sql解析时,参数是不带引号的。

    举个例子:

    select * from ${table_Name} where name = #{name}

    在这个例子中,如果表名为

       user; delete user; --

      则动态解析之后 sql 如下:

    select * from user; delete user; -- where name = ?;

    --之后的语句被注释掉,而原本查询用户的语句变成了查询所有用户信息+删除用户表的语句,会对数据库造成致命损伤。

    但是表名用参数传递进来的时候,只能使用 ${} 。这也提醒在这种用法中要小心sql注入的问题。

    防止SQL注入方法:

    首先,永远不要相信用户的输入。

    (1)不使用SQL,考虑NoSQL。

    (2)正则表达式,字符串过滤。

    (3)参数绑定PreparedStatement。

    (4)使用正则表达式过滤传入的参数。

    (5)JSP中调用该函数检查是否包函非法字符或JSP页面判断代码。JSP参考JSP使用过滤器防止SQL注入

  • 相关阅读:
    pandas--对axis=0,axis=1的理解
    启动secondarynamenode时报错
    5月27日经历问题(在有框架的情况下从无到有增加一套功能)
    5.21工作记录(修改页面跳转,去掉多余的js;增加图片清除功能)
    工作记录520
    5月14日经历问题
    idea快捷键
    Linux下常用redis指令
    初识lunix
    Redis
  • 原文地址:https://www.cnblogs.com/luohanguo/p/9122398.html
Copyright © 2011-2022 走看看