如何防止在PHP代码注入攻击?(How to prevent code injection atta

2019-06-17 19:55发布

我有点糊涂了,有这么多的功能在PHP中,有的利用这一点,一些使用。 有些人使用: htmlspecialchars() htmlentities() strip_tags()

这是正确的和你是什么人通常使用?

这是正确的(告诉我一个更好的,如果有的话):

$var = mysql_real_escape_string(htmlentities($_POST['username']));

这条线可以防止MySQL的注入和XSS攻击?

顺便说一下,还有没有其他的事情,我需要注意,除了XSS攻击和MySQL注入?

编辑

总之:

如果我想插入串到数据库中,我并不需要使用htmlentities ,只需使用mysql_real_escape_string 。 当显示的数据,使用htmlentities()是你一切意味着?

总结:

  • mysql_real_escape_string当插入到数据库中使用
  • htmlentities()的数据输出到网页时使用
  • htmlspecialchars()使用时?
  • strip_tags()使用时?
  • addslashes()使用时?

有人可以在问号填?

Answer 1:

  • mysql_real_escape_string当插入到数据库中使用
  • htmlentities()的数据输出到网页时使用
  • htmlspecialchars()使用时?
  • strip_tags()使用时?
  • addslashes()使用时?

用htmlspecialchars()一起使用时?

htmlspecialchars是大致相同htmlentities 。 区别:字符编码。

两个编码控制字符,如<>&等用于打开标签等htmlentities也编码从像元音变音,欧元符号和的其他文字字符。 如果你的网站是UTF,使用htmlspecialchars()否则使用htmlentities()

用strip_tags()一起使用时?

htmlspecialchars / entities编码特殊字符,所以他们显示,但没有解释strip_tags删除它们。

在实践中,这取决于你需要做什么。

举个例子:你已经编写了一个论坛,并为用户提供一个文本字段,以便他们可以发布的东西。 恶意的人只是尝试:

pictures of <a href="javascript:void(window.setInterval(function () {window.open('http://evil.com');}, 1000));">kittens</a> here

如果你什么都不做,该链接将显示与该链接上点击的受害者获得大量的弹出式窗口。

如果您htmlentity / htmlspecialchar你的输出,该文本将在那里原样。 如果你strip_tag它,它只是删除标记,并显示:

pictures of kittens here

有时你可能想的混合物,留下有一些标签,像<b> strip_tags可以在那里留有一定的标记)。 这是不安全的太多,所以最好使用对XSS一些完全成熟的库。

和addslashes

引用一个旧版本的PHP手册 :

返回与反斜线的字符串前在数据库查询等被引用需要的字符这些字符是单引号('),双引号(“),反斜线()和NUL( 字节)。

一个例子使用addslashes()的是,当你将数据输入到数据库中。 例如,插入名字O'reilly的到数据库中,你需要逃脱它。 它的高度recommeneded使用DBMS特定的逃生功能(如mysqli_real_escape_string()为MySQL或pg_escape_string()PostgreSQL的),但如果DBMS您正在使用简化版,有一个逃生功能和DBMS使用\转义特殊字符,你可以使用此功能。

在目前的版本是不同的措词。



Answer 2:

我认为这个快速清单:

  • 始终使用HTTPS,而不HTTPS网站是完全加密 。 不,客户端加密的东西,送他们将无法正常工作,想想吧。 无效的HTTPS证书,也会让你容易受到MITM攻击 。 只要使用让我们加密,如果您不能负担的证书。
  • 始终使用htmlspecialchars()上的任何输出从你的PHP代码,也就是或包含用户输入 。 大多数模板引擎帮助你做到这一点很容易。
  • 使用HTTP-仅标志在你php.ini以防止脚本访问你的cookies
  • 防止会话相关的问题
    • 切勿让用户PHPSESSID (会话ID)的饼干外 ,如果有人开始知道别人的会话ID,就可以简单地使用它来登录到他们的帐户
    • 要非常小心与Remember me的功能,也许表现出一点警告。
    • 刷新会话ID时,在用户登录(或其他适当的)
    • 超时不活动的会话
  • 永远不要相信一个cookie,它可以在任何时刻改变,删除,修改和创建一个脚本/用户
  • 防止SQL相关的问题
    • 始终使用准备好的语句 。 准备语句使用户输入要被分别通过,并防止SQL注入
    • 使你的代码抛出一个异常时,它失败。 有时候,你的SQL服务器可能会因为某些原因,像图书馆PDO在默认情况下忽略了错误,并在日志中记录警告。 这将导致你从数据库中获取到的是null的变量,这取决于你的代码,这可能会导致安全问题。
    • 像一些图书馆PDO 仿真预处理语句。 把它们关掉。
    • 使用UTF-8编码,你的数据库,它允许你存储几乎任何字符,避免编码相关的攻击
    • 从不将任何东西到您的查询 。 喜欢的东西$myquery = "INSERT INTO mydb.mytable (title) VALUES(" . $user_input . ")"几乎意味着你有一个SQL注入巨大的安全隐患。
  • 存储在随机,无扩展名的文件名上传的文件。 如果用户上传一个文件.php则文件扩展名每当文件,它执行它,使用户能够执行一些后端代码代码加载
  • 确保你不容易受到CSRF攻击 。
  • 随时更新你的PHP副本,以确保最新的安全补丁和性能改进


Answer 3:

否则你会碰到,你要处理的真实数据情况 - 只有当它进入它需要被编码的系统编码的点数据。

对于SQL注入-用作描述的约束变量我怎么能防止在PHP中SQL注入? (它谈论准备好的语句,但它是给你的保护,而不是准备绑定)。

对于XSS - 如果你在点写入HTML已指定HTML或文本。 在您生成文档点使用ヶ辆。 我会避免存储在表单中的数据库中的数据(除了可能在写稀土读常系统中CPU的性能/磁盘访问时间已逐渐成为与问题 - 那么我将有一个raw_和列的html_版本...或者只是使用memcached的或类似)。

如果你是让用户输入网址,那么你就需要更加小心,因为javascript:do_evil()是一个有效的URI,将执行(例如,作为一个点击后链接或(在某些浏览器)的图像的src一个href那只是加载)。



Answer 4:

htmlspecialchars()变成&'"< ,和>成HTML实体格式( &amp;&quot;等)

htmlentities()关闭所有适用的字符成HTML格式。

strip_tags()删除所有HTML和PHP标记。

无论htmlspecialchars()htmlentities()需要说明引号应该如何处理的可选参数。 具体请参阅PHP手册。

strip_tags()函数将表明不应该被剥夺什么标签的可选参数。

 $var = strip_tags ($var, '<p><br />');

strip_tags()函数将删除甚至无效的HTML标签,这可能会导致问题。 例如, strip_tags()将抽出了所有它认为的代码是一个HTML标签,即使它的格式不正确的,像

<b I forgot to close the tag.


Answer 5:

你只需要插入到数据库,并htmlentites显示HTML时用于函数mysql_escape_string()。 这是足够的,如果你想防止简单的注入攻击,但目前还没有疑问,你应该知道开发一个web应用程序,另一个主要的一个是跨站请求伪造时的许多其他安全问题。



Answer 6:

我不会用ヶ辆插入数据时到数据库或查询数据库()。 如果您在数据库中的数据被存储为实体,即数据则只有的东西,了解HTML实体有用。

你必须使用不同的逃逸机制,不同类型的输出,如SQL - mysql_real_escape_string() ,HTML - ヶ辆()或用htmlspecialchars() - ,壳牌()escapeshellarg 。 这是因为有“危险”的人物是为每一个不同的 - 没有一个神奇的方式,你可以做任何数据安全的任何输出介质。



Answer 7:

看看这个网站PHP安全联盟 。 我发现它是对PHP安全(SQL注入和XSS在内)的整体概况的好发部位。



Answer 8:

我知道这是一个老问题,但时下最投票的答案可能会误导对初学者。

2017年

  1. 你应该永远使用mysql_real_escape_string。 即使mysqli_real_escape_string太弱,无法保护你的数据库从SQL注入。 取而代之的是,你应该使用PDO,以及类似的技术。 (见该指南 )

  2. XSS(在这里我的意思是: strip_tags() addslashes() htmlspecialchars() htmlentities() -这里最投票的答案仍然是正确的,但我会建议阅读这篇文章



文章来源: How to prevent code injection attacks in PHP?