我正在使用Wordpress作为CMS开发应用程序.
我有一个包含大量输入字段的表单,需要在存储到数据库之前进行清理.
我想防止SQL注入,注入javascript和PHP代码以及其他有害代码.
目前我正在使用自己的方法来清理数据,但我觉得使用WP使用的功能可能会更好.
我已经看过Wordpress 中的数据验证,但我不确定我应该使用多少这些函数,以及按什么顺序.任何人都可以告诉WP功能最好用吗?
目前我通过执行以下操作"清理"我的输入:
因为带有重音符号的字符(é,ô,æ,ø,å)以有趣的方式存储在数据库中(即使我的表设置为ENGINE=InnoDB,DEFAULT CHARSET=utf8和COLLATE=utf8_danish_ci),我现在正在使用htmlentities转换可以具有重音的输入字段().
在创建SQL字符串以输入数据时,我使用mysql_real_escape_string().
我不认为这足以阻止攻击.因此,非常感谢建议改进.
我是编码和PHP的新手,因此我想了解清理表单数据的最佳方法是什么,以避免格式错误的页面,代码注入等.我在下面找到的示例脚本是一个很好的例子吗?
代码最初发布于http://codeassembly.com/How-to-sanitize-your-php-input/
/**
* Sanitize only one variable .
* Returns the variable sanitized according to the desired type or true/false
* for certain data types if the variable does not correspond to the given data type.
*
* NOTE: True/False is returned only for telephone, pin, id_card data types
*
* @param mixed The variable itself
* @param string A string containing the desired variable type
* @return The sanitized variable or true/false
*/
function sanitizeOne($var, $type)
{ …Run Code Online (Sandbox Code Playgroud) 我正在尝试清理涉及用户输入的字符串,而不必在可能的情况下手动制作我自己的可能错误的正则表达式,但是,如果这是唯一的方式我也会感激如果有人能指出我正确的方向正则表达式不太可能遗漏任何东西.Rails中有许多方法可以让你输入本机SQL命令,人们如何逃避用户输入?
我问的问题很广泛,但在我的特殊情况下,我正在使用Postgres数据库中的一个专栏,据我所知,Rails本身并不理解tsvector,它包含纯文本搜索信息.Rails能够写入和读取它,就像它是一个字符串一样,但是,与字符串不同,当我在模型中执行vector =之类的事情时,它似乎并没有自动转义它.
例如,当我做model.name ='::',其中name是一个字符串,它工作正常.当我做model.vector ='::'时出错了:
ActiveRecord::StatementInvalid: PGError: ERROR: syntax error in tsvector: "::"
"vectors" = E'::' WHERE "id" = 1
Run Code Online (Sandbox Code Playgroud)
这似乎是由于缺少分号的转义而导致的问题,我可以手动设置vector ='''罚款.
我也有一个好主意,也许我可以称之为:
ActiveRecord::Base.connection.execute "UPDATE medias SET vectors = ? WHERE id = 1", "::"
Run Code Online (Sandbox Code Playgroud)
但是,这种语法不起作用,因为原始SQL命令无法通过使用?来查找转义和输入字符串的方法.标记.
这与我用任何类型的用户输入调用connection.execute同样的问题,因为它归结为清理字符串,但我似乎无法找到任何方法手动调用Rails的SQL字符串清理方法.有人可以提供任何建议吗?
现在我们正在使用sanitize gem:https://github.com/rgrove/sanitize
问题是如果你输入" hello & world"sanitize将数据保存在DB中:
hello & world
Run Code Online (Sandbox Code Playgroud)
你怎么能将白名单列入白名单&.我们希望清理删除所有可能的恶意html和JS /脚本标记.但是我们可以使用&符号.
想法?谢谢
我知道我可以strip_tags在视图中使用ActionView帮助器方法来清理输出,但是在将用户输入保存到我的数据库之前,清除用户输入的最佳方法是什么?我应该找到一种方法在我的控制器中包含视图助手并重用strip_tags方法吗?我认为rails会在全球范围内提供一些类似的东西.
今天我遇到了一个小问题,当时我试图使用sanitize并截断它们来为我的博客创建一个摘录.每个方法本身都有效,但是一起使用它只会截断.我尝试了这两种语法(前者在一篇名为"Six Ruby on Rails Tips&Tricks"的博文中被推荐):
<%= truncate(sanitize(post.content), length: 580) %>
<%= sanitize(truncate(post.content, length: 580, separator: '<p>')) %>
Run Code Online (Sandbox Code Playgroud)
然后我尝试将truncate放在控制器中,并在视图中清理该对象,但仍然没有.
最后我让它像这样工作:
<%= sanitize(post.content.truncate(580, separator: '</p>')) %>
Run Code Online (Sandbox Code Playgroud)
我想知道的是,当我用另一种方法包装方法时,为什么它不起作用?我尝试过的最后一种方式有什么不同?
TIA'bondibox'
我有一个具有指定值的控制器:
$scope.post = 'please visit http://stackoverflow.com quickly';
Run Code Online (Sandbox Code Playgroud)
我的html中有一些文字:
<p>{{post}}</p>
Run Code Online (Sandbox Code Playgroud)
我想创建一个url的可点击链接(用锚标签包围它).
我试图将我的HTML更改为:
<p ng-bind-html="post | createAnchors"></p>
Run Code Online (Sandbox Code Playgroud)
以下是该问题的简化示例:
问题是,我怎样才能逃脱整个帖子文本,除了链接,它将被锚标签包围??
我的注册表单中有一个name字段,其中包含一个字段,它将存储在数据库中的一个字段中user_name varchar(20).很明显,如果我使用以下代码验证此字段,我应验证用户输入:
<?php
if(emptiy($_pos['name']) || strlen($_post['name'])>20)
//send an not valid input error
else{
$name=htmlspcialchars($_post['name']);
//check for sql injection;
//insert name into database;}
?>
Run Code Online (Sandbox Code Playgroud)
如果用户插入一个名称,如<i> some one </i>字符串长度为17,那么else部分将performe和名称将是<i> some one </i>长度为28,这将导致插入到db.in这次,如果我向用户发送错误,他/他她的投入太长,他会感到困惑.我该怎么办?什么是最好的方法?
我试图在Rails中转义用户生成的内容.我使用raw with sanitize和raw helpers来过滤这样的内容:
raw(sanitize(code, :tags => ['<', 'h2','h3','p','br','ul','ol','li','code','pre','a'] ))
Run Code Online (Sandbox Code Playgroud)
内容中允许提及的标签列表.
问题是当我尝试用这样的SQL查询测试它时:
mysql -u sat -p -h localhost database < data.sql
Run Code Online (Sandbox Code Playgroud)
在pre和code块中,它会删除小于(<)符号后的所有内容.
请帮我弄清楚这样做的方法.
像Medium这样的许多编辑都提供格式化.从我在DOM中看到的,它只是添加HTML.但是,如何在不丢失用户应用的格式的情况下清理此类输入?
例如,点击粗体添加:
<strong class="markup--strong markup--p-strong">text</strong>
但如果用户自己输入,则不想渲染.那有什么不同呢?如果您使用markdown进行样式但也不允许用户输入自己的markdown但只能通过浏览器访问它,那也会有所不同吗?
我能想到的一种方法是,逃避每个HTML特殊字符,但这看起来很奇怪.据我所知,只有在输出内容时才对内容进行消毒