Uniswap V3 pools allow for instantly calculating a Time Weighted Average Price (TWAP), whereas Uniswap V2 pools require a protocol to store data and wait to complete a price. When properly managed, it is harder to manipulate a Uniswap V3 price pool than a Uniswap V2 price pool. However, when not properly managed, it is easier to manipulate a Uniswap V3 price pool than a Uniswap V2 price pool.
TWAPs are prices averaged over time. To use a Uniswap V2 pool as an oracle, a protocol must store a price value (called a "cumulator"), wait some time, and then calculate a price using the stored cumulator value. This can complicate protocols. A keeper might have to wait to liquidate, or someone might have to run a bot to keep prices up to date. In Uniswap V3, the pool automatically stores cumulator values, so protocols can instantly calculate a TWAP at any time. Instant TWAPs make using Uniswap V3 as a price oracle simpler than using Uniswap V2.
When someone provides liquidity to Uniswap V2, it is available at all price ranges. The tradeoff for having liquidity at all possible prices is that the liquidity is shallow, and the price moves a lot when someone makes a trade. This makes it easier to manipulate a Uniswap V2 price.
Uniswap V3 allows liquidity providers to concentrate liquidity. Liquidity providers can choose the price range for their liquidity. Trading fees incentivize liquidity providers to add liquidity in useful ranges for the pool. The price moves more slowly through concentrated ranges, making it difficult to manipulate.
Concentrating liquidity is risky for prices. If the price moves outside the range of liquidity, then the price will move very, very quickly when someone trades in the pool. An attacker can use this to manipulate the price while spending almost nothing.
Uniswap V3 provides instant TWAPs and deep liquidity, which is more costly to manipulate. However, if the liquidity is not managed correctly, Uniswap V3 prices are easy to attack.