在不限制用户输入的情况下防止代码注入?

时间:2014-05-06 16:49:03

标签: security sql-injection code-injection

好的,所以我知道输入清理/检查的方法,比如使用白名单,黑名单,mysqli_escape(或PHP中的任何内容),但是说你有一个网站,出于某种原因,而不是用户在文件中上传代码(HTML,Javascript,C等),他们直接提交代码段。但是,像任何优秀的Web管理员一样,您不希望允许SQL或其他类型的代码注入。

根据我的理解,使用像mysql_escape这样的东西会逃避所有特殊字符,关键字等,所以我们已经覆盖了那里。但是,HTML,Javascript,PHP和其他代码呢?

我的想法是,如果文本,即使是代码,也存储在数据库中,这并不意味着它只是自己执行。对于HTML,Javascript或PHP,只有在选择列值并用于生成网页后才会执行。那么,在提供页面以防止代码执行时,是否足以做html_escape?我想你可以在将数据放入数据库之前使用html_escape,但是如果使用Web浏览器之外的其他内容检索代码片段呢?例如,如果网站的主要用途是代码版本控制系统并且代码需要保持不变,该怎么办?

4 个答案:

答案 0 :(得分:1)

如果您尝试将转义的文本放入数据库,您会发现巨大的伤害。相反,存储完全他们输入的内容,并确保在呈现时正确包装它。有关从编码标准处理此问题的合理方法,请参阅Joel on Software

另外,请避免手动调用mysql_escape。您应该使用prepare创建带有占位符的SQL语句,例如"INSERT INTO code (texty_part) VALUES (?)",然后运行$sth->execute($texty_part)进行插入。

答案 1 :(得分:1)

mysql_real_escape_string转义了与MySQL string literals相关的特殊字符:

  • \,退格字符
  • ',单引号字符
  • ",双引号字符
  • \0,NUL character
  • \n,换行符
  • \r,回车字符
  • ^Z,Control-Z,替换字符

但是,无论输入数据实际表示什么,它都会平均处理任何数据。 mysql_real_escape_string仅考虑有效的字符编码。

关于您的关注:HTML,JavaScript和PHP都是解释型语言,需要解释器才能进行解释/执行。至于HTML和JavaScript,它通常是一个Web浏览器。至于PHP,它通常是Web服务器上的PHP运行时。但MySQL服务器只能解释一种语言:SQL方言也称为MySQL。

这也是为什么在将数据插入数据库时​​不会处理MySQL之外的其他语言的原因。也不会逃避/编码/清理/ 插入首选动词 - 这里 HTML,也不会使用JavaScript,也不会使用PHP,也不会使用MySQL以外的任何其他语言。

当您将数据传递给可能解释该特定语言的组件时,您只能转义/编码/清理/ insert-preferred-verb-here 这些语言。

答案 2 :(得分:0)

  

据我所知,使用mysql_escape之类的东西会逃避所有特殊字符,关键字等。

你理解错了。 “mysql_escape”不会生成“所有特殊字符,关键字等” “无害”,就像你(在大量PHP用户之后)相信的那样。这种诚实功能的目的完全不同。

  

对于HTML,Javascript或PHP,只有在选择了列值并用于生成网页后才会执行。

除非你明确地调用eval()

,否则不会执行PHP
  

我想在将数据放入数据库之前你可以使用html_escape,但是如果使用Web浏览器之外的其他内容检索代码片段呢?

html_escape它然后发送到浏览器呢?

答案 3 :(得分:-1)

两者都做 1.输入Sanitize。 2.在显示之前输出编码