Php 在数组中有HTML标记可以吗(有被黑客攻击的风险吗)?

Php 在数组中有HTML标记可以吗(有被黑客攻击的风险吗)?,php,arrays,Php,Arrays,我有以下数组: 'tagline_p' => "I'm a <a href='#showcase'>multilingual web</a> developer, designer and translator. I'm here to <a href='#contact'>help you</a> reach a worldwide audience.", 'tagline\u p'=>“我是一名开发人员、设计师和翻译人员。我来这里是为了

我有以下数组:

'tagline_p' => "I'm a <a href='#showcase'>multilingual web</a> developer, designer and translator. I'm here to <a href='#contact'>help you</a> reach a worldwide audience.",
'tagline\u p'=>“我是一名开发人员、设计师和翻译人员。我来这里是为了接触全世界的观众。”,
我是否应该避开数组中的HTML标记以避免对我的站点进行黑客攻击?(如何逃离他们?)

或者可以在数组中包含HTML标记吗?

(使用
htmlspecialchars
或转义HTML。)


如果数组是动态生成的,那么只要限制来自用户的标记和属性集,就可以使用HTML标记。例如,不允许使用
,也不允许使用类似于
onmouseover

的事件处理程序。只有当它包含用户输入时才会出现问题。你知道你在数组中放了什么,并且相信它。但是你不知道用户在传递什么,也不要相信这一点

所以在这种特殊情况下,不需要逃跑。但是一旦涉及到用户输入,您就应该退出输入

危险的不是HTML本身,而是用户可以传递的HTML类型,比如允许他们执行Javascript的脚本标记

添加

请注意,最好的做法是仅在输出时转义,而不是在输入时转义。输出是数据可能造成损害的地方,因此您希望始终如一地避免这种情况。这样,您就不必确保所有输入都已转义


这样,在将数据输出到可能应用不同规则的不同格式时就不会出现问题。如果不需要将内容输出为html,则不必使用
stripslashes()
htmlspecialchars\u decode()

可以将数据存储在数组中

您只需要在将标记输出到HTML上下文中时转义标记,并且您不信任它,或者您不希望对HTML进行解释


您必须以适当的方式将数据转义到您要发送的位置;对于HTML,如果您不想将其读取为HTML,则可以使用htmlspecialchars(),同样,如果您将其放入SQL语句中,并且不想将其读取为SQL,则可以使用mysql\u real\u escape\u string()等。

这取决于HTML如何进入数组。如果是你硬编码的,可能没问题。如果它来自一个用户,那么,所有的用户输入都是可疑的——HTML更难清理


真正的问题可能是“为什么要将HTML放入数组?”。如果是静态文本,请将其放在模板文件中的某个位置。

当用户输入HTML时(因此不安全),您应该转义HTML,然后在站点中显示该HTML。如果是你写的,不需要任何逃避


如果您确实需要转义html,您应该在将其显示在站点上之前进行转义。当您只是拖着数据四处走动时,不需要转义数据(就像您使用该数组时所做的那样)。您可以使用该函数转义HTML。

创建一个允许的标记数组,并使用
带标记($input\u array[$key],$ALLOWED\u tags)

或者做一个这样的函数

function sanitize_input($allowable_tags='<br><b><strong><p>')
{                   
    $input_array = $input;
    foreach ($input as $key=>$value){
   if(!empty($value)) {
    $input_array[$key] = strip_tags($input_array[$key],$allowable_tags);
   }
 }
 return $input_array;

}
函数清理输入($allowed_tags='
) { $input_数组=$input; foreach($key=>$value的输入){ 如果(!空($value)){ $input_数组[$key]=条带标签($input_数组[$key],$ALLOWED_标签); } } 返回$input_数组; }
或插入SQL语句。@dnagirl标记行\u p重复3次(3种不同的语言)。不包含锚定标记的唯一方法是将数组拆分为2:tagline_p1 tagline_p2 tagline_p3(我不知道是否有更好的选项)。@janoChen:如果您的站点将是多语言的,您可能想看看i18n包。这是PHP中gettext的一个很好的描述