3

我是 Ruby on Rails 的新手,我正在使用 form_helper 来创建和更新记录。在下面的表格中,我正在收集信息以保存用户可以创建的地图的数据。:name 字段是用户赋予地图的名称。它被保存到 MySQL 表的一个字段中,即 varchar(255)。

如果我将地图命名为“John's Map”,它在数据库和视图中都显示为

    John's Map 

如何防止这种情况发生,我的代码是否容易受到这种方法的 SQL 注入影响?

我看到了一些与 Python 和 PHP 相关的响应,但我不确定 Rails。我正在使用 Virtualmin 创建表,所以任何让我在 Virtualmin 中解决问题的回复都将不胜感激。谢谢!

从视图

    <% form_for @newsavedmap, :html=>{:id=>'createaMap'} do |f| %>
    <%= f.error_messages %>

    <% if params[:newsavedmap_id] %>
<%= f.text_field :name, {:id=>"savemap_name", :size=>30, :value=> @newsavedmap.name }%></p>
    <% else %>
<%= f.text_field :name, {:id=>"savemap_name", :size=>30, :value=>"New Map"}%></p>
    <% end %>

数据库表详细信息

    DROP TABLE IF EXISTS `newsavedmaps`;
    /*!40101 SET @saved_cs_client     = @@character_set_client */;
    /*!40101 SET character_set_client = utf8 */;
    CREATE TABLE `newsavedmaps` (
    FIELDSAREALLLISTEDHERE
    `name` varchar(255) DEFAULT NULL,
    ) ENGINE=InnoDB AUTO_INCREMENT=159 DEFAULT CHARSET=utf8;
    /*!40101 SET character_set_client = @saved_cs_client */;

数据库中的其他表显示撇号。例如,我有另一个如下所示的表单,当用户输入带有撇号的名称时,撇号在表中显示为撇号。

    <form id="createitem" action="/saveditems" method="post">
    <label for="saveditem_name">Item Title</label>
    <%= text_field :saveditem, :name %>

该表的结构:

    DROP TABLE IF EXISTS `saveditems`;
    /*!40101 SET @saved_cs_client     = @@character_set_client */;
    /*!40101 SET character_set_client = utf8 */;
    CREATE TABLE `saveditems` (
    FIELDSAREALLLISTEDHERE
    `name` varchar(255) NOT NULL, 
    ) ENGINE=MyISAM AUTO_INCREMENT=8418 DEFAULT CHARSET=latin1;
    /*!40101 SET character_set_client = @saved_cs_client */;

编辑 1

我用 ALTER TABLE newsavedmaps CONVERT TO CHARACTER SET latin1; 我的 newsavedmaps 表现在看起来像这样:

    DROP TABLE IF EXISTS `newsavedmaps`;
    /*!40101 SET @saved_cs_client     = @@character_set_client */;
    /*!40101 SET character_set_client = utf8 */;
    CREATE TABLE `newsavedmaps` (
    FIELDS ALL LISTED HERE
    ) ENGINE=InnoDB AUTO_INCREMENT=248 DEFAULT CHARSET=latin1;
    /*!40101 SET character_set_client = @saved_cs_client */;

撇号现在在数据库中正确显示,但它们仍然在视图中显示为奇怪的字符。有任何想法吗?这是否与此有关:https ://github.com/rails/rails/issues/9108

4

0 回答 0